diff options
46 files changed, 166 insertions, 12023 deletions
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html index c0b0c7a6f..d917913aa 100644 --- a/doc/ScintillaDoc.html +++ b/doc/ScintillaDoc.html @@ -2463,10 +2463,7 @@ struct Sci_TextToFind { <code>fontName</code> is a zero terminated string holding the name of a font. Under Windows, only the first 32 characters of the name are used and the name is not case sensitive. For internal caching, Scintilla tracks fonts by name and does care about the casing of font names, - so please be consistent. On GTK+ 2.x, either GDK or Pango can be used to display text. - Pango antialiases text, works well with Unicode and is better supported in recent versions of GTK+ - but GDK is faster. - Prepend a '!' character to the font name to use Pango.</p> + so please be consistent. On GTK+, Pango is used to display text.</p> <p>Sizes can be set to a whole number of points with <code>SCI_STYLESETSIZE</code> or to a fractional point size in hundredths of a point with <code>SCI_STYLESETSIZEFRACTIONAL</code> by multiplying the size by 100 (<code>SC_FONT_SIZE_MULTIPLIER</code>). @@ -4877,6 +4874,7 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){ <a class="message" href="#SCI_SHOWLINES">SCI_SHOWLINES(int lineStart, int lineEnd)</a><br /> <a class="message" href="#SCI_HIDELINES">SCI_HIDELINES(int lineStart, int lineEnd)</a><br /> <a class="message" href="#SCI_GETLINEVISIBLE">SCI_GETLINEVISIBLE(int line)</a><br /> + <a class="message" href="#SCI_GETALLLINESVISIBLE">SCI_GETALLLINESVISIBLE</a><br /> <a class="message" href="#SCI_SETFOLDLEVEL">SCI_SETFOLDLEVEL(int line, int level)</a><br /> <a class="message" href="#SCI_GETFOLDLEVEL">SCI_GETFOLDLEVEL(int line)</a><br /> <a class="message" href="#SCI_SETFOLDFLAGS">SCI_SETFOLDFLAGS(int flags)</a><br /> @@ -4912,9 +4910,14 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){ <p><b id="SCI_SHOWLINES">SCI_SHOWLINES(int lineStart, int lineEnd)</b><br /> <b id="SCI_HIDELINES">SCI_HIDELINES(int lineStart, int lineEnd)</b><br /> <b id="SCI_GETLINEVISIBLE">SCI_GETLINEVISIBLE(int line)</b><br /> + <b id="SCI_GETALLLINESVISIBLE">SCI_GETALLLINESVISIBLE</b><br /> The first two messages mark a range of lines as visible or invisible and then redraw the - display. The third message reports on the visible state of a line and returns 1 if it is - visible and 0 if it is not visible. These messages have no effect on fold levels or fold + display. + <code>SCI_GETLINEVISIBLE</code> reports on the visible state of a line and returns 1 if it is + visible and 0 if it is not visible. + <code>SCI_GETALLLINESVISIBLE</code> returns 1 if all lines are visible and 0 + if some lines are hidden. + These messages have no effect on fold levels or fold flags. The first line can not be hidden.</p> <p><b id="SCI_SETFOLDLEVEL">SCI_SETFOLDLEVEL(int line, int level)</b><br /> diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index b9423780e..4a7643079 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -384,6 +384,7 @@ <td>Occam's Razor</td> <td>Ben Bluemel</td> <td>David Wolfendale</td> + <td>Chris Angelico</td> </tr> </table> <p> @@ -400,7 +401,80 @@ </h3> <ul> <li> - Released 12 September 2011. + Released 16 September 2011. + </li> + <li> + To automatically discover the encoding of a file when opening it, SciTE can run a program set with command.discover.properties. + <a href="https://sourceforge.net/tracker/?func=detail&atid=352439&aid=3324341&group_id=2439">Feature #3324341.</a> + </li> + <li> + Cairo always used for drawing on GTK+. + </li> + <li> + The set of properties files imported by SciTE can be controlled with the properties imports.include and imports.exclude. + The import statement has been extended to allow "import *". + The properties files for some languages are no longer automatically loaded by default. The properties files affected are + avenue, baan, escript, lot, metapost, and mmixal. + </li> + <li> + C++ lexer fixed a bug with raw strings being recognised too easily. + <a href="https://sourceforge.net/tracker/?func=detail&atid=102439&aid=3388122&group_id=2439">Bug #3388122.</a> + </li> + <li> + LaTeX lexer improved with more states and fixes to most outstanding bugs. + <a href="https://sourceforge.net/tracker/?func=detail&atid=102439&aid=1493111&group_id=2439">Bug #1493111.</a> + <a href="https://sourceforge.net/tracker/?func=detail&atid=102439&aid=1856356&group_id=2439">Bug #1856356.</a> + <a href="https://sourceforge.net/tracker/?func=detail&atid=102439&aid=3081692&group_id=2439">Bug #3081692.</a> + </li> + <li> + Lua lexer updates for Lua 5.2 beta with goto labels and "\z" string escape. + <a href="https://sourceforge.net/tracker/?func=detail&atid=352439&aid=3386330&group_id=2439">Feature #3386330.</a> + </li> + <li> + Perl string styling highlights interpolated variables. + <a href="https://sourceforge.net/tracker/?func=detail&atid=352439&aid=3394258&group_id=2439">Feature #3394258.</a> + <a href="https://sourceforge.net/tracker/?func=detail&atid=102439&aid=3076629&group_id=2439">Bug #3076629.</a> + </li> + <li> + Perl lexer updated for Perl 5.14.0 with 0X and 0B numeric literal prefixes, break keyword and "+" supported in subroutine prototypes. + <a href="https://sourceforge.net/tracker/?func=detail&atid=352439&aid=3388802&group_id=2439">Feature #3388802.</a> + </li> + <li> + Perl bug fixed with CRLF line endings. + </li> + <li> + Markdown lexer fixed to not change state with "_" in middle of word. + <a href="https://sourceforge.net/tracker/?func=detail&atid=102439&aid=3398184&group_id=2439">Bug #3398184.</a> + </li> + <li> + Cocoa restores compatibility with OS X 10.5. + </li> + <li> + Mouse pointer changes over selection to an arrow near start when scrolled horizontally. + <a href="https://sourceforge.net/tracker/?func=detail&atid=102439&aid=3389055&group_id=2439">Bug #3389055.</a> + </li> + <li> + Indicators that finish at the end of the document no longer expand when text is appended. + <a href="https://sourceforge.net/tracker/?func=detail&atid=102439&aid=3378718&group_id=2439">Bug #3378718.</a> + </li> + <li> + SparseState merge fixed to check if other range is empty. + <a href="https://sourceforge.net/tracker/?func=detail&atid=102439&aid=3387053&group_id=2439">Bug #3387053.</a> + </li> + <li> + On Windows, autocompletion lists will scroll instead of document when mouse wheel spun. + <a href="https://sourceforge.net/tracker/?func=detail&atid=352439&aid=3403600&group_id=2439">Feature #3403600.</a> + </li> + <li> + SciTE performs more rapid polling for command completion so will return faster and report more accurate times. + </li> + <li> + SciTE resizes panes proportionally when switched between horizontal and vertical layout. + <a href="https://sourceforge.net/tracker/?func=detail&atid=352439&aid=3376784&group_id=2439">Feature #3376784.</a> + </li> + <li> + SciTE on GTK+ opens multiple files into a single instance more reliably. + <a href="https://sourceforge.net/tracker/?func=detail&atid=102439&aid=3363754&group_id=2439">Bug #3363754.</a> </li> </ul> <h3> diff --git a/doc/ScintillaRelated.html b/doc/ScintillaRelated.html index 7c6e6a486..51d710d5d 100644 --- a/doc/ScintillaRelated.html +++ b/doc/ScintillaRelated.html @@ -29,7 +29,7 @@ Ports and Bindings of Scintilla </h3> <p> - <a href="https://metacpan.org/module/AZAWAWI/Wx-Scintilla-0.21_03/lib/Wx/Scintilla.pm">Wx::Scintilla</a> + <a href="https://metacpan.org/module/Wx::Scintilla">Wx::Scintilla</a> is a Perl Binding for Scintilla on wxWidgets. </p> <p> diff --git a/doc/index.html b/doc/index.html index 277165c19..020959408 100644 --- a/doc/index.html +++ b/doc/index.html @@ -9,7 +9,7 @@ <meta name="keywords" content="Scintilla, SciTE, Editing Component, Text Editor" /> <meta name="Description" content="www.scintilla.org is the home of the Scintilla editing component and SciTE text editor application." /> - <meta name="Date.Modified" content="20110912" /> + <meta name="Date.Modified" content="20110916" /> <style type="text/css"> #versionlist { margin: 0; @@ -56,7 +56,7 @@ </td> <td width="40%" align="right"> <font color="#FFCC99" size="3"> Release version 2.29<br /> - Site last modified September 12 2011</font> + Site last modified September 16 2011</font> </td> <td width="20%"> @@ -71,7 +71,7 @@ </tr> </table> <ul id="versionlist"> - <li>Version 2.29 fixes bugs.</li> + <li>Version 2.29 always draws with Cairo on GTK+.</li> <li>Version 2.28 allows translucent images in RGBA format to be used for margin markers and in autocompletion lists.</li> <li>Version 2.27 fixes incorrect colours on some versions of GTK+.</li> <li>Version 2.26 can highlight folding margin symbols for the current folding block. Experimental support for GTK+ 3.</li> diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx index 064d5161a..1e36989ad 100644 --- a/gtk/PlatGTK.cxx +++ b/gtk/PlatGTK.cxx @@ -31,9 +31,6 @@ to be used to get the glib libraries for linking, otherwise g_thread_init will fail */ #define USE_LOCK defined(G_THREADS_ENABLED) && !defined(G_THREADS_IMPL_NONE) -/* Use fast way of getting char data on win32 to work around problems - with gdk_string_extents. */ -#define FAST_WAY #include "Converter.h" @@ -43,10 +40,6 @@ #define IS_WIDGET_FOCUSSED(w) (GTK_WIDGET_HAS_FOCUS(w)) #endif -#define USE_CAIRO 1 - -#ifdef USE_CAIRO - static cairo_surface_t *CreateSimilarSurface(GdkWindow *window, cairo_content_t content, int width, int height) { #if GTK_CHECK_VERSION(2,22,0) return gdk_window_create_similar_surface(window, content, width, height); @@ -65,8 +58,6 @@ static cairo_surface_t *CreateSimilarSurface(GdkWindow *window, cairo_content_t #endif } -#endif - static GdkWindow *WindowFromWidget(GtkWidget *w) { #if GTK_CHECK_VERSION(3,0,0) return gtk_widget_get_window(w); @@ -75,10 +66,6 @@ static GdkWindow *WindowFromWidget(GtkWidget *w) { #endif } -#ifdef USE_CAIRO -#define DISABLE_GDK_FONT 1 -#endif - #ifdef _MSC_VER // Ignore unreferenced local functions in GTK+ headers #pragma warning(disable: 4505) @@ -147,41 +134,19 @@ class FontHandle { encodingType et; public: int ascent; -#ifndef DISABLE_GDK_FONT - GdkFont *pfont; -#endif PangoFontDescription *pfd; int characterSet; -#ifdef DISABLE_GDK_FONT FontHandle() : et(singleByte), ascent(0), pfd(0), characterSet(-1) { ResetWidths(et); } -#else - FontHandle(GdkFont *pfont_=0) { - et = singleByte; - ascent = 0; - pfont = pfont_; - pfd = 0; - characterSet = -1; - ResetWidths(et); - } -#endif FontHandle(PangoFontDescription *pfd_, int characterSet_) { et = singleByte; ascent = 0; -#ifndef DISABLE_GDK_FONT - pfont = 0; -#endif pfd = pfd_; characterSet = characterSet_; ResetWidths(et); } ~FontHandle() { -#ifndef DISABLE_GDK_FONT - if (pfont) - gdk_font_unref(pfont); - pfont = 0; -#endif if (pfd) pango_font_description_free(pfd); pfd = 0; @@ -319,11 +284,6 @@ void Palette::Allocate(Window &w) { paletteNew[iPal].blue = entries[iPal].desired.GetBlue() * (65535 / 255); paletteNew[iPal].pixel = entries[iPal].desired.AsLong(); } -#ifndef USE_CAIRO - gdk_colormap_alloc_colors(gtk_widget_get_colormap(PWidget(w)), - paletteNew, allocatedLen, FALSE, TRUE, - successPalette); -#endif for (iPal = 0; iPal < used; iPal++) { entries[iPal].allocated.Set(paletteNew[iPal].pixel); } @@ -332,117 +292,6 @@ void Palette::Allocate(Window &w) { #endif } -#ifndef DISABLE_GDK_FONT - -static const char *CharacterSetName(int characterSet) { - switch (characterSet) { - case SC_CHARSET_ANSI: - return "iso8859-*"; - case SC_CHARSET_DEFAULT: - return "iso8859-*"; - case SC_CHARSET_BALTIC: - return "iso8859-13"; - case SC_CHARSET_CHINESEBIG5: - return "*-*"; - case SC_CHARSET_EASTEUROPE: - return "*-2"; - case SC_CHARSET_GB2312: - return "gb2312.1980-*"; - case SC_CHARSET_GREEK: - return "*-7"; - case SC_CHARSET_HANGUL: - return "ksc5601.1987-*"; - case SC_CHARSET_MAC: - return "*-*"; - case SC_CHARSET_OEM: - return "*-*"; - case SC_CHARSET_RUSSIAN: - return "*-r"; - case SC_CHARSET_CYRILLIC: - return "*-cp1251"; - case SC_CHARSET_SHIFTJIS: - return "jisx0208.1983-*"; - case SC_CHARSET_SYMBOL: - return "*-*"; - case SC_CHARSET_TURKISH: - return "*-9"; - case SC_CHARSET_JOHAB: - return "*-*"; - case SC_CHARSET_HEBREW: - return "*-8"; - case SC_CHARSET_ARABIC: - return "*-6"; - case SC_CHARSET_VIETNAMESE: - return "*-*"; - case SC_CHARSET_THAI: - return "iso8859-11"; - case SC_CHARSET_8859_15: - return "iso8859-15"; - default: - return "*-*"; - } -} - -static bool IsDBCSCharacterSet(int characterSet) { - switch (characterSet) { - case SC_CHARSET_GB2312: - case SC_CHARSET_HANGUL: - case SC_CHARSET_SHIFTJIS: - case SC_CHARSET_CHINESEBIG5: - return true; - default: - return false; - } -} - -static void GenerateFontSpecStrings(const char *fontName, int characterSet, - char *foundary, int foundary_len, - char *faceName, int faceName_len, - char *charset, int charset_len) { - // supported font strings include: - // foundary-fontface-isoxxx-x - // fontface-isoxxx-x - // foundary-fontface - // fontface - if (strchr(fontName, '-')) { - char tmp[300]; - char *d1 = NULL, *d2 = NULL, *d3 = NULL; - strncpy(tmp, fontName, sizeof(tmp) - 1); - tmp[sizeof(tmp) - 1] = '\0'; - d1 = strchr(tmp, '-'); - // we know the first dash exists - d2 = strchr(d1 + 1, '-'); - if (d2) - d3 = strchr(d2 + 1, '-'); - if (d3 && d2) { - // foundary-fontface-isoxxx-x - *d2 = '\0'; - foundary[0] = '-'; - foundary[1] = '\0'; - strncpy(faceName, tmp, foundary_len - 1); - strncpy(charset, d2 + 1, charset_len - 1); - } else if (d2) { - // fontface-isoxxx-x - *d1 = '\0'; - strcpy(foundary, "-*-"); - strncpy(faceName, tmp, faceName_len - 1); - strncpy(charset, d1 + 1, charset_len - 1); - } else { - // foundary-fontface - foundary[0] = '-'; - foundary[1] = '\0'; - strncpy(faceName, tmp, faceName_len - 1); - strncpy(charset, CharacterSetName(characterSet), charset_len - 1); - } - } else { - strncpy(foundary, "-*-", foundary_len); - strncpy(faceName, fontName, faceName_len - 1); - strncpy(charset, CharacterSetName(characterSet), charset_len - 1); - } -} - -#endif - static void SetLogFont(LOGFONT &lf, const char *faceName, int characterSet, float size, int weight, bool italic) { memset(&lf, 0, sizeof(lf)); lf.size = size; @@ -549,176 +398,18 @@ void FontCached::ReleaseId(FontID fid_) { FontMutexUnlock(); } -#ifndef DISABLE_GDK_FONT -static GdkFont *LoadFontOrSet(const char *fontspec, int characterSet) { - if (IsDBCSCharacterSet(characterSet)) { - return gdk_fontset_load(fontspec); - } else { - return gdk_font_load(fontspec); - } -} -#endif - FontID FontCached::CreateNewFont(const FontParameters &fp) { - if (fp.faceName[0] == '!') { - PangoFontDescription *pfd = pango_font_description_new(); - if (pfd) { - pango_font_description_set_family(pfd, fp.faceName+1); - pango_font_description_set_size(pfd, pango_units_from_double(fp.size)); - pango_font_description_set_weight(pfd, static_cast<PangoWeight>(fp.weight)); - pango_font_description_set_style(pfd, fp.italic ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL); - return new FontHandle(pfd, fp.characterSet); - } + PangoFontDescription *pfd = pango_font_description_new(); + if (pfd) { + pango_font_description_set_family(pfd, + (fp.faceName[0] == '!') ? fp.faceName+1 : fp.faceName); + pango_font_description_set_size(pfd, pango_units_from_double(fp.size)); + pango_font_description_set_weight(pfd, static_cast<PangoWeight>(fp.weight)); + pango_font_description_set_style(pfd, fp.italic ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL); + return new FontHandle(pfd, fp.characterSet); } -#ifndef DISABLE_GDK_FONT - char fontset[1024]; - char fontspec[300]; - char foundary[50]; - char faceName[100]; - char charset[50]; - fontset[0] = '\0'; - fontspec[0] = '\0'; - foundary[0] = '\0'; - faceName[0] = '\0'; - charset[0] = '\0'; - - GdkFont *newid = 0; - // If name of the font begins with a '-', assume, that it is - // a full fontspec. - if (fontName[0] == '-') { - if (strchr(fontName, ',') || IsDBCSCharacterSet(characterSet)) { - newid = gdk_fontset_load(fontName); - } else { - newid = gdk_font_load(fontName); - } - if (!newid) { - // Font not available so substitute a reasonable code font - // iso8859 appears to only allow western characters. - newid = LoadFontOrSet("-*-*-*-*-*-*-*-*-*-*-*-*-iso8859-*", - characterSet); - } - return new FontHandle(newid); - } - - // it's not a full fontspec, build one. - - // This supports creating a FONT_SET - // in a method that allows us to also set size, slant and - // weight for the fontset. The expected input is multiple - // partial fontspecs seperated by comma - // eg. adobe-courier-iso10646-1,*-courier-iso10646-1,*-*-*-* - if (strchr(fontName, ',')) { - // build a fontspec and use gdk_fontset_load - int remaining = sizeof(fontset); - char fontNameCopy[1024]; - strncpy(fontNameCopy, fontName, sizeof(fontNameCopy) - 1); - char *fn = fontNameCopy; - char *fp = strchr(fn, ','); - for (;;) { - const char *spec = "%s%s%s%s-*-*-*-%0d-*-*-*-*-%s"; - if (fontset[0] != '\0') { - // if this is not the first font in the list, - // append a comma seperator - spec = ",%s%s%s%s-*-*-*-%0d-*-*-*-*-%s"; - } - - if (fp) - *fp = '\0'; // nullify the comma - GenerateFontSpecStrings(fn, characterSet, - foundary, sizeof(foundary), - faceName, sizeof(faceName), - charset, sizeof(charset)); - - g_snprintf(fontspec, - sizeof(fontspec) - 1, - spec, - foundary, faceName, - (weight > 400) ? "-bold" : "-medium", - italic ? "-i" : "-r", - size * 10, - charset); - - // if this is the first font in the list, and - // we are doing italic, add an oblique font - // to the list - if (italic && fontset[0] == '\0') { - strncat(fontset, fontspec, remaining - 1); - remaining -= strlen(fontset); - - g_snprintf(fontspec, - sizeof(fontspec) - 1, - ",%s%s%s-o-*-*-*-%0d-*-*-*-*-%s", - foundary, faceName, - (weight > 400) ? "-bold" : "-medium", - size * 10, - charset); - } - - strncat(fontset, fontspec, remaining - 1); - remaining -= strlen(fontset); - - if (!fp) - break; - - fn = fp + 1; - fp = strchr(fn, ','); - } - - newid = gdk_fontset_load(fontset); - if (newid) - return new FontHandle(newid); - // if fontset load failed, fall through, we'll use - // the last font entry and continue to try and - // get something that matches - } - - // single fontspec support - - GenerateFontSpecStrings(fontName, characterSet, - foundary, sizeof(foundary), - faceName, sizeof(faceName), - charset, sizeof(charset)); - - g_snprintf(fontspec, - sizeof(fontspec) - 1, - "%s%s%s%s-*-*-*-%0d-*-*-*-*-%s", - foundary, faceName, - (weight > 400) ? "-bold" : "-medium", - italic ? "-i" : "-r", - size * 10, - charset); - newid = LoadFontOrSet(fontspec, characterSet); - if (!newid) { - // some fonts have oblique, not italic - g_snprintf(fontspec, - sizeof(fontspec) - 1, - "%s%s%s%s-*-*-*-%0d-*-*-*-*-%s", - foundary, faceName, - (weight > 400) ? "-bold" : "-medium", - italic ? "-o" : "-r", - size * 10, - charset); - newid = LoadFontOrSet(fontspec, characterSet); - } - if (!newid) { - g_snprintf(fontspec, - sizeof(fontspec) - 1, - "-*-*-*-*-*-*-*-%0d-*-*-*-*-%s", - size * 10, - charset); - newid = gdk_font_load(fontspec); - } - if (!newid) { - // Font not available so substitute a reasonable code font - // iso8859 appears to only allow western characters. - newid = LoadFontOrSet("-*-*-*-*-*-*-*-*-*-*-*-*-iso8859-*", - characterSet); - } - return new FontHandle(newid); -#else return new FontHandle(); -#endif } Font::Font() : fid(0) {} @@ -744,14 +435,8 @@ namespace Scintilla { // On GTK+ 2.x, SurfaceID is a GdkDrawable* and on GTK+ 3.x, it is a cairo_t* class SurfaceImpl : public Surface { encodingType et; -#ifdef USE_CAIRO cairo_t *context; cairo_surface_t *psurf; -#else - GdkDrawable *drawable; - GdkGC *gc; - GdkPixmap *ppixmap; -#endif int x; int y; bool inited; @@ -869,14 +554,8 @@ void SurfaceImpl::SetConverter(int characterSet_) { } SurfaceImpl::SurfaceImpl() : et(singleByte), -#ifdef USE_CAIRO context(0), psurf(0), -#else -drawable(0), -gc(0), -ppixmap(0), -#endif x(0), y(0), inited(false), createdGC(false) , pcontext(0), layout(0), characterSet(-1) { } @@ -887,28 +566,14 @@ SurfaceImpl::~SurfaceImpl() { void SurfaceImpl::Release() { et = singleByte; -#ifndef USE_CAIRO - drawable = 0; -#endif if (createdGC) { createdGC = false; -#ifdef USE_CAIRO cairo_destroy(context); -#else - g_object_unref(gc); -#endif } -#ifdef USE_CAIRO context = 0; if (psurf) cairo_surface_destroy(psurf); psurf = 0; -#else - gc = 0; - if (ppixmap) - g_object_unref(ppixmap); - ppixmap = 0; -#endif if (layout) g_object_unref(layout); layout = 0; @@ -930,7 +595,6 @@ bool SurfaceImpl::Initialised() { void SurfaceImpl::Init(WindowID wid) { Release(); PLATFORM_ASSERT(wid); -#ifdef USE_CAIRO #if GTK_CHECK_VERSION(3,0,0) GdkWindow *drawable_ = gtk_widget_get_window(PWidget(wid)); #else @@ -946,7 +610,6 @@ void SurfaceImpl::Init(WindowID wid) { context = cairo_create(psurf); } createdGC = true; -#endif pcontext = gtk_widget_create_pango_context(PWidget(wid)); PLATFORM_ASSERT(pcontext); layout = pango_layout_new(pcontext); @@ -958,24 +621,14 @@ void SurfaceImpl::Init(SurfaceID sid, WindowID wid) { PLATFORM_ASSERT(sid); Release(); PLATFORM_ASSERT(wid); -#ifdef USE_CAIRO #if GTK_CHECK_VERSION(3,0,0) context = cairo_reference(reinterpret_cast<cairo_t *>(sid)); #else context = gdk_cairo_create(reinterpret_cast<GdkDrawable *>(sid)); #endif -#else - drawable = reinterpret_cast<GdkDrawable *>(sid); - gc = gdk_gc_new(drawable); -#endif pcontext = gtk_widget_create_pango_context(PWidget(wid)); layout = pango_layout_new(pcontext); -#ifdef USE_CAIRO cairo_set_line_width(context, 1); -#else - // Ask for lines that do not paint the last pixel so is like Win32 - gdk_gc_set_line_attributes(gc, 0, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER); -#endif createdGC = true; inited = true; } @@ -985,27 +638,15 @@ void SurfaceImpl::InitPixMap(int width, int height, Surface *surface_, WindowID Release(); SurfaceImpl *surfImpl = static_cast<SurfaceImpl *>(surface_); PLATFORM_ASSERT(wid); -#ifdef USE_CAIRO context = cairo_reference(surfImpl->context); -#else - PLATFORM_ASSERT(surfImpl->drawable); - gc = gdk_gc_new(surfImpl->drawable); -#endif pcontext = gtk_widget_create_pango_context(PWidget(wid)); PLATFORM_ASSERT(pcontext); layout = pango_layout_new(pcontext); PLATFORM_ASSERT(layout); -#ifdef USE_CAIRO if (height > 0 && width > 0) psurf = CreateSimilarSurface( WindowFromWidget(PWidget(wid)), CAIRO_CONTENT_COLOR_ALPHA, width, height); -#else - if (height > 0 && width > 0) - ppixmap = gdk_pixmap_new(surfImpl->drawable, width, height, -1); - drawable = ppixmap; -#endif -#ifdef USE_CAIRO cairo_destroy(context); context = cairo_create(psurf); cairo_rectangle(context, 0, 0, width, height); @@ -1013,19 +654,12 @@ void SurfaceImpl::InitPixMap(int width, int height, Surface *surface_, WindowID cairo_fill(context); // This produces sharp drawing more similar to GDK: //cairo_set_antialias(context, CAIRO_ANTIALIAS_NONE); -#endif -#ifdef USE_CAIRO cairo_set_line_width(context, 1); -#else - // Ask for lines that do not paint the last pixel so is like Win32 - gdk_gc_set_line_attributes(gc, 0, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER); -#endif createdGC = true; inited = true; } void SurfaceImpl::PenColour(ColourAllocated fore) { -#ifdef USE_CAIRO if (context) { ColourDesired cdFore(fore.AsLong()); cairo_set_source_rgb(context, @@ -1033,13 +667,6 @@ void SurfaceImpl::PenColour(ColourAllocated fore) { cdFore.GetGreen() / 255.0, cdFore.GetBlue() / 255.0); } -#else - if (gc) { - GdkColor co; - co.pixel = fore.AsLong(); - gdk_gc_set_foreground(gc, &co); - } -#endif } int SurfaceImpl::LogPixelsY() { @@ -1056,7 +683,6 @@ void SurfaceImpl::MoveTo(int x_, int y_) { y = y_; } -#ifdef USE_CAIRO static int Delta(int difference) { if (difference < 0) return -1; @@ -1065,10 +691,8 @@ static int Delta(int difference) { else return 0; } -#endif void SurfaceImpl::LineTo(int x_, int y_) { -#ifdef USE_CAIRO // cairo_line_to draws the end position, unlike Win32 or GDK with GDK_CAP_NOT_LAST. // For simple cases, move back one pixel from end. if (context) { @@ -1097,20 +721,12 @@ void SurfaceImpl::LineTo(int x_, int y_) { } cairo_stroke(context); } -#else - if (drawable && gc) { - gdk_draw_line(drawable, gc, - x, y, - x_, y_); - } -#endif x = x_; y = y_; } void SurfaceImpl::Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back) { -#ifdef USE_CAIRO PenColour(back); cairo_move_to(context, pts[0].x + 0.5, pts[0].y + 0.5); for (int i = 1;i < npts;i++) { @@ -1120,73 +736,31 @@ void SurfaceImpl::Polygon(Point *pts, int npts, ColourAllocated fore, cairo_fill_preserve(context); PenColour(fore); cairo_stroke(context); -#else - GdkPoint gpts[20]; - if (npts < static_cast<int>((sizeof(gpts) / sizeof(gpts[0])))) { - for (int i = 0;i < npts;i++) { - gpts[i].x = pts[i].x; - gpts[i].y = pts[i].y; - } - PenColour(back); - gdk_draw_polygon(drawable, gc, 1, gpts, npts); - PenColour(fore); - gdk_draw_polygon(drawable, gc, 0, gpts, npts); - } -#endif } void SurfaceImpl::RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back) { -#ifdef USE_CAIRO if (context) { -#else - if (gc && drawable) { -#endif -#ifdef USE_CAIRO cairo_rectangle(context, rc.left + 0.5, rc.top + 0.5, rc.right - rc.left - 1, rc.bottom - rc.top - 1); PenColour(back); cairo_fill_preserve(context); PenColour(fore); cairo_stroke(context); -#else - PenColour(back); - gdk_draw_rectangle(drawable, gc, 1, - rc.left + 1, rc.top + 1, - rc.right - rc.left - 2, rc.bottom - rc.top - 2); - PenColour(fore); - // The subtraction of 1 off the width and height here shouldn't be needed but - // otherwise a different rectangle is drawn than would be done if the fill parameter == 1 - gdk_draw_rectangle(drawable, gc, 0, - rc.left, rc.top, - rc.right - rc.left - 1, rc.bottom - rc.top - 1); -#endif } } void SurfaceImpl::FillRectangle(PRectangle rc, ColourAllocated back) { PenColour(back); -#ifdef USE_CAIRO if (context && (rc.left < maxCoordinate)) { // Protect against out of range cairo_rectangle(context, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top); cairo_fill(context); } -#else - if (drawable && (rc.left < maxCoordinate)) { // Protect against out of range - gdk_draw_rectangle(drawable, gc, 1, - rc.left, rc.top, - rc.right - rc.left, rc.bottom - rc.top); - } -#endif } void SurfaceImpl::FillRectangle(PRectangle rc, Surface &surfacePattern) { SurfaceImpl &surfi = static_cast<SurfaceImpl &>(surfacePattern); -#ifdef USE_CAIRO bool canDraw = surfi.psurf; -#else - bool canDraw = surfi.drawable; -#endif if (canDraw) { // Tile pattern over rectangle // Currently assumes 8x8 pattern @@ -1196,18 +770,9 @@ void SurfaceImpl::FillRectangle(PRectangle rc, Surface &surfacePattern) { int widthx = (xTile + widthPat > rc.right) ? rc.right - xTile : widthPat; for (int yTile = rc.top; yTile < rc.bottom; yTile += heightPat) { int heighty = (yTile + heightPat > rc.bottom) ? rc.bottom - yTile : heightPat; -#ifdef USE_CAIRO cairo_set_source_surface(context, surfi.psurf, xTile, yTile); cairo_rectangle(context, xTile, yTile, widthx, heighty); cairo_fill(context); -#else - gdk_draw_drawable(drawable, - gc, - static_cast<SurfaceImpl &>(surfacePattern).drawable, - 0, 0, - xTile, yTile, - widthx, heighty); -#endif } } } else { @@ -1236,8 +801,6 @@ void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAl } } -#ifdef USE_CAIRO - static void PathRoundRectangle(cairo_t *context, double left, double top, double width, double height, int radius) { double degrees = M_PI / 180.0; @@ -1254,45 +817,8 @@ static void PathRoundRectangle(cairo_t *context, double left, double top, double cairo_close_path(context); } -#else - -// Plot a point into a guint32 buffer symetrically to all 4 qudrants -static void AllFour(guint32 *pixels, int stride, int width, int height, int x, int y, guint32 val) { - pixels[y*stride+x] = val; - pixels[y*stride+width-1-x] = val; - pixels[(height-1-y)*stride+x] = val; - pixels[(height-1-y)*stride+width-1-x] = val; -} - -static guint32 u32FromRGBA(guint8 r, guint8 g, guint8 b, guint8 a) { - union { - guint8 pixVal[4]; - guint32 val; - } converter; - converter.pixVal[0] = r; - converter.pixVal[1] = g; - converter.pixVal[2] = b; - converter.pixVal[3] = a; - return converter.val; -} - -static unsigned int GetRValue(unsigned int co) { - return (co >> 16) & 0xff; -} - -static unsigned int GetGValue(unsigned int co) { - return (co >> 8) & 0xff; -} - -static unsigned int GetBValue(unsigned int co) { - return co & 0xff; -} - -#endif - void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill, ColourAllocated outline, int alphaOutline, int flags) { -#ifdef USE_CAIRO if (context && rc.Width() > 0) { ColourDesired cdFill(fill.AsLong()); cairo_set_source_rgba(context, @@ -1318,47 +844,6 @@ void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated cairo_rectangle(context, rc.left + 0.5, rc.top + 0.5, rc.right - rc.left - 1, rc.bottom - rc.top - 1); cairo_stroke(context); } -#else - if (gc && drawable && rc.Width() > 0) { - int width = rc.Width(); - int height = rc.Height(); - // Ensure not distorted too much by corners when small - cornerSize = Platform::Minimum(cornerSize, (Platform::Minimum(width, height) / 2) - 2); - // Make a 32 bit deep pixbuf with alpha - GdkPixbuf *pixalpha = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height); - - guint32 valEmpty = u32FromRGBA(0,0,0,0); - guint32 valFill = u32FromRGBA(GetRValue(fill.AsLong()), - GetGValue(fill.AsLong()), GetBValue(fill.AsLong()), alphaFill); - guint32 valOutline = u32FromRGBA(GetRValue(outline.AsLong()), - GetGValue(outline.AsLong()), GetBValue(outline.AsLong()), alphaOutline); - guint32 *pixels = reinterpret_cast<guint32 *>(gdk_pixbuf_get_pixels(pixalpha)); - int stride = gdk_pixbuf_get_rowstride(pixalpha) / 4; - for (int yr=0; yr<height; yr++) { - for (int xr=0; xr<width; xr++) { - if ((xr==0) || (xr==width-1) || (yr == 0) || (yr == height-1)) { - pixels[yr*stride+xr] = valOutline; - } else { - pixels[yr*stride+xr] = valFill; - } - } - } - for (int c=0;c<cornerSize; c++) { - for (int xr=0;xr<c+1; xr++) { - AllFour(pixels, stride, width, height, xr, c-xr, valEmpty); - } - } - for (int xr=1;xr<cornerSize; xr++) { - AllFour(pixels, stride, width, height, xr, cornerSize-xr, valOutline); - } - - // Draw with alpha - gdk_draw_pixbuf(drawable, gc, pixalpha, - 0,0, rc.left,rc.top, width,height, GDK_RGB_DITHER_NORMAL, 0, 0); - - g_object_unref(pixalpha); - } -#endif } void SurfaceImpl::DrawRGBAImage(PRectangle rc, int width, int height, const unsigned char *pixelsImage) { @@ -1369,7 +854,6 @@ void SurfaceImpl::DrawRGBAImage(PRectangle rc, int width, int height, const unsi rc.top += (rc.Height() - height) / 2; rc.bottom = rc.top + height; -#ifdef USE_CAIRO int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width); int ucs = stride * height; std::vector<unsigned char> image(ucs); @@ -1390,81 +874,28 @@ void SurfaceImpl::DrawRGBAImage(PRectangle rc, int width, int height, const unsi cairo_fill(context); cairo_surface_destroy(psurf); -#else - GdkPixbuf *pixbuf = gdk_pixbuf_new_from_data(pixelsImage, - GDK_COLORSPACE_RGB, - TRUE, - 8, - width, - height, - width * 4, - NULL, - NULL); - gdk_draw_pixbuf(drawable, gc, pixbuf, - 0,0, rc.left,rc.top, width,height, GDK_RGB_DITHER_NORMAL, 0, 0); - g_object_unref(pixbuf); -#endif } void SurfaceImpl::Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back) { PenColour(back); -#ifdef USE_CAIRO cairo_arc(context, (rc.left + rc.right) / 2 + 0.5, (rc.top + rc.bottom) / 2 + 0.5, Platform::Minimum(rc.Width(), rc.Height()) / 2, 0, 2*M_PI); cairo_fill_preserve(context); PenColour(fore); cairo_stroke(context); -#else - gdk_draw_arc(drawable, gc, 1, - rc.left + 1, rc.top + 1, - rc.right - rc.left - 2, rc.bottom - rc.top - 2, - 0, 32767); - - // The subtraction of 1 here is similar to the case for RectangleDraw - PenColour(fore); - gdk_draw_arc(drawable, gc, 0, - rc.left, rc.top, - rc.right - rc.left - 1, rc.bottom - rc.top - 1, - 0, 32767); -#endif } void SurfaceImpl::Copy(PRectangle rc, Point from, Surface &surfaceSource) { SurfaceImpl &surfi = static_cast<SurfaceImpl &>(surfaceSource); -#ifdef USE_CAIRO bool canDraw = surfi.psurf; -#else - bool canDraw = surfi.drawable; -#endif if (canDraw) { -#ifdef USE_CAIRO cairo_set_source_surface(context, surfi.psurf, rc.left - from.x, rc.top - from.y); cairo_rectangle(context, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top); cairo_fill(context); -#else - gdk_draw_drawable(drawable, - gc, - static_cast<SurfaceImpl &>(surfaceSource).drawable, - from.x, from.y, - rc.left, rc.top, - rc.right - rc.left, rc.bottom - rc.top); -#endif } } -#ifndef DISABLE_GDK_FONT -static size_t UTF8Len(char ch) { - unsigned char uch = static_cast<unsigned char>(ch); - if (uch < 0x80) - return 1; - else if (uch < (0x80 + 0x40 + 0x20)) - return 2; - else - return 3; -} -#endif - char *UTF8FromLatin1(const char *s, int &len) { char *utfForm = new char[len*2+1]; size_t lenU = 0; @@ -1517,49 +948,6 @@ static size_t MultiByteLenFromIconv(const Converter &conv, const char *s, size_t return 1; } -#ifndef DISABLE_GDK_FONT -static char *UTF8FromGdkWChar(GdkWChar *wctext, int wclen) { - char *utfForm = new char[wclen*3+1]; // Maximum of 3 UTF-8 bytes per character - size_t lenU = 0; - for (int i = 0; i < wclen && wctext[i]; i++) { - unsigned int uch = wctext[i]; - if (uch < 0x80) { - utfForm[lenU++] = static_cast<char>(uch); - } else if (uch < 0x800) { - utfForm[lenU++] = static_cast<char>(0xC0 | (uch >> 6)); - utfForm[lenU++] = static_cast<char>(0x80 | (uch & 0x3f)); - } else { - utfForm[lenU++] = static_cast<char>(0xE0 | (uch >> 12)); - utfForm[lenU++] = static_cast<char>(0x80 | ((uch >> 6) & 0x3f)); - utfForm[lenU++] = static_cast<char>(0x80 | (uch & 0x3f)); - } - } - utfForm[lenU] = '\0'; - return utfForm; -} -#endif - -static char *UTF8FromDBCS(const char *s, int &len) { -#ifndef DISABLE_GDK_FONT - GdkWChar *wctext = new GdkWChar[len + 1]; - GdkWChar *wcp = wctext; - int wclen = gdk_mbstowcs(wcp, s, len); - if (wclen < 1) { - // In the annoying case when non-locale chars in the line. - // e.g. latin1 chars in Japanese locale. - delete []wctext; - return 0; - } - - char *utfForm = UTF8FromGdkWChar(wctext, wclen); - delete []wctext; - len = strlen(utfForm); - return utfForm; -#else - return 0; -#endif -} - static size_t UTF8CharLength(const char *s) { const unsigned char *us = reinterpret_cast<const unsigned char *>(s); unsigned char ch = *us; @@ -1572,18 +960,10 @@ static size_t UTF8CharLength(const char *s) { } } -// On GTK+, wchar_t is 4 bytes - -const int maxLengthTextRun = 10000; - void SurfaceImpl::DrawTextBase(PRectangle rc, Font &font_, XYPOSITION ybase, const char *s, int len, ColourAllocated fore) { PenColour(fore); -#ifdef USE_CAIRO if (context) { -#else - if (gc && drawable) { -#endif XYPOSITION xText = rc.left; if (PFont(font_)->pfd) { char *utfForm = 0; @@ -1594,84 +974,22 @@ void SurfaceImpl::DrawTextBase(PRectangle rc, Font &font_, XYPOSITION ybase, con SetConverter(PFont(font_)->characterSet); utfForm = UTF8FromIconv(conv, s, len); } - if (!utfForm) { // iconv failed so try DBCS if DBCS mode - if (et == dbcs) { - // Convert to utf8 - utfForm = UTF8FromDBCS(s, len); - } - } - if (!utfForm) { // iconv and DBCS failed so treat as Latin1 + if (!utfForm) { // iconv failed so treat as Latin1 utfForm = UTF8FromLatin1(s, len); } pango_layout_set_text(layout, utfForm, len); } pango_layout_set_font_description(layout, PFont(font_)->pfd); -#ifdef USE_CAIRO pango_cairo_update_layout(context, layout); -#endif #ifdef PANGO_VERSION PangoLayoutLine *pll = pango_layout_get_line_readonly(layout,0); #else PangoLayoutLine *pll = pango_layout_get_line(layout,0); #endif -#ifdef USE_CAIRO cairo_move_to(context, xText, ybase); pango_cairo_show_layout_line(context, pll); -#else - gdk_draw_layout_line(drawable, gc, xText, ybase, pll); -#endif delete []utfForm; - return; - } -#ifndef DISABLE_GDK_FONT - // Draw text as a series of segments to avoid limitations in X servers - const int segmentLength = 1000; - bool draw8bit = true; - if (et != singleByte) { - GdkWChar wctext[maxLengthTextRun]; - if (len >= maxLengthTextRun) - len = maxLengthTextRun-1; - int wclen; - if (et == UTF8) { - wclen = UTF16FromUTF8(s, len, - static_cast<wchar_t *>(static_cast<void *>(wctext)), maxLengthTextRun - 1); - } else { // dbcs, so convert using current locale - char sMeasure[maxLengthTextRun]; - memcpy(sMeasure, s, len); - sMeasure[len] = '\0'; - wclen = gdk_mbstowcs( - wctext, sMeasure, maxLengthTextRun - 1); - } - if (wclen > 0) { - draw8bit = false; - wctext[wclen] = L'\0'; - GdkWChar *wcp = wctext; - while ((wclen > 0) && (xText < maxCoordinate)) { - int lenDraw = Platform::Minimum(wclen, segmentLength); - gdk_draw_text_wc(drawable, PFont(font_)->pfont, gc, - xText, ybase, wcp, lenDraw); - wclen -= lenDraw; - if (wclen > 0) { // Avoid next calculation if possible as may be expensive - xText += gdk_text_width_wc(PFont(font_)->pfont, - wcp, lenDraw); - } - wcp += lenDraw; - } - } - } - if (draw8bit) { - while ((len > 0) && (xText < maxCoordinate)) { - int lenDraw = Platform::Minimum(len, segmentLength); - gdk_draw_text(drawable, PFont(font_)->pfont, gc, - xText, ybase, s, lenDraw); - len -= lenDraw; - if (len > 0) { // Avoid next calculation if possible as may be expensive - xText += gdk_text_width(PFont(font_)->pfont, s, lenDraw); - } - s += lenDraw; - } } -#endif } } @@ -1828,59 +1146,6 @@ void SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len, XYPOSITION } return; } -#ifndef DISABLE_GDK_FONT - int totalWidth = 0; - GdkFont *gf = PFont(font_)->pfont; - bool measure8bit = true; - if (et != singleByte) { - GdkWChar wctext[maxLengthTextRun]; - if (len >= maxLengthTextRun) - len = maxLengthTextRun-1; - int wclen; - if (et == UTF8) { - wclen = UTF16FromUTF8(s, len, - static_cast<wchar_t *>(static_cast<void *>(wctext)), maxLengthTextRun - 1); - } else { // dbcsMode, so convert using current locale - char sDraw[maxLengthTextRun]; - memcpy(sDraw, s, len); - sDraw[len] = '\0'; - wclen = gdk_mbstowcs( - wctext, sDraw, maxLengthTextRun - 1); - } - if (wclen > 0) { - measure8bit = false; - wctext[wclen] = L'\0'; - // Map widths back to utf-8 or DBCS input string - int i = 0; - for (int iU = 0; iU < wclen; iU++) { - int width = gdk_char_width_wc(gf, wctext[iU]); - totalWidth += width; - int lenChar; - if (et == UTF8) { - lenChar = UTF8Len(s[i]); - } else { - lenChar = mblen(s+i, MB_CUR_MAX); - if (lenChar < 0) - lenChar = 1; - } - while (lenChar--) { - positions[i++] = totalWidth; - } - } - while (i < len) { // In case of problems with lengths - positions[i++] = totalWidth; - } - } - } - if (measure8bit) { - // Either Latin1 or conversion failed so treat as Latin1. - for (int i = 0; i < len; i++) { - int width = gdk_char_width(gf, s[i]); - totalWidth += width; - positions[i] = totalWidth; - } - } -#endif } else { // No font so return an ascending range of values for (int i = 0; i < len; i++) { @@ -1898,15 +1163,11 @@ XYPOSITION SurfaceImpl::WidthText(Font &font_, const char *s, int len) { if (et == UTF8) { pango_layout_set_text(layout, s, len); } else { - if (et == dbcs) { - // Convert to utf8 - utfForm = UTF8FromDBCS(s, len); - } - if (!utfForm) { // DBCS failed so treat as iconv + if (!utfForm) { // use iconv SetConverter(PFont(font_)->characterSet); utfForm = UTF8FromIconv(conv, s, len); } - if (!utfForm) { // g_locale_to_utf8 failed so treat as Latin1 + if (!utfForm) { // iconv failed so treat as Latin1 utfForm = UTF8FromLatin1(s, len); } pango_layout_set_text(layout, utfForm, len); @@ -1920,19 +1181,7 @@ XYPOSITION SurfaceImpl::WidthText(Font &font_, const char *s, int len) { delete []utfForm; return pango_units_to_double(pos.width); } -#ifndef DISABLE_GDK_FONT - if (et == UTF8) { - GdkWChar wctext[maxLengthTextRun]; - size_t wclen = UTF16FromUTF8(s, len, static_cast<wchar_t *>(static_cast<void *>(wctext)), - sizeof(wctext) / sizeof(GdkWChar) - 1); - wctext[wclen] = L'\0'; - return gdk_text_width_wc(PFont(font_)->pfont, wctext, wclen); - } else { - return gdk_text_width(PFont(font_)->pfont, s, len); - } -#else return 1; -#endif } else { return 1; } @@ -1943,37 +1192,17 @@ XYPOSITION SurfaceImpl::WidthChar(Font &font_, char ch) { if (PFont(font_)->pfd) { return WidthText(font_, &ch, 1); } -#ifndef DISABLE_GDK_FONT - return gdk_char_width(PFont(font_)->pfont, ch); -#else return 1; -#endif } else { return 1; } } -// Three possible strategies for determining ascent and descent of font: -// 1) Call gdk_string_extents with string containing all letters, numbers and punctuation. -// 2) Use the ascent and descent fields of GdkFont. -// 3) Call gdk_string_extents with string as 1 but also including accented capitals. -// Smallest values given by 1 and largest by 3 with 2 in between. -// Techniques 1 and 2 sometimes chop off extreme portions of ascenders and -// descenders but are mostly OK except for accented characters like Å which are -// rarely used in code. - -// This string contains a good range of characters to test for size. -//const char largeSizeString[] = "ÂÃÅÄ `~!@#$%^&*()-_=+\\|[]{};:\"\'<,>.?/1234567890" -// "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; -#ifndef FAST_WAY -const char sizeString[] = "`~!@#$%^&*()-_=+\\|[]{};:\"\'<,>.?/1234567890" - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; -#endif +// Ascent and descent determined by Pango font metrics. XYPOSITION SurfaceImpl::Ascent(Font &font_) { if (!(font_.GetID())) return 1; -#ifdef FAST_WAY FontMutexLock(); int ascent = PFont(font_)->ascent; if ((ascent == 0) && (PFont(font_)->pfd)) { @@ -1984,35 +1213,16 @@ XYPOSITION SurfaceImpl::Ascent(Font &font_) { pango_font_metrics_unref(metrics); ascent = PFont(font_)->ascent; } -#ifndef DISABLE_GDK_FONT - if ((ascent == 0) && (PFont(font_)->pfont)) { - ascent = PFont(font_)->pfont->ascent; - } -#endif if (ascent == 0) { ascent = 1; } FontMutexUnlock(); return ascent; -#else - - gint lbearing; - gint rbearing; - gint width; - gint ascent; - gint descent; - - gdk_string_extents(PFont(font_)->pfont, sizeString, - &lbearing, &rbearing, &width, &ascent, &descent); - return ascent; -#endif } XYPOSITION SurfaceImpl::Descent(Font &font_) { if (!(font_.GetID())) return 1; -#ifdef FAST_WAY - if (PFont(font_)->pfd) { PangoFontMetrics *metrics = pango_context_get_metrics(pcontext, PFont(font_)->pfd, pango_context_get_language(pcontext)); @@ -2020,23 +1230,7 @@ XYPOSITION SurfaceImpl::Descent(Font &font_) { pango_font_metrics_unref(metrics); return descent; } -#ifndef DISABLE_GDK_FONT - return PFont(font_)->pfont->descent; -#else return 0; -#endif -#else - - gint lbearing; - gint rbearing; - gint width; - gint ascent; - gint descent; - - gdk_string_extents(PFont(font_)->pfont, sizeString, - &lbearing, &rbearing, &width, &ascent, &descent); - return descent; -#endif } XYPOSITION SurfaceImpl::InternalLeading(Font &) { @@ -2061,14 +1255,8 @@ int SurfaceImpl::SetPalette(Palette *, bool) { } void SurfaceImpl::SetClip(PRectangle rc) { -#ifdef USE_CAIRO cairo_rectangle(context, rc.left, rc.top, rc.right, rc.bottom); cairo_clip(context); -#else - GdkRectangle area = {rc.left, rc.top, - rc.right - rc.left, rc.bottom - rc.top}; - gdk_gc_set_clip_rectangle(gc, &area); -#endif } void SurfaceImpl::FlushCachedState() {} @@ -2237,25 +1425,16 @@ PRectangle Window::GetMonitorRect(Point pt) { gdk_window_get_origin(WindowFromWidget(PWidget(wid)), &x_offset, &y_offset); -#if GTK_CHECK_VERSION(2,2,0) - // GTK+ 2.2+ - { - GdkScreen* screen; - gint monitor_num; - GdkRectangle rect; + GdkScreen* screen; + gint monitor_num; + GdkRectangle rect; - screen = gtk_widget_get_screen(PWidget(wid)); - monitor_num = gdk_screen_get_monitor_at_point(screen, pt.x + x_offset, pt.y + y_offset); - gdk_screen_get_monitor_geometry(screen, monitor_num, &rect); - rect.x -= x_offset; - rect.y -= y_offset; - return PRectangle(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height); - } -#else - pt = pt; - return PRectangle(-x_offset, -y_offset, (-x_offset) + gdk_screen_width(), - (-y_offset) + gdk_screen_height()); -#endif + screen = gtk_widget_get_screen(PWidget(wid)); + monitor_num = gdk_screen_get_monitor_at_point(screen, pt.x + x_offset, pt.y + y_offset); + gdk_screen_get_monitor_geometry(screen, monitor_num, &rect); + rect.x -= x_offset; + rect.y -= y_offset; + return PRectangle(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height); } typedef std::map<int, RGBAImage*> ImageMap; diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index fd59e0f97..3b757a263 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -74,8 +74,6 @@ #define IS_WIDGET_VISIBLE(w) (GTK_WIDGET_VISIBLE(w)) #endif -#define USE_CAIRO 1 - static GdkWindow *WindowFromWidget(GtkWidget *w) { #if GTK_CHECK_VERSION(3,0,0) return gtk_widget_get_window(w); @@ -100,10 +98,6 @@ static GdkWindow *PWindow(const Window &w) { #pragma warning(disable: 4505) #endif -#if GTK_CHECK_VERSION(2,6,0) -#define USE_GTK_CLIPBOARD -#endif - #define OBJECT_CLASS GObjectClass #ifdef SCI_NAMESPACE @@ -122,11 +116,6 @@ class ScintillaGTK : public ScintillaBase { int scrollBarWidth; int scrollBarHeight; - // Because clipboard access is asynchronous, copyText is created by Copy -#ifndef USE_GTK_CLIPBOARD - SelectionText copyText; -#endif - SelectionText primary; GdkEventButton evbtn; @@ -218,11 +207,9 @@ private: void ReceivedSelection(GtkSelectionData *selection_data); void ReceivedDrop(GtkSelectionData *selection_data); static void GetSelection(GtkSelectionData *selection_data, guint info, SelectionText *selected); -#ifdef USE_GTK_CLIPBOARD void StoreOnClipboard(SelectionText *clipText); static void ClipboardGetSelection(GtkClipboard* clip, GtkSelectionData *selection_data, guint info, void *data); static void ClipboardClearSelection(GtkClipboard* clip, void *data); -#endif void UnclaimSelection(GdkEventSelection *selection_event); void Resize(int width, int height); @@ -505,10 +492,6 @@ void ScintillaGTK::RealizeThis(GtkWidget *widget) { gtk_selection_add_targets(widget, GDK_SELECTION_PRIMARY, clipboardCopyTargets, nClipboardCopyTargets); -#ifndef USE_GTK_CLIPBOARD - gtk_selection_add_targets(widget, atomClipboard, - clipboardPasteTargets, nClipboardPasteTargets); -#endif } void ScintillaGTK::Realize(GtkWidget *widget) { @@ -519,9 +502,6 @@ void ScintillaGTK::Realize(GtkWidget *widget) { void ScintillaGTK::UnRealizeThis(GtkWidget *widget) { try { gtk_selection_clear_targets(widget, GDK_SELECTION_PRIMARY); -#ifndef USE_GTK_CLIPBOARD - gtk_selection_clear_targets(widget, atomClipboard); -#endif if (IS_WIDGET_MAPPED(widget)) { gtk_widget_unmap(widget); @@ -1434,30 +1414,16 @@ int ScintillaGTK::KeyDefault(int key, int modifiers) { } void ScintillaGTK::CopyToClipboard(const SelectionText &selectedText) { -#ifndef USE_GTK_CLIPBOARD - copyText.Copy(selectedText); - gtk_selection_owner_set(GTK_WIDGET(PWidget(wMain)), - atomClipboard, - GDK_CURRENT_TIME); -#else SelectionText *clipText = new SelectionText(); clipText->Copy(selectedText); StoreOnClipboard(clipText); -#endif } void ScintillaGTK::Copy() { if (!sel.Empty()) { -#ifndef USE_GTK_CLIPBOARD - CopySelectionRange(©Text); - gtk_selection_owner_set(GTK_WIDGET(PWidget(wMain)), - atomClipboard, - GDK_CURRENT_TIME); -#else SelectionText *clipText = new SelectionText(); CopySelectionRange(clipText); StoreOnClipboard(clipText); -#endif #if PLAT_GTK_WIN32 if (sel.IsRectangular()) { ::OpenClipboard(NULL); @@ -1717,7 +1683,6 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, Se #endif } -#ifdef USE_GTK_CLIPBOARD void ScintillaGTK::StoreOnClipboard(SelectionText *clipText) { GtkClipboard *clipBoard = gtk_widget_get_clipboard(GTK_WIDGET(PWidget(wMain)), atomClipboard); @@ -1738,7 +1703,6 @@ void ScintillaGTK::ClipboardClearSelection(GtkClipboard *, void *data) { SelectionText *obj = static_cast<SelectionText*>(data); delete obj; } -#endif void ScintillaGTK::UnclaimSelection(GdkEventSelection *selection_event) { try { @@ -2312,28 +2276,10 @@ gboolean ScintillaGTK::ExposePreeditThis(GtkWidget *widget, GdkEventExpose *ose) PangoLayout *layout = gtk_widget_create_pango_layout(PWidget(wText), str); pango_layout_set_attributes(layout, attrs); -#ifdef USE_CAIRO cairo_t *context = gdk_cairo_create(reinterpret_cast<GdkDrawable *>(WindowFromWidget(widget))); cairo_move_to(context, 0, 0); pango_cairo_show_layout(context, layout); cairo_destroy(context); -#else - GdkGC *gc = gdk_gc_new(widget->window); - GdkColor color[2] = { {0, 0x0000, 0x0000, 0x0000}, - {0, 0xffff, 0xffff, 0xffff} - }; - gdk_colormap_alloc_color(gdk_colormap_get_system(), color, FALSE, TRUE); - gdk_colormap_alloc_color(gdk_colormap_get_system(), color + 1, FALSE, TRUE); - - gdk_gc_set_foreground(gc, color + 1); - gdk_draw_rectangle(widget->window, gc, TRUE, ose->area.x, ose->area.y, - ose->area.width, ose->area.height); - - gdk_gc_set_foreground(gc, color); - gdk_gc_set_background(gc, color + 1); - gdk_draw_layout(widget->window, gc, 0, 0, layout); - g_object_unref(gc); -#endif g_free(str); pango_attr_list_unref(attrs); g_object_unref(layout); @@ -2640,11 +2586,6 @@ void ScintillaGTK::SelectionGet(GtkWidget *widget, } sciThis->GetSelection(selection_data, info, &sciThis->primary); } -#ifndef USE_GTK_CLIPBOARD - else { - sciThis->GetSelection(selection_data, info, &sciThis->copyText); - } -#endif } catch (...) { sciThis->errorStatus = SC_STATUS_FAILURE; } diff --git a/include/Face.py b/include/Face.py index 52c9b8d0c..97b700dc5 100644 --- a/include/Face.py +++ b/include/Face.py @@ -72,7 +72,7 @@ class Face: "Category": currentCategory, "Comment": currentComment } if value in self.values: - raise "Duplicate value " + value + " " + name + raise Exception("Duplicate value " + value + " " + name) self.values[value] = 1 self.order.append(name) elif featureType == "evt": @@ -84,7 +84,7 @@ class Face: "Category": currentCategory, "Comment": currentComment } if value in self.events: - raise "Duplicate event " + value + " " + name + raise Exception("Duplicate event " + value + " " + name) self.events[value] = 1 self.order.append(name) elif featureType == "cat": @@ -94,7 +94,7 @@ class Face: name, value = featureVal.split("=", 1) except ValueError: print("Failure %s" % featureVal) - raise + raise Exception() self.features[name] = { "FeatureType": featureType, "Category": currentCategory, diff --git a/include/SciLexer.h b/include/SciLexer.h index e8805f2d6..255e091b7 100644 --- a/include/SciLexer.h +++ b/include/SciLexer.h @@ -153,6 +153,7 @@ #define SCE_C_GLOBALCLASS 19 #define SCE_C_STRINGRAW 20 #define SCE_C_TRIPLEVERBATIM 21 +#define SCE_C_HASHQUOTEDSTRING 22 #define SCE_D_DEFAULT 0 #define SCE_D_COMMENT 1 #define SCE_D_COMMENTLINE 2 diff --git a/include/Scintilla.h b/include/Scintilla.h index c8ffba04e..9b99436ff 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -431,6 +431,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SCI_SHOWLINES 2226 #define SCI_HIDELINES 2227 #define SCI_GETLINEVISIBLE 2228 +#define SCI_GETALLLINESVISIBLE 2236 #define SCI_SETFOLDEXPANDED 2229 #define SCI_GETFOLDEXPANDED 2230 #define SCI_TOGGLEFOLD 2231 diff --git a/include/Scintilla.iface b/include/Scintilla.iface index 23da6d5b5..aa0f030dd 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -1084,6 +1084,9 @@ fun void HideLines=2227(int lineStart, int lineEnd) # Is a line visible? get bool GetLineVisible=2228(int line,) +# Are all lines visible? +get bool GetAllLinesVisible=2236(,) + # Show the children of a header line. set void SetFoldExpanded=2229(int line, bool expanded) @@ -2497,6 +2500,7 @@ val SCE_C_COMMENTDOCKEYWORDERROR=18 val SCE_C_GLOBALCLASS=19 val SCE_C_STRINGRAW=20 val SCE_C_TRIPLEVERBATIM=21 +val SCE_C_HASHQUOTEDSTRING=22 # Lexical states for SCLEX_D lex D=SCLEX_D SCE_D_ val SCE_D_DEFAULT=0 diff --git a/lexers/LexCPP.cxx b/lexers/LexCPP.cxx index 51fd19255..5cc2f4556 100644 --- a/lexers/LexCPP.cxx +++ b/lexers/LexCPP.cxx @@ -209,6 +209,7 @@ struct OptionsCPP { bool trackPreprocessor; bool updatePreprocessor; bool triplequotedStrings; + bool hashquotedStrings; bool fold; bool foldSyntaxBased; bool foldComment; @@ -226,6 +227,7 @@ struct OptionsCPP { trackPreprocessor = true; updatePreprocessor = true; triplequotedStrings = false; + hashquotedStrings = false; fold = false; foldSyntaxBased = true; foldComment = false; @@ -268,6 +270,9 @@ struct OptionSetCPP : public OptionSet<OptionsCPP> { DefineProperty("lexer.cpp.triplequoted.strings", &OptionsCPP::triplequotedStrings, "Set to 1 to enable highlighting of triple-quoted strings."); + DefineProperty("lexer.cpp.hashquoted.strings", &OptionsCPP::hashquotedStrings, + "Set to 1 to enable highlighting of hash-quoted strings."); + DefineProperty("fold", &OptionsCPP::fold); DefineProperty("fold.cpp.syntax.based", &OptionsCPP::foldSyntaxBased, @@ -692,6 +697,15 @@ void SCI_METHOD LexerCPP::Lex(unsigned int startPos, int length, int initStyle, sc.ForwardSetState(SCE_C_DEFAULT|activitySet); } break; + case SCE_C_HASHQUOTEDSTRING: + if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\"') { + sc.ForwardSetState(SCE_C_DEFAULT|activitySet); + } + break; case SCE_C_STRINGRAW: if (sc.Match(rawStringTerminator.c_str())) { for (size_t termPos=rawStringTerminator.size(); termPos; termPos--) @@ -768,6 +782,9 @@ void SCI_METHOD LexerCPP::Lex(unsigned int startPos, int length, int initStyle, } else if (options.triplequotedStrings && sc.Match("\"\"\"")) { sc.SetState(SCE_C_TRIPLEVERBATIM|activitySet); sc.Forward(2); + } else if (options.hashquotedStrings && sc.Match('#', '\"')) { + sc.SetState(SCE_C_HASHQUOTEDSTRING|activitySet); + sc.Forward(); } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { if (lastWordWasUUID) { sc.SetState(SCE_C_UUID|activitySet); diff --git a/macosx/ExtInput.cxx b/macosx/ExtInput.cxx deleted file mode 100644 index 677a82c3f..000000000 --- a/macosx/ExtInput.cxx +++ /dev/null @@ -1,608 +0,0 @@ -/******************************************************************************* - -Copyright (c) 2007 Adobe Systems Incorporated - -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. - -********************************************************************************/ - -#include "ScintillaMacOSX.h" -#include "ExtInput.h" - -using namespace Scintilla; - -// uncomment this for a log to /dev/console -// #define LOG_TSM 1 - -#if LOG_TSM -FILE* logFile = NULL; -#endif - -static EventHandlerUPP tsmHandler; - -static EventTypeSpec tsmSpecs[] = { - { kEventClassTextInput, kEventTextInputUpdateActiveInputArea }, -// { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent }, - { kEventClassTextInput, kEventTextInputOffsetToPos }, - { kEventClassTextInput, kEventTextInputPosToOffset }, - { kEventClassTextInput, kEventTextInputGetSelectedText } -}; - -#define kScintillaTSM 'ScTs' - -// The following structure is attached to the HIViewRef as property kScintillaTSM - -struct TSMData -{ - HIViewRef view; // this view - TSMDocumentID docid; // the TSM document ID - EventHandlerRef handler; // the event handler - ScintillaMacOSX* scintilla; // the Scintilla pointer - int styleMask; // the document style mask - int indicStyle [3]; // indicator styles save - int indicColor [3]; // indicator colors save - int selStart; // starting position of selection (Scintilla offset) - int selLength; // UTF-8 number of characters - int selCur; // current position (Scintilla offset) - int inhibitRecursion; // true to stop recursion - bool active; // true if this is active -}; - -static const int numSpecs = 5; - - -// Fetch a range of text as UTF-16; delete the buffer after use - -static char* getTextPortion (TSMData* data, UInt32 start, UInt32 size) -{ - Scintilla::TextRange range; - range.chrg.cpMin = start; - range.chrg.cpMax = start + size; - range.lpstrText = new char [size + 1]; - range.lpstrText [size] = 0; - data->scintilla->WndProc (SCI_GETTEXTRANGE, 0, (uptr_t) &range); - return range.lpstrText; -} - -static pascal OSStatus doHandleTSM (EventHandlerCallRef, EventRef inEvent, void* userData); - -void ExtInput::attach (HIViewRef viewRef) -{ - if (NULL == tsmHandler) - tsmHandler = NewEventHandlerUPP (doHandleTSM); - ::UseInputWindow (NULL, FALSE); - -#ifdef LOG_TSM - if (NULL == logFile) - logFile = fopen ("/dev/console", "a"); -#endif - - // create and attach the TSM data - TSMData* data = new TSMData; - - data->view = viewRef; - data->active = false; - data->inhibitRecursion = 0; - - ::GetControlProperty (viewRef, scintillaMacOSType, 0, sizeof( data->scintilla ), NULL, &data->scintilla); - - if (NULL != data->scintilla) - { - // create the TSM document ref - InterfaceTypeList interfaceTypes; - interfaceTypes[0] = kUnicodeDocumentInterfaceType; - ::NewTSMDocument (1, interfaceTypes, &data->docid, (long) viewRef); - // install my event handler - ::InstallControlEventHandler (viewRef, tsmHandler, numSpecs, tsmSpecs, data, &data->handler); - - ::SetControlProperty (viewRef, kScintillaTSM, 0, sizeof (data), &data); - } - else - delete data; -} - -static TSMData* getTSMData (HIViewRef viewRef) -{ - TSMData* data = NULL; - UInt32 n; - ::GetControlProperty (viewRef, kScintillaTSM, 0, sizeof (data), &n, (UInt32*) &data); - return data; -} - -void ExtInput::detach (HIViewRef viewRef) -{ - TSMData* data = getTSMData (viewRef); - if (NULL != data) - { - ::DeleteTSMDocument (data->docid); - ::RemoveEventHandler (data->handler); - delete data; - } -} - -void ExtInput::activate (HIViewRef viewRef, bool on) -{ - TSMData* data = getTSMData (viewRef); - if (NULL == data) - return; - - if (on) - { - ::ActivateTSMDocument (data->docid); - HIRect bounds; - ::HIViewGetBounds (viewRef, &bounds); - ::HIViewConvertRect (&bounds, viewRef, NULL); - RgnHandle hRgn = ::NewRgn(); - ::SetRectRgn (hRgn, (short) bounds.origin.x, (short) bounds.origin.y, - (short) (bounds.origin.x + bounds.size.width), - (short) (bounds.origin.y + bounds.size.height)); -#if LOG_TSM - fprintf (logFile, "TSMSetInlineInputRegion (%08lX, %ld:%ld-%ld:%ld)\n", - (long) data->docid, (long) bounds.origin.x, (long) bounds.origin.y, - (long) (bounds.origin.x + bounds.size.width), (long) (bounds.origin.y + bounds.size.height)); - fflush (logFile); -#endif - ::TSMSetInlineInputRegion (data->docid, HIViewGetWindow (data->view), hRgn); - ::DisposeRgn (hRgn); - ::UseInputWindow (NULL, FALSE); - } - else - { -#if LOG_TSM - fprintf (logFile, "DeactivateTSMDocument (%08lX)\n", (long) data->docid); - fflush (logFile); -#endif - ::DeactivateTSMDocument (data->docid); - } -} - -static void startInput (TSMData* data, bool delSelection = true) -{ - if (!data->active && 0 == data->inhibitRecursion) - { - data->active = true; - - // Delete any selection - if( delSelection ) - data->scintilla->WndProc (SCI_REPLACESEL, 0, reinterpret_cast<sptr_t>("")); - - // need all style bits because we do indicators - data->styleMask = data->scintilla->WndProc (SCI_GETSTYLEBITS, 0, 0); - data->scintilla->WndProc (SCI_SETSTYLEBITS, 5, 0); - - // Set the target range for successive replacements - data->selStart = - data->selCur = data->scintilla->WndProc (SCI_GETCURRENTPOS, 0, 0); - data->selLength = 0; - - // save needed styles - for (int i = 0; i < 2; i++) - { - data->indicStyle [i] = data->scintilla->WndProc (SCI_INDICGETSTYLE, i, 0); - data->indicColor [i] = data->scintilla->WndProc (SCI_INDICGETFORE, i, 0); - } - // set styles and colors - data->scintilla->WndProc (SCI_INDICSETSTYLE, 0, INDIC_SQUIGGLE); - data->scintilla->WndProc (SCI_INDICSETFORE, 0, 0x808080); - data->scintilla->WndProc (SCI_INDICSETSTYLE, 1, INDIC_PLAIN); // selected converted - data->scintilla->WndProc (SCI_INDICSETFORE, 1, 0x808080); - data->scintilla->WndProc (SCI_INDICSETSTYLE, 2, INDIC_PLAIN); // selected raw - data->scintilla->WndProc (SCI_INDICSETFORE, 2, 0x0000FF); - // stop Undo - data->scintilla->WndProc (SCI_BEGINUNDOACTION, 0, 0); - } -} - -static void stopInput (TSMData* data, int pos) -{ - if (data->active && 0 == data->inhibitRecursion) - { - // First fix the doc - this may cause more messages - // but do not fall into recursion - data->inhibitRecursion++; - ::FixTSMDocument (data->docid); - data->inhibitRecursion--; - data->active = false; - - // Remove indicator styles - data->scintilla->WndProc (SCI_STARTSTYLING, data->selStart, INDICS_MASK); - data->scintilla->WndProc (SCI_SETSTYLING, pos - data->selStart, 0); - // Restore old indicator styles and colors - data->scintilla->WndProc (SCI_SETSTYLEBITS, data->styleMask, 0); - for (int i = 0; i < 2; i++) - { - data->scintilla->WndProc (SCI_INDICSETSTYLE, i, data->indicStyle [i]); - data->scintilla->WndProc (SCI_INDICSETFORE, i, data->indicColor [i]); - } - - // remove selection and re-allow selections to display - data->scintilla->WndProc (SCI_SETSEL, pos, pos); - data->scintilla->WndProc (SCI_TARGETFROMSELECTION, 0, 0); - data->scintilla->WndProc (SCI_HIDESELECTION, 0, 0); - - // move the caret behind the current area - data->scintilla->WndProc (SCI_SETCURRENTPOS, pos, 0); - // re-enable Undo - data->scintilla->WndProc (SCI_ENDUNDOACTION, 0, 0); - // re-colorize - int32_t startLine = data->scintilla->WndProc (SCI_LINEFROMPOSITION, data->selStart, 0); - int32_t startPos = data->scintilla->WndProc (SCI_POSITIONFROMLINE, startLine, 0); - int32_t endLine = data->scintilla->WndProc (SCI_LINEFROMPOSITION, pos, 0); - if (endLine == startLine) - endLine++; - int32_t endPos = data->scintilla->WndProc (SCI_POSITIONFROMLINE, endLine, 0); - - data->scintilla->WndProc (SCI_COLOURISE, startPos, endPos); - } -} - -void ExtInput::stop (HIViewRef viewRef) -{ - TSMData* data = getTSMData (viewRef); - if (NULL != data) - stopInput (data, data->selStart + data->selLength); -} - -static char* UTF16toUTF8 (const UniChar* buf, int len, int& utf8len) -{ - CFStringRef str = CFStringCreateWithCharactersNoCopy (NULL, buf, (UInt32) len, kCFAllocatorNull); - CFRange range = { 0, len }; - CFIndex bufLen; - CFStringGetBytes (str, range, kCFStringEncodingUTF8, '?', false, NULL, 0, &bufLen); - UInt8* utf8buf = new UInt8 [bufLen+1]; - CFStringGetBytes (str, range, kCFStringEncodingUTF8, '?', false, utf8buf, bufLen, NULL); - utf8buf [bufLen] = 0; - CFRelease (str); - utf8len = (int) bufLen; - return (char*) utf8buf; -} - -static int UCS2Length (const char* buf, int len) -{ - int n = 0; - while (len > 0) - { - int bytes = 0; - char ch = *buf; - while (ch & 0x80) - bytes++, ch <<= 1; - len -= bytes; - n += bytes; - } - return n; -} - -static int UTF8Length (const UniChar* buf, int len) -{ - int n = 0; - while (len > 0) - { - UInt32 uch = *buf++; - len--; - if (uch >= 0xD800 && uch <= 0xDBFF && len > 0) - { - UInt32 uch2 = *buf; - if (uch2 >= 0xDC00 && uch2 <= 0xDFFF) - { - buf++; - len--; - uch = ((uch & 0x3FF) << 10) + (uch2 & 0x3FF); - } - } - n++; - if (uch > 0x7F) - n++; - if (uch > 0x7FF) - n++; - if (uch > 0xFFFF) - n++; - if (uch > 0x1FFFFF) - n++; - if (uch > 0x3FFFFFF) - n++; - } - return n; -} - -static OSStatus handleTSMUpdateActiveInputArea (TSMData* data, EventRef inEvent) -{ - UInt32 fixLength; - int caretPos = -1; - UInt32 actualSize; - ::TextRangeArray* hiliteRanges = NULL; - char* hiliteBuffer = NULL; - bool done; - - // extract the text - UniChar* buffer = NULL; - UniChar temp [128]; - UniChar* text = temp; - - // get the fix length (in bytes) - OSStatus err = ::GetEventParameter (inEvent, kEventParamTextInputSendFixLen, - typeLongInteger, NULL, sizeof (long), NULL, &fixLength); - // need the size (in bytes) - if (noErr == err) - err = ::GetEventParameter (inEvent, kEventParamTextInputSendText, - typeUnicodeText, NULL, 256, &actualSize, temp); - - // then allocate and fetch if necessary - UInt32 textLength = actualSize / sizeof (UniChar); - fixLength /= sizeof (UniChar); - - if (noErr == err) - { - // this indicates that we are completely done - done = (fixLength == textLength || fixLength < 0); - if (textLength >= 128) - { - buffer = text = new UniChar [textLength]; - err = ::GetEventParameter (inEvent, kEventParamTextInputSendText, - typeUnicodeText, NULL, actualSize, NULL, (void*) text); - } - - // set the text now, but convert it to UTF-8 first - int utf8len; - char* utf8 = UTF16toUTF8 (text, textLength, utf8len); - data->scintilla->WndProc (SCI_SETTARGETSTART, data->selStart, 0); - data->scintilla->WndProc (SCI_SETTARGETEND, data->selStart + data->selLength, 0); - data->scintilla->WndProc (SCI_HIDESELECTION, 1, 0); - data->scintilla->WndProc (SCI_REPLACETARGET, utf8len, (sptr_t) utf8); - data->selLength = utf8len; - delete [] utf8; - } - - // attempt to extract the array of hilite ranges - if (noErr == err) - { - ::TextRangeArray tempTextRangeArray; - OSStatus tempErr = ::GetEventParameter (inEvent, kEventParamTextInputSendHiliteRng, - typeTextRangeArray, NULL, sizeof (::TextRangeArray), &actualSize, &tempTextRangeArray); - if (noErr == tempErr) - { - // allocate memory and get the stuff! - hiliteBuffer = new char [actualSize]; - hiliteRanges = (::TextRangeArray*) hiliteBuffer; - err = ::GetEventParameter (inEvent, kEventParamTextInputSendHiliteRng, - typeTextRangeArray, NULL, actualSize, NULL, hiliteRanges); - if (noErr != err) - { - delete [] hiliteBuffer; - hiliteBuffer = NULL; - hiliteRanges = NULL; - } - } - } -#if LOG_TSM - fprintf (logFile, "kEventTextInputUpdateActiveInputArea:\n" - " TextLength = %ld\n" - " FixLength = %ld\n", - (long) textLength, (long) fixLength); - fflush (logFile); -#endif - - if (NULL != hiliteRanges) - { - for (int i = 0; i < hiliteRanges->fNumOfRanges; i++) - { -#if LOG_TSM - fprintf (logFile, " Range #%d: %ld-%ld (%d)\n", - i+1, - hiliteRanges->fRange[i].fStart, - hiliteRanges->fRange[i].fEnd, - hiliteRanges->fRange[i].fHiliteStyle); - fflush (logFile); -#endif - // start and end of range, zero based - long bgn = long (hiliteRanges->fRange[i].fStart) / sizeof (UniChar); - long end = long (hiliteRanges->fRange[i].fEnd) / sizeof (UniChar); - if (bgn >= 0 && end >= 0) - { - // move the caret if this is requested - if (hiliteRanges->fRange[i].fHiliteStyle == kTSMHiliteCaretPosition) - caretPos = bgn; - else - { - // determine which style to use - int style; - switch (hiliteRanges->fRange[i].fHiliteStyle) - { - case kTSMHiliteRawText: style = INDIC0_MASK; break; - case kTSMHiliteSelectedRawText: style = INDIC0_MASK; break; - case kTSMHiliteConvertedText: style = INDIC1_MASK; break; - case kTSMHiliteSelectedConvertedText: style = INDIC2_MASK; break; - default: style = INDIC0_MASK; - } - // bgn and end are Unicode offsets from the starting pos - // use the text buffer to determine the UTF-8 offsets - long utf8bgn = data->selStart + UTF8Length (text, bgn); - long utf8size = UTF8Length (text + bgn, end - bgn); - // set indicators - int oldEnd = data->scintilla->WndProc (SCI_GETENDSTYLED, 0, 0); - data->scintilla->WndProc (SCI_STARTSTYLING, utf8bgn, INDICS_MASK); - data->scintilla->WndProc (SCI_SETSTYLING, utf8size, style & ~1); - data->scintilla->WndProc (SCI_STARTSTYLING, oldEnd, 31); - } - } - } - } - if (noErr == err) - { - // if the fixed length is == to the new text, we are done - if (done) - stopInput (data, data->selStart + UTF8Length (text, textLength)); - else if (caretPos >= 0) - { - data->selCur = data->selStart + UTF8Length (text, caretPos); - data->scintilla->WndProc (SCI_SETCURRENTPOS, data->selCur, 0); - } - } - - delete [] hiliteBuffer; - delete [] buffer; - return err; -} - -struct MacPoint { - short v; - short h; -}; - -static OSErr handleTSMOffset2Pos (TSMData* data, EventRef inEvent) -{ - long offset; - - // get the offfset to convert - OSStatus err = ::GetEventParameter (inEvent, kEventParamTextInputSendTextOffset, - typeLongInteger, NULL, sizeof (long), NULL, &offset); - if (noErr == err) - { - // where is the caret now? - HIPoint where; - - int line = (int) data->scintilla->WndProc (SCI_LINEFROMPOSITION, data->selCur, 0); - where.x = data->scintilla->WndProc (SCI_POINTXFROMPOSITION, 0, data->selCur); - where.y = data->scintilla->WndProc (SCI_POINTYFROMPOSITION, 0, data->selCur) - + data->scintilla->WndProc (SCI_TEXTHEIGHT, line, 0); - // convert to window coords - ::HIViewConvertPoint (&where, data->view, NULL); - // convert to screen coords - Rect global; - GetWindowBounds (HIViewGetWindow (data->view), kWindowStructureRgn, &global); - MacPoint pt; - pt.h = (short) where.x + global.left; - pt.v = (short) where.y + global.top; - - // set the result - err = ::SetEventParameter (inEvent, kEventParamTextInputReplyPoint, typeQDPoint, sizeof (MacPoint), &pt); -#if LOG_TSM - fprintf (logFile, "kEventTextInputOffsetToPos:\n" - " Offset: %ld\n" - " Pos: %ld:%ld (orig = %ld:%ld)\n", offset, - (long) pt.h, (long) pt.v, - (long) where.x, (long) where.y); - fflush (logFile); -#endif - } - return err; -} - -static OSErr handleTSMPos2Offset (TSMData* data, EventRef inEvent) -{ - MacPoint qdPosition; - long offset; - short regionClass; - - // retrieve the global point to convert - OSStatus err = ::GetEventParameter (inEvent, kEventParamTextInputSendCurrentPoint, - typeQDPoint, NULL, sizeof (MacPoint), NULL, &qdPosition); - if (noErr == err) - { -#if LOG_TSM - fprintf (logFile, "kEventTextInputPosToOffset:\n" - " Pos: %ld:%ld\n", (long) qdPosition.v, (long) qdPosition.h); - fflush (logFile); -#endif - // convert to local coordinates - HIRect rect; - rect.origin.x = qdPosition.h; - rect.origin.y = qdPosition.v; - rect.size.width = - rect.size.height = 1; - ::HIViewConvertRect (&rect, NULL, data->view); - - // we always report the position to be within the composition; - // coords inside the same pane are clipped to the composition, - // and if the position is outside, then we deactivate this instance - // this leaves the edit open and active so we can edit multiple panes - regionClass = kTSMInsideOfActiveInputArea; - - // compute the offset (relative value) - offset = data->scintilla->WndProc (SCI_POSITIONFROMPOINTCLOSE, (uptr_t) rect.origin.x, (sptr_t) rect.origin.y); - if (offset >= 0) - { - // convert to a UTF-16 offset (Brute Force) - char* buf = getTextPortion (data, 0, offset); - offset = UCS2Length (buf, offset); - delete [] buf; - -#if LOG_TSM - fprintf (logFile, " Offset: %ld (class %ld)\n", offset, (long) regionClass); - fflush (logFile); -#endif - // store the offset - err = ::SetEventParameter (inEvent, kEventParamTextInputReplyTextOffset, typeLongInteger, sizeof (long), &offset); - if (noErr == err) - err = ::SetEventParameter (inEvent, kEventParamTextInputReplyRegionClass, typeShortInteger, sizeof (short), ®ionClass); - } - else - { - // not this pane! - err = eventNotHandledErr; - ExtInput::activate (data->view, false); - } - - } - return err; -} - -static OSErr handleTSMGetText (TSMData* data, EventRef inEvent) -{ - char* buf = getTextPortion (data, data->selStart, data->selLength); - -#if LOG_TSM - fprintf (logFile, "kEventTextInputGetSelectedText:\n" - " Text: \"%s\"\n", buf); - fflush (logFile); -#endif - OSStatus status = ::SetEventParameter (inEvent, kEventParamTextInputReplyText, typeUTF8Text, data->selLength, buf); - delete [] buf; - return status; -} - -static pascal OSStatus doHandleTSM (EventHandlerCallRef, EventRef inEvent, void* userData) -{ - TSMData* data = (TSMData*) userData; - - OSStatus err = eventNotHandledErr; - - switch (::GetEventKind (inEvent)) - { - case kEventTextInputUpdateActiveInputArea: - // Make sure that input has been started - startInput (data); - err = handleTSMUpdateActiveInputArea (data, inEvent); - break; -// case kEventTextInputUnicodeForKeyEvent: -// err = handleTSMUnicodeInput (inEvent); -// break; - case kEventTextInputOffsetToPos: - err = handleTSMOffset2Pos (data, inEvent); - break; - case kEventTextInputPosToOffset: - err = handleTSMPos2Offset (data, inEvent); - break; - case kEventTextInputGetSelectedText: - // Make sure that input has been started - startInput (data, false); - err = handleTSMGetText (data, inEvent); - break; - } - return err; -} - diff --git a/macosx/ExtInput.h b/macosx/ExtInput.h deleted file mode 100644 index 0179e83b9..000000000 --- a/macosx/ExtInput.h +++ /dev/null @@ -1,64 +0,0 @@ -/******************************************************************************* - -Copyright (c) 2007 Adobe Systems Incorporated - -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. - -********************************************************************************/ - -#ifndef _ExtInput_h -#define _ExtInput_h - -#include <Carbon/Carbon.h> -#include "Scintilla.h" - -namespace Scintilla -{ - -/** -The ExtInput class provides TSM input services to Scintilla. -It uses the indicators 0 and 1 (see SCI_INDICSETSTYLE) to apply -underlines to partially converted text. -*/ - -class ExtInput -{ -public: - /** - Attach extended input to a HIView with attached Scintilla. This installs the needed - event handlers etc. - */ - static void attach (HIViewRef ref); - /** - Detach extended input from a HIViewwith attached Scintilla. - */ - static void detach (HIViewRef ref); - /** - Activate or deactivate extended input. This method should be called whenever - the view gains or loses focus. - */ - static void activate (HIViewRef ref, bool on); - /** - Terminate extended input. - */ - static void stop (HIViewRef ref); -}; - -} // end namespace - -#endif diff --git a/macosx/PlatMacOSX.cxx b/macosx/PlatMacOSX.cxx deleted file mode 100644 index 381be992d..000000000 --- a/macosx/PlatMacOSX.cxx +++ /dev/null @@ -1,1861 +0,0 @@ -// Scintilla source code edit control -// PlatMacOSX.cxx - implementation of platform facilities on MacOS X/Carbon -// Based on work by Evan Jones (c) 2002 <ejones@uwaterloo.ca> -// Based on PlatGTK.cxx Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org> -// The License.txt file describes the conditions under which this software may be distributed. - -#include <cstring> -#include <cstdio> -#include <cstdlib> - -#include <assert.h> - -#include <sys/time.h> - -#include <vector> -#include <map> - -#include <Carbon/Carbon.h> -#include "QuartzTextLayout.h" -#include "TCarbonEvent.h" - -#include "Platform.h" -#include "Scintilla.h" -#include "PlatMacOSX.h" -#include "XPM.h" - -using namespace Scintilla; - -#include "ScintillaWidget.h" - - -extern sptr_t scintilla_send_message(void* sci, unsigned int iMessage, uptr_t wParam, sptr_t lParam); - -inline CGRect PRectangleToCGRect( PRectangle& rc ) { - return CGRectMake( rc.left, rc.top, rc.Width(), rc.Height() ); -} - -inline PRectangle CGRectToPRectangle( const CGRect& rect ) { - PRectangle rc; - rc.left = (int)( rect.origin.x + 0.5 ); - rc.top = (int)( rect.origin.y + 0.5 ); - rc.right = (int)( rect.origin.x + rect.size.width + 0.5 ); - rc.bottom = (int)( rect.origin.y + rect.size.height + 0.5 ); - return rc; -} - -Scintilla::Point Scintilla::Point::FromLong(long lpoint) { - return Scintilla::Point( - Platform::LowShortFromLong(lpoint), - Platform::HighShortFromLong(lpoint)); -} - -// The Palette is just ignored on Mac OS X. OS X runs "Millions" or "Thousands" of colours. -Scintilla::Palette::Palette() { -} - -Scintilla::Palette::~Palette() { -} - -void Scintilla::Palette::Release() { -} - -// Do nothing if it "wants" a colour. Copy the colour from desired to allocated if it is "finding" a colour. -void Scintilla::Palette::WantFind(ColourPair &cp, bool want) { - if (want) { - } else { - cp.allocated.Set(cp.desired.AsLong()); - } -} - -void Scintilla::Palette::Allocate(Window &/*w*/) { - // OS X always runs in thousands or millions of colours -} - -Font::Font() : fid(0) {} - -Font::~Font() { Release(); } - - -void Font::Create(const char *faceName, int /*characterSet*/, - int size, bool bold, bool italic, int /*extraFontFlag*/) { - // TODO: How should I handle the characterSet request? - Release(); - - fid = new QuartzTextStyle(); - - // Find the font - QuartzFont font( faceName, strlen( faceName ) ); - - // We set Font, Size, Bold, Italic - QuartzTextSize textSize( size ); - QuartzTextBold isBold( bold ); - QuartzTextItalic isItalic( italic ); - - // Actually set the attributes - QuartzTextStyleAttribute* attributes[] = { &font, &textSize, &isBold, &isItalic }; - reinterpret_cast<QuartzTextStyle*>( fid )->setAttributes( attributes, sizeof( attributes ) / sizeof( *attributes ) ); - - //ATSStyleRenderingOptions rendering = kATSStyleNoAntiAliasing; - //reinterpret_cast<QuartzTextStyle*>( fid )->setAttribute( kATSUStyleRenderingOptionsTag, sizeof( rendering ), &rendering ); - - // TODO: Why do I have to manually set this? - reinterpret_cast<QuartzTextStyle*>( fid )->setFontFeature( kLigaturesType, kCommonLigaturesOffSelector ); -} - -void Font::Release() { - if (fid) - delete reinterpret_cast<QuartzTextStyle*>( fid ); - - fid = 0; -} - -SurfaceImpl::SurfaceImpl() { - bitmapData = NULL; // Release will try and delete bitmapData if != NULL - gc = NULL; - textLayout = new QuartzTextLayout(NULL); - Release(); -} - -SurfaceImpl::~SurfaceImpl() { - Release(); - delete textLayout; -} - -void SurfaceImpl::Release() { - textLayout->setContext (NULL); - if ( bitmapData != NULL ) - { - delete[] bitmapData; - // We only "own" the graphics context if we are a bitmap context - if ( gc != NULL ) CGContextRelease( gc ); - } - bitmapData = NULL; - gc = NULL; - - bitmapWidth = 0; - bitmapHeight = 0; - x = 0; - y = 0; - //inited = false; -} - -bool SurfaceImpl::Initialised() { - // We are initalised if the graphics context is not null - return gc != NULL;// || port != NULL; -} - -void SurfaceImpl::Init(WindowID /*wid*/) { - // To be able to draw, the surface must get a CGContext handle. We save the graphics port, - // then aquire/release the context on an as-need basis (see above). - // XXX Docs on QDBeginCGContext are light, a better way to do this would be good. - // AFAIK we should not hold onto a context retrieved this way, thus the need for - // aquire/release of the context. - - Release(); -} - -void SurfaceImpl::Init(SurfaceID sid, WindowID /*wid*/) { - Release(); - gc = reinterpret_cast<CGContextRef>( sid ); - CGContextSetLineWidth( gc, 1.0 ); - textLayout->setContext (gc); -} - -void SurfaceImpl::InitPixMap(int width, int height, Surface* /*surface_*/, WindowID /*wid*/) { - Release(); - // Create a new bitmap context, along with the RAM for the bitmap itself - bitmapWidth = width; - bitmapHeight = height; - - const int bitmapBytesPerRow = (width * BYTES_PER_PIXEL); - const int bitmapByteCount = (bitmapBytesPerRow * height); - - // create an RGB color space - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - if( colorSpace == NULL ) - return; - - // create the bitmap - bitmapData = new uint8_t[ bitmapByteCount ]; - if( bitmapData != NULL ) { - // create the context - gc = CGBitmapContextCreate( bitmapData, - width, - height, - BITS_PER_COMPONENT, - bitmapBytesPerRow, - colorSpace, - kCGImageAlphaPremultipliedLast); - - if( gc == NULL ) { - // the context couldn't be created for some reason, - // and we have no use for the bitmap without the context - delete[] bitmapData; - bitmapData = NULL; - } - textLayout->setContext (gc); - } - - // the context retains the color space, so we can release it - CGColorSpaceRelease( colorSpace ); - - if ( gc != NULL && bitmapData != NULL ) - { - // "Erase" to white - CGContextClearRect( gc, CGRectMake( 0, 0, width, height ) ); - CGContextSetRGBFillColor( gc, 1.0, 1.0, 1.0, 1.0 ); - CGContextFillRect( gc, CGRectMake( 0, 0, width, height ) ); - } -} - -void SurfaceImpl::PenColour(ColourAllocated fore) { - if (gc) { - ColourDesired colour( fore.AsLong() ); - - // Set the Stroke color to match - CGContextSetRGBStrokeColor( gc, colour.GetRed() / 255.0, colour.GetGreen() / 255.0, colour.GetBlue() / 255.0, 1.0 ); - } -} - -void SurfaceImpl::FillColour(const ColourAllocated& back) { - if (gc) { - ColourDesired colour( back.AsLong() ); - - // Set the Fill color to match - CGContextSetRGBFillColor( gc, colour.GetRed() / 255.0, colour.GetGreen() / 255.0, colour.GetBlue() / 255.0, 1.0 ); - } -} - -CGImageRef SurfaceImpl::GetImage() { - // For now, assume that GetImage can only be called on PixMap surfaces - if ( bitmapData == NULL ) return NULL; - - CGContextFlush( gc ); - - // create an RGB color space - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - if( colorSpace == NULL ) - return NULL; - - const int bitmapBytesPerRow = ((int) bitmapWidth * BYTES_PER_PIXEL); - const int bitmapByteCount = (bitmapBytesPerRow * (int) bitmapHeight); - - // Create a data provider - CGDataProviderRef dataProvider = CGDataProviderCreateWithData( NULL, bitmapData, bitmapByteCount, NULL ); - CGImageRef image = NULL; - if ( dataProvider != NULL ) - { - // create the CGImage - image = CGImageCreate( bitmapWidth, - bitmapHeight, - BITS_PER_COMPONENT, - BITS_PER_PIXEL, - bitmapBytesPerRow, - colorSpace, - kCGImageAlphaPremultipliedLast, - dataProvider, - NULL, - 0, - kCGRenderingIntentDefault ); - } - - // the image retains the color space, so we can release it - CGColorSpaceRelease( colorSpace ); - colorSpace = NULL; - - // Done with the data provider - CGDataProviderRelease( dataProvider ); - dataProvider = NULL; - - return image; -} - -int SurfaceImpl::LogPixelsY() { - return 72; -} - -int SurfaceImpl::DeviceHeightFont(int points) { - int logPix = LogPixelsY(); - return (points * logPix + logPix / 2) / 72; -} - -void SurfaceImpl::MoveTo(int x_, int y_) { - x = x_; - y = y_; -} - -void SurfaceImpl::LineTo(int x_, int y_) { - CGContextBeginPath( gc ); - // Because Quartz is based on floating point, lines are drawn with half their colour - // on each side of the line. Integer coordinates specify the INTERSECTION of the pixel - // divison lines. If you specify exact pixel values, you get a line that - // is twice as thick but half as intense. To get pixel aligned rendering, - // we render the "middle" of the pixels by adding 0.5 to the coordinates. - CGContextMoveToPoint( gc, x + 0.5, y + 0.5 ); - CGContextAddLineToPoint( gc, x_ + 0.5, y_ + 0.5 ); - CGContextStrokePath( gc ); - x = x_; - y = y_; -} - -void SurfaceImpl::Polygon(Scintilla::Point *pts, int npts, ColourAllocated fore, - ColourAllocated back) { - // Allocate memory for the array of points - CGPoint *points = new CGPoint[ npts ]; - - for (int i = 0;i < npts;i++) { - // Quartz floating point issues: plot the MIDDLE of the pixels - points[i].x = pts[i].x + 0.5; - points[i].y = pts[i].y + 0.5; - } - - CGContextBeginPath( gc ); - - // Set colours - FillColour(back); - PenColour(fore); - - // Draw the polygon - CGContextAddLines( gc, points, npts ); - // Explicitly close the path, so it is closed for stroking AND filling (implicit close = filling only) - CGContextClosePath( gc ); - CGContextDrawPath( gc, kCGPathFillStroke ); - - // Deallocate memory - delete [] points; - points = NULL; -} - -void SurfaceImpl::RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back) { - if ( gc ) { - CGContextBeginPath( gc ); - FillColour(back); - PenColour(fore); - - // Quartz integer -> float point conversion fun (see comment in SurfaceImpl::LineTo) - // We subtract 1 from the Width() and Height() so that all our drawing is within the area defined - // by the PRectangle. Otherwise, we draw one pixel too far to the right and bottom. - CGContextAddRect( gc, CGRectMake( rc.left + 0.5, rc.top + 0.5, rc.Width() - 1, rc.Height() - 1 ) ); - CGContextDrawPath( gc, kCGPathFillStroke ); - } -} - -void SurfaceImpl::FillRectangle(PRectangle rc, ColourAllocated back) { - if ( gc ) { - //CGContextBeginPath( gc ); - FillColour(back); - - CGRect rect = PRectangleToCGRect( rc ); - - CGContextFillRect( gc, rect ); - //CGContextDrawPath( gc, kCGPathFill ); - } -} - -void drawImageRefCallback( CGImageRef pattern, CGContextRef gc ) -{ - CGContextDrawImage( gc, CGRectMake( 0, 0, CGImageGetWidth( pattern ), CGImageGetHeight( pattern ) ), pattern ); -} - -void SurfaceImpl::FillRectangle(PRectangle rc, Surface &surfacePattern) { - SurfaceImpl& patternSurface = static_cast<SurfaceImpl &>(surfacePattern); - - // For now, assume that copy can only be called on PixMap surfaces - // Shows up black - CGImageRef image = patternSurface.GetImage(); - if ( image == NULL ) - { - FillRectangle(rc, ColourAllocated(0)); - return; - } - - const CGPatternCallbacks drawImageCallbacks = { 0, reinterpret_cast<CGPatternDrawPatternCallback>( drawImageRefCallback ), NULL }; - - CGPatternRef pattern = CGPatternCreate( image, - CGRectMake( 0, 0, patternSurface.bitmapWidth, patternSurface.bitmapHeight ), - CGAffineTransformIdentity, - patternSurface.bitmapWidth, - patternSurface.bitmapHeight, - kCGPatternTilingNoDistortion, - true, - &drawImageCallbacks - ); - if( pattern != NULL ) { - - // Create a pattern color space - CGColorSpaceRef colorSpace = CGColorSpaceCreatePattern( NULL ); - if( colorSpace != NULL ) { - - CGContextSaveGState( gc ); - CGContextSetFillColorSpace( gc, colorSpace ); - - // Unlike the documentation, you MUST pass in a "components" parameter: - // For coloured patterns it is the alpha value. - const float alpha = 1.0; - CGContextSetFillPattern( gc, pattern, &alpha ); - CGContextFillRect( gc, PRectangleToCGRect( rc ) ); - CGContextRestoreGState( gc ); - // Free the color space, the pattern and image - CGColorSpaceRelease( colorSpace ); - } /* colorSpace != NULL */ - colorSpace = NULL; - CGPatternRelease( pattern ); - pattern = NULL; - CGImageRelease( image ); - image = NULL; - } /* pattern != NULL */ -} - -void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back) { - // This is only called from the margin marker drawing code for SC_MARK_ROUNDRECT - // The Win32 version does - // ::RoundRect(hdc, rc.left + 1, rc.top, rc.right - 1, rc.bottom, 8, 8 ); - // which is a rectangle with rounded corners each having a radius of 4 pixels. - // It would be almost as good just cutting off the corners with lines at - // 45 degrees as is done on GTK+. - - // Create a rectangle with semicircles at the corners - const int MAX_RADIUS = 4; - int radius = Platform::Minimum( MAX_RADIUS, rc.Height()/2 ); - radius = Platform::Minimum( radius, rc.Width()/2 ); - - // Points go clockwise, starting from just below the top left - // Corners are kept together, so we can easily create arcs to connect them - CGPoint corners[4][3] = - { - { - { rc.left, rc.top + radius }, - { rc.left, rc.top }, - { rc.left + radius, rc.top }, - }, - { - { rc.right - radius - 1, rc.top }, - { rc.right - 1, rc.top }, - { rc.right - 1, rc.top + radius }, - }, - { - { rc.right - 1, rc.bottom - radius - 1 }, - { rc.right - 1, rc.bottom - 1 }, - { rc.right - radius - 1, rc.bottom - 1 }, - }, - { - { rc.left + radius, rc.bottom - 1 }, - { rc.left, rc.bottom - 1 }, - { rc.left, rc.bottom - radius - 1 }, - }, - }; - - // Align the points in the middle of the pixels - for( int i = 0; i < 4*3; ++ i ) - { - CGPoint* c = (CGPoint*) corners; - c[i].x += 0.5; - c[i].y += 0.5; - } - - PenColour( fore ); - FillColour( back ); - - // Move to the last point to begin the path - CGContextBeginPath( gc ); - CGContextMoveToPoint( gc, corners[3][2].x, corners[3][2].y ); - - for ( int i = 0; i < 4; ++ i ) - { - CGContextAddLineToPoint( gc, corners[i][0].x, corners[i][0].y ); - CGContextAddArcToPoint( gc, corners[i][1].x, corners[i][1].y, corners[i][2].x, corners[i][2].y, radius ); - } - - // Close the path to enclose it for stroking and for filling, then draw it - CGContextClosePath( gc ); - CGContextDrawPath( gc, kCGPathFillStroke ); -} - -void Scintilla::SurfaceImpl::AlphaRectangle(PRectangle rc, int /*cornerSize*/, ColourAllocated fill, int alphaFill, - ColourAllocated /*outline*/, int /*alphaOutline*/, int /*flags*/) -{ - if ( gc ) { - ColourDesired colour( fill.AsLong() ); - - // Set the Fill color to match - CGContextSetRGBFillColor( gc, colour.GetRed() / 255.0, colour.GetGreen() / 255.0, colour.GetBlue() / 255.0, alphaFill / 255.0 ); - CGRect rect = PRectangleToCGRect( rc ); - CGContextFillRect( gc, rect ); - } -} - -void SurfaceImpl::DrawRGBAImage(PRectangle /* rc */, int /* width */, int /* height */, const unsigned char * /* pixelsImage*/) { - // Not supported for Carbon -} - -void SurfaceImpl::Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back) { - // Drawing an ellipse with bezier curves. Code modified from: - // http://www.codeguru.com/gdi/ellipse.shtml - // MAGICAL CONSTANT to map ellipse to beziers 2/3*(sqrt(2)-1) - const double EToBConst = 0.2761423749154; - - CGSize offset = CGSizeMake((int)(rc.Width() * EToBConst), (int)(rc.Height() * EToBConst)); - CGPoint centre = CGPointMake((rc.left + rc.right) / 2, (rc.top + rc.bottom) / 2); - - // The control point array - CGPoint cCtlPt[13]; - - // Assign values to all the control points - cCtlPt[0].x = - cCtlPt[1].x = - cCtlPt[11].x = - cCtlPt[12].x = rc.left + 0.5; - cCtlPt[5].x = - cCtlPt[6].x = - cCtlPt[7].x = rc.right - 0.5; - cCtlPt[2].x = - cCtlPt[10].x = centre.x - offset.width + 0.5; - cCtlPt[4].x = - cCtlPt[8].x = centre.x + offset.width + 0.5; - cCtlPt[3].x = - cCtlPt[9].x = centre.x + 0.5; - - cCtlPt[2].y = - cCtlPt[3].y = - cCtlPt[4].y = rc.top + 0.5; - cCtlPt[8].y = - cCtlPt[9].y = - cCtlPt[10].y = rc.bottom - 0.5; - cCtlPt[7].y = - cCtlPt[11].y = centre.y + offset.height + 0.5; - cCtlPt[1].y = - cCtlPt[5].y = centre.y - offset.height + 0.5; - cCtlPt[0].y = - cCtlPt[12].y = - cCtlPt[6].y = centre.y + 0.5; - - FillColour(back); - PenColour(fore); - - CGContextBeginPath( gc ); - CGContextMoveToPoint( gc, cCtlPt[0].x, cCtlPt[0].y ); - - for ( int i = 1; i < 13; i += 3 ) - { - CGContextAddCurveToPoint( gc, cCtlPt[i].x, cCtlPt[i].y, cCtlPt[i+1].x, cCtlPt[i+1].y, cCtlPt[i+2].x, cCtlPt[i+2].y ); - } - - // Close the path to enclose it for stroking and for filling, then draw it - CGContextClosePath( gc ); - CGContextDrawPath( gc, kCGPathFillStroke ); -} - -void SurfaceImpl::CopyImageRectangle(Surface &surfaceSource, PRectangle srcRect, PRectangle dstRect) -{ - SurfaceImpl& source = static_cast<SurfaceImpl &>(surfaceSource); - CGImageRef image = source.GetImage(); - - CGRect src = PRectangleToCGRect(srcRect); - CGRect dst = PRectangleToCGRect(dstRect); - - /* source from QuickDrawToQuartz2D.pdf on developer.apple.com */ - float w = (float) CGImageGetWidth(image); - float h = (float) CGImageGetHeight(image); - CGRect drawRect = CGRectMake (0, 0, w, h); - if (!CGRectEqualToRect (src, dst)) - { - float sx = CGRectGetWidth(dst) / CGRectGetWidth(src); - float sy = CGRectGetHeight(dst) / CGRectGetHeight(src); - float dx = CGRectGetMinX(dst) - (CGRectGetMinX(src) * sx); - float dy = CGRectGetMinY(dst) - (CGRectGetMinY(src) * sy); - drawRect = CGRectMake (dx, dy, w*sx, h*sy); - } - CGContextSaveGState (gc); - CGContextClipToRect (gc, dst); - CGContextDrawImage (gc, drawRect, image); - CGContextRestoreGState (gc); -} - -void SurfaceImpl::Copy(PRectangle rc, Scintilla::Point from, Surface &surfaceSource) { - // Maybe we have to make the Surface two contexts: - // a bitmap context which we do all the drawing on, and then a "real" context - // which we copy the output to when we call "Synchronize". Ugh! Gross and slow! - - // For now, assume that copy can only be called on PixMap surfaces - SurfaceImpl& source = static_cast<SurfaceImpl &>(surfaceSource); - - // Get the CGImageRef - CGImageRef image = source.GetImage(); - // If we could not get an image reference, fill the rectangle black - if ( image == NULL ) - { - FillRectangle( rc, ColourAllocated( 0 ) ); - return; - } - - // Now draw the image on the surface - - // Some fancy clipping work is required here: draw only inside of rc - CGContextSaveGState( gc ); - CGContextClipToRect( gc, PRectangleToCGRect( rc ) ); - - //Platform::DebugPrintf(stderr, "Copy: CGContextDrawImage: (%d, %d) - (%d X %d)\n", rc.left - from.x, rc.top - from.y, source.bitmapWidth, source.bitmapHeight ); - CGContextDrawImage( gc, CGRectMake( rc.left - from.x, rc.top - from.y, source.bitmapWidth, source.bitmapHeight ), image ); - - // Undo the clipping fun - CGContextRestoreGState( gc ); - - // Done with the image - CGImageRelease( image ); - image = NULL; -} - -void SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font_, int ybase, const char *s, int len, - ColourAllocated fore, ColourAllocated back) { - - FillRectangle(rc, back); - DrawTextTransparent( rc, font_, ybase, s, len, fore ); -} - -void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len, - ColourAllocated fore, ColourAllocated back) { - - CGContextSaveGState( gc ); - CGContextClipToRect( gc, PRectangleToCGRect( rc ) ); - DrawTextNoClip( rc, font_, ybase, s, len, fore, back ); - CGContextRestoreGState( gc ); -} - -void SurfaceImpl::DrawTextTransparent(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore) { - textLayout->setText (reinterpret_cast<const UInt8*>(s), len, *reinterpret_cast<QuartzTextStyle*>(font_.GetID())); - - // The Quartz RGB fill color influences the ATSUI color - FillColour(fore); - // Draw the text, with the Y axis flipped - textLayout->draw( rc.left, ybase, true ); -} - -void SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len, int *positions) { - // sample at http://developer.apple.com/samplecode/ATSUICurveAccessDemo/listing1.html - // sample includes use of ATSUGetGlyphInfo which would be better for older - // OSX systems. We should expand to using that on older systems as well. - for (int i = 0; i < len; i++) - positions [i] = 0; - - // We need the right X coords, so we have to append a char to get the left coord of thast extra char - char* buf = (char*) malloc (len+1); - if (!buf) - return; - - memcpy (buf, s, len); - buf [len] = '.'; - - textLayout->setText (reinterpret_cast<const UInt8*>(buf), len+1, *reinterpret_cast<QuartzTextStyle*>(font_.GetID())); - ATSUGlyphInfoArray* theGlyphInfoArrayPtr; - ByteCount theArraySize; - - // Get the GlyphInfoArray - ATSUTextLayout layout = textLayout->getLayout(); - if ( noErr == ATSUGetGlyphInfo (layout, 0, textLayout->getLength(), &theArraySize, NULL)) - { - theGlyphInfoArrayPtr = (ATSUGlyphInfoArray *) malloc (theArraySize + sizeof(ItemCount) + sizeof(ATSUTextLayout)); - if (theGlyphInfoArrayPtr) - { - if (noErr == ATSUGetGlyphInfo (layout, 0, textLayout->getLength(), &theArraySize, theGlyphInfoArrayPtr)) - { - // do not count the first item, which is at the beginning of the line - for ( UniCharCount unicodePosition = 1, i = 0; i < len && unicodePosition < theGlyphInfoArrayPtr->numGlyphs; unicodePosition ++ ) - { - // The ideal position is the x coordinate of the glyph, relative to the beginning of the line - int position = (int)( theGlyphInfoArrayPtr->glyphs[unicodePosition].idealX + 0.5 ); // These older APIs return float values - unsigned char uch = s[i]; - positions[i++] = position; - - // If we are using unicode (UTF8), map the Unicode position back to the UTF8 characters, - // as 1 unicode character can map to multiple UTF8 characters. - // See: http://www.tbray.org/ongoing/When/200x/2003/04/26/UTF - // Or: http://www.cl.cam.ac.uk/~mgk25/unicode.html - if ( unicodeMode ) - { - unsigned char mask = 0xc0; - int count = 1; - // Add one additonal byte for each extra high order one in the byte - while ( uch >= mask && count < 8 ) - { - positions[i++] = position; - count ++; - mask = mask >> 1 | 0x80; // add an additional one in the highest order position - } - } - } - } - - // Free the GlyphInfoArray - free (theGlyphInfoArrayPtr); - } - } - free (buf); -} - -int SurfaceImpl::WidthText(Font &font_, const char *s, int len) { - if (font_.GetID()) - { - textLayout->setText (reinterpret_cast<const UInt8*>(s), len, *reinterpret_cast<QuartzTextStyle*>(font_.GetID())); - - // TODO: Maybe I should add some sort of text measurement features to QuartzTextLayout? - unsigned long actualNumberOfBounds = 0; - ATSTrapezoid glyphBounds; - - // We get a single bound, since the text should only require one. If it requires more, there is an issue - if ( ATSUGetGlyphBounds( textLayout->getLayout(), 0, 0, kATSUFromTextBeginning, kATSUToTextEnd, kATSUseDeviceOrigins, 1, &glyphBounds, &actualNumberOfBounds ) != noErr || actualNumberOfBounds != 1 ) - { - Platform::DebugDisplay( "ATSUGetGlyphBounds failed in WidthText" ); - return 0; - } - - //Platform::DebugPrintf( "WidthText: \"%*s\" = %ld\n", len, s, Fix2Long( glyphBounds.upperRight.x - glyphBounds.upperLeft.x ) ); - return Fix2Long( glyphBounds.upperRight.x - glyphBounds.upperLeft.x ); - } - return 1; -} - -int SurfaceImpl::WidthChar(Font &font_, char ch) { - char str[2] = { ch, '\0' }; - if (font_.GetID()) - { - textLayout->setText (reinterpret_cast<const UInt8*>(str), 1, *reinterpret_cast<QuartzTextStyle*>(font_.GetID())); - - // TODO: Maybe I should add some sort of text measurement features to QuartzTextLayout? - unsigned long actualNumberOfBounds = 0; - ATSTrapezoid glyphBounds; - - // We get a single bound, since the text should only require one. If it requires more, there is an issue - if ( ATSUGetGlyphBounds( textLayout->getLayout(), 0, 0, kATSUFromTextBeginning, kATSUToTextEnd, kATSUseDeviceOrigins, 1, &glyphBounds, &actualNumberOfBounds ) != noErr || actualNumberOfBounds != 1 ) - { - Platform::DebugDisplay( "ATSUGetGlyphBounds failed in WidthChar" ); - return 0; - } - - return Fix2Long( glyphBounds.upperRight.x - glyphBounds.upperLeft.x ); - } - else - return 1; -} - -// Three possible strategies for determining ascent and descent of font: -// 1) Call ATSUGetGlyphBounds with string containing all letters, numbers and punctuation. -// 2) Use the ascent and descent fields of the font. -// 3) Call ATSUGetGlyphBounds with string as 1 but also including accented capitals. -// Smallest values given by 1 and largest by 3 with 2 in between. -// Techniques 1 and 2 sometimes chop off extreme portions of ascenders and -// descenders but are mostly OK except for accented characters which are -// rarely used in code. - -// This string contains a good range of characters to test for size. -const char sizeString[] = "`~!@#$%^&*()-_=+\\|[]{};:\"\'<,>.?/1234567890" - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - -int SurfaceImpl::Ascent(Font &font_) { - if (!font_.GetID()) - return 1; - - ATSUTextMeasurement ascent = reinterpret_cast<QuartzTextStyle*>( font_.GetID() )->getAttribute<ATSUTextMeasurement>( kATSUAscentTag ); - return Fix2Long( ascent ); -} - -int SurfaceImpl::Descent(Font &font_) { - if (!font_.GetID()) - return 1; - - ATSUTextMeasurement descent = reinterpret_cast<QuartzTextStyle*>( font_.GetID() )->getAttribute<ATSUTextMeasurement>( kATSUDescentTag ); - return Fix2Long( descent ); -} - -int SurfaceImpl::InternalLeading(Font &) { - // TODO: How do we get EM_Size? - // internal leading = ascent - descent - EM_size - return 0; -} - -int SurfaceImpl::ExternalLeading(Font &font_) { - if (!font_.GetID()) - return 1; - - ATSUTextMeasurement lineGap = reinterpret_cast<QuartzTextStyle*>( font_.GetID() )->getAttribute<ATSUTextMeasurement>( kATSULeadingTag ); - return Fix2Long( lineGap ); -} - -int SurfaceImpl::Height(Font &font_) { - return Ascent(font_) + Descent(font_); -} - -int SurfaceImpl::AverageCharWidth(Font &font_) { - - if (!font_.GetID()) - return 1; - - const int sizeStringLength = (sizeof( sizeString ) / sizeof( sizeString[0] ) - 1); - int width = WidthText( font_, sizeString, sizeStringLength ); - - return (int) ((width / (float) sizeStringLength) + 0.5); - - /* - ATSUStyle textStyle = reinterpret_cast<QuartzTextStyle*>( font_.GetID() )->getATSUStyle(); - ATSUFontID fontID; - - ByteCount actualSize = 0; - if ( ATSUGetAttribute( textStyle, kATSUFontTag, sizeof( fontID ), &fontID, &actualSize ) != noErr ) - { -Platform::DebugDisplay( "ATSUGetAttribute failed" ); - return 1; - } - - ATSFontMetrics metrics; - memset( &metrics, 0, sizeof( metrics ) ); - if ( ATSFontGetHorizontalMetrics( fontID, kATSOptionFlagsDefault, &metrics ) != noErr ) - { - Platform::DebugDisplay( "ATSFontGetHorizontalMetrics failed in AverageCharWidth" ); - return 1; - } - - printf( "%f %f %f\n", metrics.avgAdvanceWidth * 32, metrics.ascent * 32, metrics.descent * 32 ); - - return (int) (metrics.avgAdvanceWidth + 0.5);*/ -} - -int SurfaceImpl::SetPalette(Scintilla::Palette *, bool) { - // Mac OS X is always true colour (I think) so this doesn't matter - return 0; -} - -void SurfaceImpl::SetClip(PRectangle rc) { - CGContextClipToRect( gc, PRectangleToCGRect( rc ) ); -} - -void SurfaceImpl::FlushCachedState() { - CGContextSynchronize( gc ); -} - -void SurfaceImpl::SetUnicodeMode(bool unicodeMode_) { - unicodeMode = unicodeMode_; -} - -void SurfaceImpl::SetDBCSMode(int codePage) { - // TODO: Implement this for code pages != UTF-8 -} - -Surface *Surface::Allocate() { - return new SurfaceImpl( ); -} - -Window::~Window() { -} - -void Window::Destroy() { - if (windowRef) { - DisposeWindow(reinterpret_cast<WindowRef>( windowRef )); - } - wid = 0; -} - -bool Window::HasFocus() { - // TODO: Test this - return HIViewSubtreeContainsFocus( reinterpret_cast<HIViewRef>( wid ) ); -} - -PRectangle Window::GetPosition() { - // Before any size allocated pretend its 1000 wide so not scrolled - PRectangle rc(0, 0, 1000, 1000); - - // The frame rectangle gives the position of this view inside the parent view - if (wid) { - HIRect controlFrame; - HIViewGetFrame( reinterpret_cast<HIViewRef>( wid ), &controlFrame ); - rc = CGRectToPRectangle( controlFrame ); - } - - return rc; -} - -void Window::SetPosition(PRectangle rc) { - // Moves this view inside the parent view - if ( wid ) - { - // Set the frame on the view, the function handles the rest - CGRect r = PRectangleToCGRect( rc ); - HIViewSetFrame( reinterpret_cast<HIViewRef>( wid ), &r ); - } -} - -void Window::SetPositionRelative(PRectangle rc, Window window) { - // used to actually move child windows (ie. listbox/calltip) so we have to move - // the window, not the hiview - if (windowRef) { - // we go through some contortions here to get an accurate location for our - // child windows. This is necessary due to the multiple ways an embedding - // app may be setup. See SciTest/main.c (GOOD && BAD) for test case. - WindowRef relativeWindow = GetControlOwner(reinterpret_cast<HIViewRef>( window.GetID() )); - WindowRef thisWindow = reinterpret_cast<WindowRef>( windowRef ); - - Rect portBounds; - ::GetWindowBounds(relativeWindow, kWindowStructureRgn, &portBounds); - //fprintf(stderr, "portBounds %d %d %d %d\n", portBounds.left, portBounds.top, portBounds.right, portBounds.bottom); - PRectangle hbounds = window.GetPosition(); - //fprintf(stderr, "hbounds %d %d %d %d\n", hbounds.left, hbounds.top, hbounds.right, hbounds.bottom); - HIViewRef parent = HIViewGetSuperview(reinterpret_cast<HIViewRef>( window.GetID() )); - Rect pbounds; - GetControlBounds(parent, &pbounds); - //fprintf(stderr, "pbounds %d %d %d %d\n", pbounds.left, pbounds.top, pbounds.right, pbounds.bottom); - - PRectangle bounds; - bounds.top = portBounds.top + pbounds.top + hbounds.top + rc.top; - bounds.bottom = bounds.top + rc.Height(); - bounds.left = portBounds.left + pbounds.left + hbounds.left + rc.left; - bounds.right = bounds.left + rc.Width(); - //fprintf(stderr, "bounds %d %d %d %d\n", bounds.left, bounds.top, bounds.right, bounds.bottom); - - MoveWindow(thisWindow, bounds.left, bounds.top, false); - SizeWindow(thisWindow, bounds.Width(), bounds.Height(), true); - - SetPosition(PRectangle(0,0,rc.Width(),rc.Height())); - } else { - SetPosition(rc); - } -} - -PRectangle Window::GetClientPosition() { - // This means, in MacOS X terms, get the "frame bounds". Call GetPosition, just like on Win32. - return GetPosition(); -} - -void Window::Show(bool show) { - if ( wid ) { - HIViewSetVisible( reinterpret_cast<HIViewRef>( wid ), show ); - } - // this is necessary for calltip/listbox - if (windowRef) { - WindowRef thisWindow = reinterpret_cast<WindowRef>( windowRef ); - if (show) { - ShowWindow( thisWindow ); - DrawControls( thisWindow ); - } else - HideWindow( thisWindow ); - } -} - -void Window::InvalidateAll() { - if ( wid ) { - HIViewSetNeedsDisplay( reinterpret_cast<HIViewRef>( wid ), true ); - } -} - -void Window::InvalidateRectangle(PRectangle rc) { - if (wid) { - // Create a rectangular region - RgnHandle region = NewRgn(); - SetRectRgn( region, rc.left, rc.top, rc.right, rc.bottom ); - - // Make that region invalid - HIViewSetNeedsDisplayInRegion( reinterpret_cast<HIViewRef>( wid ), region, true ); - DisposeRgn( region ); - } -} - -void Window::SetFont(Font &) { - // TODO: Do I need to implement this? MSDN: specifies the font that a control is to use when drawing text. -} - -void Window::SetCursor(Cursor curs) { - if (wid) { - // TODO: This isn't really implemented correctly. I should be using - // mouse tracking rectangles to only set the mouse cursor when it is over the control - ThemeCursor cursor; - - switch ( curs ) { - case cursorText: - cursor = kThemeIBeamCursor; - break; - case cursorArrow: - cursor = kThemeArrowCursor; - break; - case cursorWait: - cursor = kThemeWatchCursor; - break; - case cursorHoriz: - cursor = kThemeResizeLeftRightCursor; - break; - case cursorVert: - cursor = kThemeResizeUpDownCursor; - break; - case cursorReverseArrow: - case cursorUp: - default: - cursor = kThemeArrowCursor; - break; - } - - SetThemeCursor( cursor ); - } -} - -void Window::SetTitle(const char *s) { - WindowRef window = GetControlOwner(reinterpret_cast<HIViewRef>( wid )); - CFStringRef title = CFStringCreateWithCString(kCFAllocatorDefault, s, kCFStringEncodingMacRoman); - SetWindowTitleWithCFString(window, title); - CFRelease(title); -} - -PRectangle Window::GetMonitorRect(Point) { - return PRectangle(); -} - -ListBox::ListBox() {} - -ListBox::~ListBox() {} - -static const OSType scintillaListBoxType = 'sclb'; - -enum { - kItemsPerContainer = 1, - kIconColumn = 'icon', - kTextColumn = 'text' -}; -static SInt32 kScrollBarWidth = 0; - -class LineData { - int *types; - CFStringRef *strings; - int len; - int maximum; -public: - LineData() :types(0), strings(0), len(0), maximum(0) {} - ~LineData() { - Clear(); - } - void Clear() { - delete []types; - types = 0; - for (int i=0; i<maximum; i++) { - if (strings[i]) CFRelease(strings[i]); - } - delete []strings; - strings = 0; - len = 0; - maximum = 0; - } - void Add(int index, int type, CFStringRef str ) { - if (index >= maximum) { - if (index >= len) { - int lenNew = (index+1) * 2; - int *typesNew = new int[lenNew]; - CFStringRef *stringsNew = new CFStringRef[lenNew]; - for (int i=0; i<maximum; i++) { - typesNew[i] = types[i]; - stringsNew[i] = strings[i]; - } - delete []types; - delete []strings; - types = typesNew; - strings = stringsNew; - len = lenNew; - } - while (maximum < index) { - types[maximum] = 0; - strings[maximum] = 0; - maximum++; - } - } - types[index] = type; - strings[index] = str; - if (index == maximum) { - maximum++; - } - } - int GetType(int index) { - if (index < maximum) { - return types[index]; - } else { - return 0; - } - } - CFStringRef GetString(int index) { - if (index < maximum) { - return strings[index]; - } else { - return 0; - } - } -}; - -class ListBoxImpl : public ListBox { -private: - ControlRef lb; - XPMSet xset; - int lineHeight; - bool unicodeMode; - int desiredVisibleRows; - unsigned int maxItemWidth; - unsigned int aveCharWidth; - Font font; - int maxWidth; - - void InstallDataBrowserCustomCallbacks(); - void ConfigureDataBrowser(); - - static pascal OSStatus WindowEventHandler(EventHandlerCallRef inCallRef, - EventRef inEvent, - void *inUserData ); - EventHandlerRef eventHandler; - -protected: - WindowRef windowRef; - -public: - LineData ld; - CallBackAction doubleClickAction; - void *doubleClickActionData; - - ListBoxImpl() : lb(NULL), lineHeight(10), unicodeMode(false), - desiredVisibleRows(5), maxItemWidth(0), aveCharWidth(8), - doubleClickAction(NULL), doubleClickActionData(NULL) - { - if (kScrollBarWidth == 0) - GetThemeMetric(kThemeMetricScrollBarWidth, &kScrollBarWidth); - } - - ~ListBoxImpl() {}; - void SetFont(Font &font); - void Create(Window &parent, int ctrlID, Scintilla::Point pt, int lineHeight_, bool unicodeMode_); - void SetAverageCharWidth(int width); - void SetVisibleRows(int rows); - int GetVisibleRows() const; - PRectangle GetDesiredRect(); - int CaretFromEdge(); - void Clear(); - void Append(char *s, int type = -1); - int Length(); - void Select(int n); - int GetSelection(); - int Find(const char *prefix); - void GetValue(int n, char *value, int len); - void RegisterImage(int type, const char *xpm_data); - void RegisterRGBAImage(int type, int width, int height, const unsigned char *pixelsImage); - void ClearRegisteredImages(); - void SetDoubleClickAction(CallBackAction action, void *data) { - doubleClickAction = action; - doubleClickActionData = data; - } - - int IconWidth(); - void ShowHideScrollbar(); -#ifdef DB_TABLE_ROW_HEIGHT - void SetRowHeight(DataBrowserItemID itemID); -#endif - - void DrawRow(DataBrowserItemID item, - DataBrowserPropertyID property, - DataBrowserItemState itemState, - const Rect *theRect); - - void SetList(const char* list, char separator, char typesep); -}; - -ListBox *ListBox::Allocate() { - ListBoxImpl *lb = new ListBoxImpl(); - return lb; -} - -void ListBoxImpl::Create(Window &/*parent*/, int /*ctrlID*/, Scintilla::Point /*pt*/, - int lineHeight_, bool unicodeMode_) { - lineHeight = lineHeight_; - unicodeMode = unicodeMode_; - maxWidth = 2000; - - WindowClass windowClass = kHelpWindowClass; - WindowAttributes attributes = kWindowNoAttributes; - Rect contentBounds; - WindowRef outWindow; - - contentBounds.top = contentBounds.left = 0; - contentBounds.right = 100; - contentBounds.bottom = lineHeight * desiredVisibleRows; - - CreateNewWindow(windowClass, attributes, &contentBounds, &outWindow); - - InstallStandardEventHandler(GetWindowEventTarget(outWindow)); - - ControlRef root; - CreateRootControl(outWindow, &root); - - CreateDataBrowserControl(outWindow, &contentBounds, kDataBrowserListView, &lb); - -#ifdef DB_TABLE_ROW_HEIGHT - // XXX does not seem to have any effect - SetDataBrowserTableViewRowHeight(lb, lineHeight); -#endif - - // get rid of the frame, forces databrowser to the full size - // of the window - Boolean frameAndFocus = false; - SetControlData(lb, kControlNoPart, kControlDataBrowserIncludesFrameAndFocusTag, - sizeof(frameAndFocus), &frameAndFocus); - - ListBoxImpl* lbThis = this; - SetControlProperty( lb, scintillaListBoxType, 0, sizeof( this ), &lbThis ); - - ConfigureDataBrowser(); - InstallDataBrowserCustomCallbacks(); - - // install event handlers - static const EventTypeSpec kWindowEvents[] = - { - { kEventClassMouse, kEventMouseDown }, - { kEventClassMouse, kEventMouseMoved }, - }; - - eventHandler = NULL; - InstallWindowEventHandler( outWindow, WindowEventHandler, - GetEventTypeCount( kWindowEvents ), - kWindowEvents, this, &eventHandler ); - - wid = lb; - SetControlVisibility(lb, true, true); - SetControl(lb); - SetWindow(outWindow); -} - -pascal OSStatus ListBoxImpl::WindowEventHandler( - EventHandlerCallRef inCallRef, - EventRef inEvent, - void* inUserData ) -{ - - switch (GetEventClass(inEvent)) { - case kEventClassMouse: - switch (GetEventKind(inEvent)) - { - case kEventMouseMoved: - { - SetThemeCursor( kThemeArrowCursor ); - break; - } - case kEventMouseDown: - { - // we cannot handle the double click from the databrowser notify callback as - // calling doubleClickAction causes the listbox to be destroyed. It is - // safe to do it from this event handler since the destroy event will be queued - // until we're done here. - TCarbonEvent event( inEvent ); - EventMouseButton inMouseButton; - event.GetParameter<EventMouseButton>( kEventParamMouseButton, typeMouseButton, &inMouseButton ); - - UInt32 inClickCount; - event.GetParameter( kEventParamClickCount, &inClickCount ); - if (inMouseButton == kEventMouseButtonPrimary && inClickCount == 2) { - // handle our single mouse click now - ListBoxImpl* listbox = reinterpret_cast<ListBoxImpl*>( inUserData ); - const WindowRef window = GetControlOwner(listbox->lb); - const HIViewRef rootView = HIViewGetRoot( window ); - HIViewRef targetView = NULL; - HIViewGetViewForMouseEvent( rootView, inEvent, &targetView ); - if ( targetView == listbox->lb ) - { - if (listbox->doubleClickAction != NULL) { - listbox->doubleClickAction(listbox->doubleClickActionData); - } - } - } - } - } - } - return eventNotHandledErr; -} - -#ifdef DB_TABLE_ROW_HEIGHT -void ListBoxImpl::SetRowHeight(DataBrowserItemID itemID) -{ - // XXX does not seem to have any effect - SetDataBrowserTableViewItemRowHeight(lb, itemID, lineHeight); -} -#endif - -void ListBoxImpl::DrawRow(DataBrowserItemID item, - DataBrowserPropertyID property, - DataBrowserItemState itemState, - const Rect *theRect) -{ - Rect row = *theRect; - row.left = 0; - - ColourPair fore; - - if (itemState == kDataBrowserItemIsSelected) { - long systemVersion; - Gestalt( gestaltSystemVersion, &systemVersion ); - // Panther DB starts using kThemeBrushSecondaryHighlightColor for inactive browser hilighting - if ( (systemVersion >= 0x00001030) && (IsControlActive( lb ) == false) ) - SetThemePen( kThemeBrushSecondaryHighlightColor, 32, true ); - else - //SetThemePen( kThemeBrushPrimaryHighlightColor, 32, true ); - SetThemePen( kThemeBrushAlternatePrimaryHighlightColor, 32, true ); - - PaintRect(&row); - fore = ColourDesired(0xff,0xff,0xff); - } - - int widthPix = xset.GetWidth() + 2; - int pixId = ld.GetType(item - 1); - XPM *pxpm = xset.Get(pixId); - - char s[255]; - GetValue(item - 1, s, 255); - - Surface *surfaceItem = Surface::Allocate(); - if (surfaceItem) { - CGContextRef cgContext; - GrafPtr port; - Rect bounds; - - GetControlBounds(lb, &bounds); - GetPort( &port ); - QDBeginCGContext( port, &cgContext ); - - CGContextSaveGState( cgContext ); - CGContextTranslateCTM(cgContext, 0, bounds.bottom - bounds.top); - CGContextScaleCTM(cgContext, 1.0, -1.0); - - surfaceItem->Init(cgContext, NULL); - - int left = row.left; - if (pxpm) { - PRectangle rc(left + 1, row.top, - left + 1 + widthPix, row.bottom); - pxpm->Draw(surfaceItem, rc); - } - - // draw the text - PRectangle trc(left + 2 + widthPix, row.top, row.right, row.bottom); - int ascent = surfaceItem->Ascent(font) - surfaceItem->InternalLeading(font); - int ytext = trc.top + ascent + 1; - trc.bottom = ytext + surfaceItem->Descent(font) + 1; - surfaceItem->DrawTextTransparent( trc, font, ytext, s, strlen(s), fore.allocated ); - - CGContextRestoreGState( cgContext ); - QDEndCGContext( port, &cgContext ); - delete surfaceItem; - } -} - - -pascal void ListBoxDrawItemCallback(ControlRef browser, DataBrowserItemID item, - DataBrowserPropertyID property, - DataBrowserItemState itemState, - const Rect *theRect, SInt16 gdDepth, - Boolean colorDevice) -{ - if (property != kIconColumn) return; - ListBoxImpl* lbThis = NULL; - OSStatus err; - err = GetControlProperty( browser, scintillaListBoxType, 0, sizeof( lbThis ), NULL, &lbThis ); - // adjust our rect - lbThis->DrawRow(item, property, itemState, theRect); - -} - -void ListBoxImpl::ConfigureDataBrowser() -{ - DataBrowserViewStyle viewStyle; - DataBrowserSelectionFlags selectionFlags; - ::GetDataBrowserViewStyle(lb, &viewStyle); - - ::SetDataBrowserHasScrollBars(lb, false, true); - ::SetDataBrowserListViewHeaderBtnHeight(lb, 0); - ::GetDataBrowserSelectionFlags(lb, &selectionFlags); - ::SetDataBrowserSelectionFlags(lb, selectionFlags |= kDataBrowserSelectOnlyOne); - // if you change the hilite style, also change the style in ListBoxDrawItemCallback - ::SetDataBrowserTableViewHiliteStyle(lb, kDataBrowserTableViewFillHilite); - - Rect insetRect; - ::GetDataBrowserScrollBarInset(lb, &insetRect); - - insetRect.right = kScrollBarWidth - 1; - ::SetDataBrowserScrollBarInset(lb, &insetRect); - - switch (viewStyle) - { - case kDataBrowserListView: - { - DataBrowserListViewColumnDesc iconCol; - iconCol.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc; - iconCol.headerBtnDesc.minimumWidth = 0; - iconCol.headerBtnDesc.maximumWidth = maxWidth; - iconCol.headerBtnDesc.titleOffset = 0; - iconCol.headerBtnDesc.titleString = NULL; - iconCol.headerBtnDesc.initialOrder = kDataBrowserOrderIncreasing; - - iconCol.headerBtnDesc.btnFontStyle.flags = kControlUseJustMask; - iconCol.headerBtnDesc.btnFontStyle.just = teFlushLeft; - - iconCol.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly; - - iconCol.propertyDesc.propertyID = kIconColumn; - iconCol.propertyDesc.propertyType = kDataBrowserCustomType; - iconCol.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn; - - ::AddDataBrowserListViewColumn(lb, &iconCol, kDataBrowserListViewAppendColumn); - } break; - - } -} - -void ListBoxImpl::InstallDataBrowserCustomCallbacks() -{ - DataBrowserCustomCallbacks callbacks; - - callbacks.version = kDataBrowserLatestCustomCallbacks; - verify_noerr(InitDataBrowserCustomCallbacks(&callbacks)); - callbacks.u.v1.drawItemCallback = NewDataBrowserDrawItemUPP(ListBoxDrawItemCallback); - callbacks.u.v1.hitTestCallback = NULL;//NewDataBrowserHitTestUPP(ListBoxHitTestCallback); - callbacks.u.v1.trackingCallback = NULL;//NewDataBrowserTrackingUPP(ListBoxTrackingCallback); - callbacks.u.v1.editTextCallback = NULL; - callbacks.u.v1.dragRegionCallback = NULL; - callbacks.u.v1.acceptDragCallback = NULL; - callbacks.u.v1.receiveDragCallback = NULL; - - SetDataBrowserCustomCallbacks(lb, &callbacks); -} - -void ListBoxImpl::SetFont(Font &font_) { - // Having to do this conversion is LAME - QuartzTextStyle *ts = reinterpret_cast<QuartzTextStyle*>( font_.GetID() ); - ControlFontStyleRec style; - ATSUAttributeValuePtr value; - ATSUFontID fontID; - style.flags = kControlUseFontMask | kControlUseSizeMask | kControlAddToMetaFontMask; - ts->getAttribute( kATSUFontTag, sizeof(fontID), &fontID, NULL ); - ATSUFontIDtoFOND(fontID, &style.font, NULL); - ts->getAttribute( kATSUSizeTag, sizeof(Fixed), &value, NULL ); - style.size = ((SInt16)FixRound((SInt32)value)); - SetControlFontStyle(lb, &style); - -#ifdef DB_TABLE_ROW_HEIGHT - // XXX this doesn't *stick* - ATSUTextMeasurement ascent = ts->getAttribute<ATSUTextMeasurement>( kATSUAscentTag ); - ATSUTextMeasurement descent = ts->getAttribute<ATSUTextMeasurement>( kATSUDescentTag ); - lineHeight = Fix2Long( ascent ) + Fix2Long( descent ); - SetDataBrowserTableViewRowHeight(lb, lineHeight + lineLeading); -#endif - - // !@&^#%$ we cant copy Font, but we need one for our custom drawing - Str255 fontName255; - char fontName[256]; - FMGetFontFamilyName(style.font, fontName255); - - CFStringRef fontNameCF = ::CFStringCreateWithPascalString( kCFAllocatorDefault, fontName255, kCFStringEncodingMacRoman ); - ::CFStringGetCString( fontNameCF, fontName, (CFIndex)255, kCFStringEncodingMacRoman ); - - font.Create((const char *)fontName, 0, style.size, false, false); -} - -void ListBoxImpl::SetAverageCharWidth(int width) { - aveCharWidth = width; -} - -void ListBoxImpl::SetVisibleRows(int rows) { - desiredVisibleRows = rows; -} - -int ListBoxImpl::GetVisibleRows() const { - // XXX Windows & GTK do this, but it seems incorrect to me. Other logic - // to do with visible rows is essentially the same across platforms. - return desiredVisibleRows; - /* - // This would be more correct - int rows = Length(); - if ((rows == 0) || (rows > desiredVisibleRows)) - rows = desiredVisibleRows; - return rows; - */ -} - -PRectangle ListBoxImpl::GetDesiredRect() { - PRectangle rcDesired = GetPosition(); - - // XXX because setting the line height on the table doesnt - // *stick*, we'll have to suffer and just use whatever - // the table desides is the correct height. - UInt16 itemHeight;// = lineHeight; - GetDataBrowserTableViewRowHeight(lb, &itemHeight); - - int rows = Length(); - if ((rows == 0) || (rows > desiredVisibleRows)) - rows = desiredVisibleRows; - - rcDesired.bottom = itemHeight * rows; - rcDesired.right = rcDesired.left + maxItemWidth + aveCharWidth; - - if (Length() > rows) - rcDesired.right += kScrollBarWidth; - rcDesired.right += IconWidth(); - - // Set the column width - ::SetDataBrowserTableViewColumnWidth (lb, UInt16 (rcDesired.right - rcDesired.left)); - return rcDesired; -} - -void ListBoxImpl::ShowHideScrollbar() { - int rows = Length(); - if (rows > desiredVisibleRows) { - ::SetDataBrowserHasScrollBars(lb, false, true); - } else { - ::SetDataBrowserHasScrollBars(lb, false, false); - } -} - -int ListBoxImpl::IconWidth() { - return xset.GetWidth() + 2; -} - -int ListBoxImpl::CaretFromEdge() { - return 0; -} - -void ListBoxImpl::Clear() { - // passing NULL to "items" arg 4 clears the list - maxItemWidth = 0; - ld.Clear(); - AddDataBrowserItems (lb, kDataBrowserNoItem, 0, NULL, kDataBrowserItemNoProperty); -} - -void ListBoxImpl::Append(char *s, int type) { - int count = Length(); - CFStringRef r = CFStringCreateWithCString(NULL, s, kTextEncodingMacRoman); - ld.Add(count, type, r); - - Scintilla::SurfaceImpl surface; - unsigned int width = surface.WidthText (font, s, strlen (s)); - if (width > maxItemWidth) - maxItemWidth = width; - - DataBrowserItemID items[1]; - items[0] = count + 1; - AddDataBrowserItems (lb, kDataBrowserNoItem, 1, items, kDataBrowserItemNoProperty); - ShowHideScrollbar(); -} - -void ListBoxImpl::SetList(const char* list, char separator, char typesep) { - // XXX copied from PlatGTK, should be in base class - Clear(); - int count = strlen(list) + 1; - char *words = new char[count]; - if (words) { - memcpy(words, list, count); - char *startword = words; - char *numword = NULL; - int i = 0; - for (; words[i]; i++) { - if (words[i] == separator) { - words[i] = '\0'; - if (numword) - *numword = '\0'; - Append(startword, numword?atoi(numword + 1):-1); - startword = words + i + 1; - numword = NULL; - } else if (words[i] == typesep) { - numword = words + i; - } - } - if (startword) { - if (numword) - *numword = '\0'; - Append(startword, numword?atoi(numword + 1):-1); - } - delete []words; - } -} - -int ListBoxImpl::Length() { - UInt32 numItems = 0; - GetDataBrowserItemCount(lb, kDataBrowserNoItem, false, kDataBrowserItemAnyState, &numItems); - return (int)numItems; -} - -void ListBoxImpl::Select(int n) { - DataBrowserItemID items[1]; - items[0] = n + 1; - SetDataBrowserSelectedItems(lb, 1, items, kDataBrowserItemsAssign); - RevealDataBrowserItem(lb, items[0], kIconColumn, kDataBrowserRevealOnly); - // force update on selection - Draw1Control(lb); -} - -int ListBoxImpl::GetSelection() { - Handle selectedItems = NewHandle(0); - GetDataBrowserItems(lb, kDataBrowserNoItem, true, kDataBrowserItemIsSelected, selectedItems); - UInt32 numSelectedItems = GetHandleSize(selectedItems)/sizeof(DataBrowserItemID); - if (numSelectedItems == 0) { - return -1; - } - HLock( selectedItems ); - DataBrowserItemID *individualItem = (DataBrowserItemID*)( *selectedItems ); - DataBrowserItemID selected[numSelectedItems]; - selected[0] = *individualItem; - HUnlock( selectedItems ); - return selected[0] - 1; -} - -int ListBoxImpl::Find(const char *prefix) { - int count = Length(); - char s[255]; - for (int i = 0; i < count; i++) { - GetValue(i, s, 255); - if (s[0] != NULL && (0 == strncmp(prefix, s, strlen(prefix)))) { - return i; - } - } - return - 1; -} - -void ListBoxImpl::GetValue(int n, char *value, int len) { - CFStringRef textString = ld.GetString(n); - if (textString == NULL) { - value[0] = '\0'; - return; - } - CFIndex numUniChars = CFStringGetLength( textString ); - - // XXX how do we know the encoding of the listbox? - CFStringEncoding encoding = kCFStringEncodingUTF8; //( IsUnicodeMode() ? kCFStringEncodingUTF8 : kCFStringEncodingASCII); - CFIndex maximumByteLength = CFStringGetMaximumSizeForEncoding( numUniChars, encoding ) + 1; - char* text = new char[maximumByteLength]; - CFIndex usedBufferLength = 0; - CFStringGetBytes( textString, CFRangeMake( 0, numUniChars ), encoding, - '?', false, reinterpret_cast<UInt8*>( text ), - maximumByteLength, &usedBufferLength ); - text[usedBufferLength] = '\0'; // null terminate the ASCII/UTF8 string - - if (text && len > 0) { - strncpy(value, text, len); - value[len - 1] = '\0'; - } else { - value[0] = '\0'; - } - delete []text; -} - -void ListBoxImpl::RegisterImage(int type, const char *xpm_data) { - xset.Add(type, xpm_data); -} - -void ListBoxImpl::RegisterRGBAImage(int /* type */, int /* width */, int /* height */, const unsigned char * /*pixelsImage */) { - // Not supported for Carbon -} - -void ListBoxImpl::ClearRegisteredImages() { - xset.Clear(); -} - -Menu::Menu() : mid(0) { } - -void Menu::CreatePopUp() { - // TODO: Could I just feed a constant menu ID parameter, or does - // it really need to be unique? - static int nextMenuID = 1; - Destroy(); - OSStatus err; - err = CreateNewMenu( nextMenuID++, 0, reinterpret_cast<MenuRef*>( &mid ) ); -} - -void Menu::Destroy() { - if ( mid != NULL ) - { - ReleaseMenu( reinterpret_cast<MenuRef>( mid ) ); - mid = NULL; - } -} - -void Menu::Show(Point pt, Window &) { - UInt32 userSelection = 0; - SInt16 menuId = 0; - MenuItemIndex menuItem = 0; - ::Point globalPoint; - globalPoint.h = pt.x; - globalPoint.v = pt.y; - OSStatus err; - err = ContextualMenuSelect( reinterpret_cast<MenuRef>( mid ), globalPoint, - false, kCMHelpItemRemoveHelp, NULL, - NULL, &userSelection, - &menuId, - &menuItem - ); -} - -// ElapsedTime is used for precise performance measurements during development -// and not for anything a user sees. - -ElapsedTime::ElapsedTime() { - struct timeval curTime; - int retVal; - retVal = gettimeofday( &curTime, NULL ); - - bigBit = curTime.tv_sec; - littleBit = curTime.tv_usec; -} - -double ElapsedTime::Duration(bool reset) { - struct timeval curTime; - int retVal; - retVal = gettimeofday( &curTime, NULL ); - long endBigBit = curTime.tv_sec; - long endLittleBit = curTime.tv_usec; - double result = 1000000.0 * (endBigBit - bigBit); - result += endLittleBit - littleBit; - result /= 1000000.0; - if (reset) { - bigBit = endBigBit; - littleBit = endLittleBit; - } - return result; -} - -ColourDesired Platform::Chrome() { - RGBColor c; - GetThemeBrushAsColor(kThemeBrushButtonActiveDarkShadow , 24, true, &c); - return ColourDesired(c.red>>8, c.green>>8, c.blue>>8); -} - -ColourDesired Platform::ChromeHighlight() { - RGBColor c; - GetThemeBrushAsColor(kThemeBrushButtonInactiveLightShadow , 24, true, &c); - return ColourDesired(c.red>>8, c.green>>8, c.blue>>8); -} - -static Str255 PlatformDefaultFontName; -const char *Platform::DefaultFont() { - long fid = HighShortFromLong(GetScriptVariable(smCurrentScript, smScriptAppFondSize)); - FMGetFontFamilyName(fid, PlatformDefaultFontName); - char* defaultFontName = (char*) PlatformDefaultFontName; - defaultFontName[defaultFontName[0]+1] = 0; - ++defaultFontName; - - return defaultFontName; -} - -int Platform::DefaultFontSize() { - return LowShortFromLong(GetScriptVariable(smCurrentScript, smScriptAppFondSize)); -} - -unsigned int Platform::DoubleClickTime() { - // Convert from ticks to milliseconds. I think it would be better to use the events to tell us - // when we have a double and triple click, but what do I know? - return static_cast<unsigned int>( TicksToEventTime( GetDblTime() ) / kEventDurationMillisecond ); -} - -bool Platform::MouseButtonBounce() { - return false; -} - -bool Platform::IsKeyDown(int keyCode) { - return false; - // TODO: Map Scintilla/Windows key codes to Mac OS X key codes - // TODO: Do I need this? - /* - // Inspired by code at: http://www.sover.net/~jams/Morgan/docs/GameInputMethods.txt - - // Get the keys - KeyMap keys; - GetKeys( keys ); - - // Calculate the key map index - long keyMapIndex = keys[keyCode/8]; - // Calculate the individual bit to check - short bitToCheck = keyCode % 8; - // Check the status of the key - return ( keyMapIndex >> bitToCheck ) & 0x01; - */ -} - -long Platform::SendScintilla(WindowID w, unsigned int msg, unsigned long wParam, long lParam) { - return scintilla_send_message( w, msg, wParam, lParam ); -} - -bool Platform::IsDBCSLeadByte(int /*codePage*/, char /*ch*/) { - // TODO: Implement this for code pages != UTF-8 - return false; -} - -int Platform::DBCSCharLength(int /*codePage*/, const char* /*s*/) { - // TODO: Implement this for code pages != UTF-8 - return 1; -} - -int Platform::DBCSCharMaxLength() { - // TODO: Implement this for code pages != UTF-8 - //return CFStringGetMaximumSizeForEncoding( 1, CFStringEncoding encoding ); - return 2; -} - -// These are utility functions not really tied to a platform -int Platform::Minimum(int a, int b) { - if (a < b) - return a; - else - return b; -} - -int Platform::Maximum(int a, int b) { - if (a > b) - return a; - else - return b; -} - -//#define TRACE -#ifdef TRACE - -void Platform::DebugDisplay(const char *s) { - fprintf( stderr, s ); -} - -void Platform::DebugPrintf(const char *format, ...) { - const int BUF_SIZE = 2000; - char buffer[BUF_SIZE]; - - va_list pArguments; - va_start(pArguments, format); - vsnprintf(buffer, BUF_SIZE, format, pArguments); - va_end(pArguments); - Platform::DebugDisplay(buffer); -} - -#else - -void Platform::DebugDisplay(const char *) {} - -void Platform::DebugPrintf(const char *, ...) {} - -#endif - -// Not supported for GTK+ -static bool assertionPopUps = true; - -bool Platform::ShowAssertionPopUps(bool assertionPopUps_) { - bool ret = assertionPopUps; - assertionPopUps = assertionPopUps_; - return ret; -} - -void Platform::Assert(const char *c, const char *file, int line) { - char buffer[2000]; - sprintf(buffer, "Assertion [%s] failed at %s %d", c, file, line); - strcat(buffer, "\r\n"); - Platform::DebugDisplay(buffer); -#ifdef DEBUG - // Jump into debugger in assert on Mac (CL269835) - ::Debugger(); -#endif -} - -int Platform::Clamp(int val, int minVal, int maxVal) { - if (val > maxVal) - val = maxVal; - if (val < minVal) - val = minVal; - return val; -} diff --git a/macosx/PlatMacOSX.h b/macosx/PlatMacOSX.h deleted file mode 100644 index 492c0d18a..000000000 --- a/macosx/PlatMacOSX.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef PLATMACOSX_H -#define PLATMACOSX_H - -#include <cstring> -#include <cstdio> -#include <cstdlib> - -#include <assert.h> - -#include <sys/time.h> - -#include <Carbon/Carbon.h> -#include "QuartzTextLayout.h" - -#include "Platform.h" -#include "Scintilla.h" - -namespace Scintilla { - -class SurfaceImpl : public Surface { -private: - bool unicodeMode; - float x; - float y; - - CGContextRef gc; - - - /** The text layout instance */ - QuartzTextLayout* textLayout; - /** If the surface is a bitmap context, contains a reference to the bitmap data. */ - uint8_t* bitmapData; - /** If the surface is a bitmap context, stores the dimensions of the bitmap. */ - int bitmapWidth; - int bitmapHeight; - - /** Set the CGContext's fill colour to the specified allocated colour. */ - void FillColour( const ColourAllocated& back ); - - - // 24-bit RGB+A bitmap data constants - static const int BITS_PER_COMPONENT = 8; - static const int BITS_PER_PIXEL = BITS_PER_COMPONENT * 4; - static const int BYTES_PER_PIXEL = BITS_PER_PIXEL / 8; -public: - SurfaceImpl(); - ~SurfaceImpl(); - - void Init(WindowID wid); - void Init(SurfaceID sid, WindowID wid); - void InitPixMap(int width, int height, Surface *surface_, WindowID wid); - CGContextRef GetContext() { return gc; } - - void Release(); - bool Initialised(); - void PenColour(ColourAllocated fore); - - /** Returns a CGImageRef that represents the surface. Returns NULL if this is not possible. */ - CGImageRef GetImage(); - void CopyImageRectangle(Surface &surfaceSource, PRectangle srcRect, PRectangle dstRect); - - int LogPixelsY(); - int DeviceHeightFont(int points); - void MoveTo(int x_, int y_); - void LineTo(int x_, int y_); - void Polygon(Scintilla::Point *pts, int npts, ColourAllocated fore, ColourAllocated back); - void RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back); - void FillRectangle(PRectangle rc, ColourAllocated back); - void FillRectangle(PRectangle rc, Surface &surfacePattern); - void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back); - void AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill, - ColourAllocated outline, int alphaOutline, int flags); - void DrawRGBAImage(PRectangle rc, int width, int height, const unsigned char *pixelsImage); - void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back); - void Copy(PRectangle rc, Scintilla::Point from, Surface &surfaceSource); - - void DrawTextNoClip(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back); - void DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back); - void DrawTextTransparent(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore); - void MeasureWidths(Font &font_, const char *s, int len, int *positions); - int WidthText(Font &font_, const char *s, int len); - int WidthChar(Font &font_, char ch); - int Ascent(Font &font_); - int Descent(Font &font_); - int InternalLeading(Font &font_); - int ExternalLeading(Font &font_); - int Height(Font &font_); - int AverageCharWidth(Font &font_); - - int SetPalette(Scintilla::Palette *pal, bool inBackGround); - void SetClip(PRectangle rc); - void FlushCachedState(); - - void SetUnicodeMode(bool unicodeMode_); - void SetDBCSMode(int codePage); -}; - -} - -#endif diff --git a/macosx/QuartzTextLayout.h b/macosx/QuartzTextLayout.h deleted file mode 100644 index d65d45290..000000000 --- a/macosx/QuartzTextLayout.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * QuartzTextLayout.h - * - * Original Code by Evan Jones on Wed Oct 02 2002. - * Contributors: - * Shane Caraveo, ActiveState - * Bernd Paradies, Adobe - * - */ - -#ifndef _QUARTZ_TEXT_LAYOUT_H -#define _QUARTZ_TEXT_LAYOUT_H - -#include <Carbon/Carbon.h> - -#include "QuartzTextStyle.h" - -class QuartzTextLayout -{ -public: - /** Create a text layout for drawing on the specified context. */ - QuartzTextLayout( CGContextRef context ) : layout( NULL ), unicode_string( NULL ), unicode_length( 0 ) - { - OSStatus err = ATSUCreateTextLayout( &layout ); - if (0 != err) - layout = NULL; - - setContext(context); - - ATSUAttributeTag tag = kATSULineLayoutOptionsTag; - ByteCount size = sizeof( ATSLineLayoutOptions ); - ATSLineLayoutOptions rendering = kATSLineUseDeviceMetrics; //| kATSLineFractDisable | kATSLineUseQDRendering - ATSUAttributeValuePtr valuePtr = &rendering; - err = ATSUSetLayoutControls( layout, 1, &tag, &size, &valuePtr ); - } - - ~QuartzTextLayout() - { - if (NULL != layout) - ATSUDisposeTextLayout( layout ); - layout = NULL; - - if ( unicode_string != NULL ) - { - delete[] unicode_string; - unicode_string = NULL; - unicode_length = 0; - } - } - - /** Assign a string to the text layout object. */ - // TODO: Create a UTF8 version - // TODO: Optimise the ASCII version by not copying so much - OSStatus setText( const UInt8* buffer, size_t byteLength, CFStringEncoding encoding ) - { - if (NULL == layout) - return -1; - CFStringRef str = CFStringCreateWithBytes( NULL, buffer, byteLength, encoding, false ); - if (!str) - return -1; - - unicode_length = CFStringGetLength( str ); - if (unicode_string) - delete[] unicode_string; - unicode_string = new UniChar[ unicode_length ]; - CFStringGetCharacters( str, CFRangeMake( 0, unicode_length ), unicode_string ); - - CFRelease( str ); - str = NULL; - - OSStatus err; - err = ATSUSetTextPointerLocation( layout, unicode_string, kATSUFromTextBeginning, kATSUToTextEnd, unicode_length ); - if( err != noErr ) return err; - - // Turn on the default font fallbacks - return ATSUSetTransientFontMatching( layout, true ); - } - - inline void setText( const UInt8* buffer, size_t byteLength, const QuartzTextStyle& r ) - { - this->setText( buffer, byteLength, kCFStringEncodingUTF8 ); - ATSUSetRunStyle( layout, r.getATSUStyle(), 0, unicode_length ); - } - - /** Apply the specified text style on the entire range of text. */ - void setStyle( const QuartzTextStyle& style ) - { - ATSUSetRunStyle( layout, style.getATSUStyle(), kATSUFromTextBeginning, kATSUToTextEnd ); - } - - /** Draw the text layout into the current CGContext at the specified position, flipping the CGContext's Y axis if required. - * @param x The x axis position to draw the baseline in the current CGContext. - * @param y The y axis position to draw the baseline in the current CGContext. - * @param flipTextYAxis If true, the CGContext's Y axis will be flipped before drawing the text, and restored afterwards. Use this when drawing in an HIView's CGContext, where the origin is the top left corner. */ - void draw( float x, float y, bool flipTextYAxis = false ) - { - if (NULL == layout || 0 == unicode_length) - return; - if ( flipTextYAxis ) - { - CGContextSaveGState( gc ); - CGContextScaleCTM( gc, 1.0, -1.0 ); - y = -y; - } - - OSStatus err; - err = ATSUDrawText( layout, kATSUFromTextBeginning, kATSUToTextEnd, X2Fix( x ), X2Fix( y ) ); - - if ( flipTextYAxis ) CGContextRestoreGState( gc ); - } - - /** Sets a single text layout control on the ATSUTextLayout object. - * @param tag The control to set. - * @param size The size of the parameter pointed to by value. - * @param value A pointer to the new value for the control. - */ - void setControl( ATSUAttributeTag tag, ByteCount size, ATSUAttributeValuePtr value ) - { - ATSUSetLayoutControls( layout, 1, &tag, &size, &value ); - } - - ATSUTextLayout getLayout() { - return layout; - } - - inline CFIndex getLength() const { return unicode_length; } - inline void setContext (CGContextRef context) - { - gc = context; - if (NULL != layout) - setControl( kATSUCGContextTag, sizeof( gc ), &gc ); - } - -private: - ATSUTextLayout layout; - UniChar* unicode_string; - int unicode_length; - CGContextRef gc; -}; - -#endif diff --git a/macosx/QuartzTextStyle.h b/macosx/QuartzTextStyle.h deleted file mode 100644 index 80c06b76e..000000000 --- a/macosx/QuartzTextStyle.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * QuartzTextStyle.h - * wtf - * - * Created by Evan Jones on Wed Oct 02 2002. - * Copyright (c) 2002 __MyCompanyName__. All rights reserved. - * - */ - -#include <Carbon/Carbon.h> - -#ifndef _QUARTZ_TEXT_STYLE_H -#define _QUARTZ_TEXT_STYLE_H - -#include "QuartzTextStyleAttribute.h" - -class QuartzTextStyle -{ -public: - QuartzTextStyle() - { - ATSUCreateStyle( &style ); - } - - ~QuartzTextStyle() - { - if ( style != NULL ) - ATSUDisposeStyle( style ); - style = NULL; - } - - void setAttribute( ATSUAttributeTag tag, ByteCount size, ATSUAttributeValuePtr value ) - { - ATSUSetAttributes( style, 1, &tag, &size, &value ); - } - - void setAttribute( QuartzTextStyleAttribute& attribute ) - { - setAttribute( attribute.getTag(), attribute.getSize(), attribute.getValuePtr() ); - } - - void getAttribute( ATSUAttributeTag tag, ByteCount size, ATSUAttributeValuePtr value, ByteCount* actualSize ) - { - ATSUGetAttribute( style, tag, size, value, actualSize ); - } - - template <class T> - T getAttribute( ATSUAttributeTag tag ) - { - T value; - ByteCount actualSize; - ATSUGetAttribute( style, tag, sizeof( T ), &value, &actualSize ); - return value; - } - - // TODO: Is calling this actually faster than calling setAttribute multiple times? - void setAttributes( QuartzTextStyleAttribute* attributes[], int number ) - { - // Create the parallel arrays and initialize them properly - ATSUAttributeTag* tags = new ATSUAttributeTag[ number ]; - ByteCount* sizes = new ByteCount[ number ]; - ATSUAttributeValuePtr* values = new ATSUAttributeValuePtr[ number ]; - - for ( int i = 0; i < number; ++ i ) - { - tags[i] = attributes[i]->getTag(); - sizes[i] = attributes[i]->getSize(); - values[i] = attributes[i]->getValuePtr(); - } - - ATSUSetAttributes( style, number, tags, sizes, values ); - - // Free the arrays that were allocated - delete[] tags; - delete[] sizes; - delete[] values; - } - - void setFontFeature( ATSUFontFeatureType featureType, ATSUFontFeatureSelector selector ) - { - ATSUSetFontFeatures( style, 1, &featureType, &selector ); - } - - const ATSUStyle& getATSUStyle() const - { - return style; - } - -private: - ATSUStyle style; -}; - -#endif - diff --git a/macosx/QuartzTextStyleAttribute.h b/macosx/QuartzTextStyleAttribute.h deleted file mode 100644 index 89b43721e..000000000 --- a/macosx/QuartzTextStyleAttribute.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * QuartzTextStyleAttribute.h - * - * Original Code by Evan Jones on Wed Oct 02 2002. - * Contributors: - * Shane Caraveo, ActiveState - * Bernd Paradies, Adobe - * - */ - - -#include <Carbon/Carbon.h> - -#ifndef _QUARTZ_TEXT_STYLE_ATTRIBUTE_H -#define _QUARTZ_TEXT_STYLE_ATTRIBUTE_H - -class QuartzTextStyleAttribute -{ -public: - QuartzTextStyleAttribute() {} - virtual ~QuartzTextStyleAttribute() {} - virtual ByteCount getSize() const = 0; - virtual ATSUAttributeValuePtr getValuePtr() = 0; - virtual ATSUAttributeTag getTag() const = 0; -}; - -class QuartzTextSize : public QuartzTextStyleAttribute -{ -public: - QuartzTextSize( float points ) - { - size = X2Fix( points ); - } - - ByteCount getSize() const - { - return sizeof( size ); - } - - ATSUAttributeValuePtr getValuePtr() - { - return &size; - } - - ATSUAttributeTag getTag() const - { - return kATSUSizeTag; - } - -private: - Fixed size; -}; - -class QuartzTextStyleAttributeBoolean : public QuartzTextStyleAttribute -{ -public: - QuartzTextStyleAttributeBoolean( bool newVal ) : value( newVal ) {} - - ByteCount getSize() const - { - return sizeof( value ); - } - ATSUAttributeValuePtr getValuePtr() - { - return &value; - } - - virtual ATSUAttributeTag getTag() const = 0; - -private: - Boolean value; -}; - -class QuartzTextBold : public QuartzTextStyleAttributeBoolean -{ -public: - QuartzTextBold( bool newVal ) : QuartzTextStyleAttributeBoolean( newVal ) {} - ATSUAttributeTag getTag() const - { - return kATSUQDBoldfaceTag; - } -}; - -class QuartzTextItalic : public QuartzTextStyleAttributeBoolean -{ -public: - QuartzTextItalic( bool newVal ) : QuartzTextStyleAttributeBoolean( newVal ) {} - ATSUAttributeTag getTag() const - { - return kATSUQDItalicTag; - } -}; - -class QuartzTextUnderline : public QuartzTextStyleAttributeBoolean -{ -public: - QuartzTextUnderline( bool newVal ) : QuartzTextStyleAttributeBoolean( newVal ) {} - ATSUAttributeTag getTag() const { - return kATSUQDUnderlineTag; - } -}; - -class QuartzFont : public QuartzTextStyleAttribute -{ -public: - /** Create a font style from a name. */ - QuartzFont( const char* name, int length ) - { - assert( name != NULL && length > 0 && name[length] == '\0' ); - // try to create font - OSStatus err = ATSUFindFontFromName( const_cast<char*>( name ), length, kFontFullName, (unsigned) kFontNoPlatform, kFontRomanScript, (unsigned) kFontNoLanguage, &fontid ); - - // need a fallback if font isn't installed - if( err != noErr || fontid == kATSUInvalidFontID ) - ::ATSUFindFontFromName( "Lucida Grande", 13, kFontFullName, (unsigned) kFontNoPlatform, kFontRomanScript, (unsigned) kFontNoLanguage, &fontid ); - } - - ByteCount getSize() const - { - return sizeof( fontid ); - } - - ATSUAttributeValuePtr getValuePtr() - { - return &fontid; - } - - ATSUAttributeTag getTag() const - { - return kATSUFontTag; - } - - ATSUFontID getFontID() const - { - return fontid; - } - -private: - ATSUFontID fontid; -}; - - -#endif - diff --git a/macosx/SciTest/English.lproj/InfoPlist.strings b/macosx/SciTest/English.lproj/InfoPlist.strings Binary files differdeleted file mode 100644 index 4dcb4fe03..000000000 --- a/macosx/SciTest/English.lproj/InfoPlist.strings +++ /dev/null diff --git a/macosx/SciTest/English.lproj/main.xib b/macosx/SciTest/English.lproj/main.xib deleted file mode 100644 index f21c3c234..000000000 --- a/macosx/SciTest/English.lproj/main.xib +++ /dev/null @@ -1,1357 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<archive type="com.apple.InterfaceBuilder3.Carbon.XIB" version="8.00"> - <data> - <int key="IBDocument.SystemTarget">1030</int> - <string key="IBDocument.SystemVersion">10J869</string> - <string key="IBDocument.InterfaceBuilderVersion">844</string> - <string key="IBDocument.AppKitVersion">1038.35</string> - <string key="IBDocument.HIToolboxVersion">461.00</string> - <dictionary class="NSMutableDictionary" key="IBDocument.PluginVersions"/> - <array class="NSMutableArray" key="IBDocument.EditedObjectIDs"/> - <array key="IBDocument.PluginDependencies" id="0"/> - <dictionary class="NSMutableDictionary" key="IBDocument.Metadata"/> - <array class="NSMutableArray" key="IBDocument.RootObjects" id="916772132"> - <object class="IBHIMenu" id="616200452"> - <string key="NSTitle">main</string> - <array class="NSMutableArray" key="NSMenuItems"> - <object class="IBHIMenuItem" id="402039252"> - <reference key="NSMenu" ref="616200452"/> - <string key="NSTitle">Foo</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <object class="NSImage" key="NSOnImage" id="811799834"> - <string key="NSName">NSMenuCheckmark</string> - <int key="NSImageFlags">1623195648</int> - </object> - <object class="NSImage" key="NSMixedImage" id="947510406"> - <string key="NSName">NSMenuMixedState</string> - <int key="NSImageFlags">1623195648</int> - </object> - <string key="NSAction">submenuAction:</string> - <object class="IBHIMenu" key="NSSubmenu" id="625538049"> - <string key="NSTitle">Foo</string> - <array class="NSMutableArray" key="NSMenuItems"> - <object class="IBHIMenuItem" id="397827260"> - <reference key="NSMenu" ref="625538049"/> - <string key="NSTitle">About Foo</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">About Foo</string> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="0" key="keyEquivalentModifierMask"/> - <integer value="1633841013" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - </array> - <string key="name">_NSAppleMenu</string> - <string key="title">Foo</string> - <integer value="0" key="menuID"/> - <integer value="0" key="excludesMarkColumn"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="usePencilGlyph"/> - <integer value="0" key="hidden"/> - <integer value="0" key="condenseSeparators"/> - </object> - <string key="title">Foo</string> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="0" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="43512438"> - <reference key="NSMenu" ref="616200452"/> - <string key="NSTitle">File</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="NSAction">submenuAction:</string> - <object class="IBHIMenu" key="NSSubmenu" id="485786537"> - <string key="NSTitle">File</string> - <array class="NSMutableArray" key="NSMenuItems"> - <object class="IBHIMenuItem" id="69335588"> - <reference key="NSMenu" ref="485786537"/> - <string key="NSTitle">New</string> - <string key="NSKeyEquiv">n</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">New</string> - <string key="keyEquivalent">n</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1852143392" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="381430449"> - <reference key="NSMenu" ref="485786537"/> - <string key="NSTitle">Open…</string> - <string key="NSKeyEquiv">o</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Open…</string> - <string key="keyEquivalent">o</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1869636974" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="532381823"> - <reference key="NSMenu" ref="485786537"/> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title"/> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="0" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="591139417"> - <reference key="NSMenu" ref="485786537"/> - <string key="NSTitle">Close</string> - <string key="NSKeyEquiv">w</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Close</string> - <string key="keyEquivalent">w</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1668050803" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="69866885"> - <reference key="NSMenu" ref="485786537"/> - <string key="NSTitle">Save</string> - <string key="NSKeyEquiv">s</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Save</string> - <string key="keyEquivalent">s</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1935767141" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="854940440"> - <reference key="NSMenu" ref="485786537"/> - <string key="NSTitle">Save As…</string> - <string key="NSKeyEquiv">S</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Save As…</string> - <string key="keyEquivalent">S</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1937138035" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="228956699"> - <reference key="NSMenu" ref="485786537"/> - <string key="NSTitle">Revert</string> - <string key="NSKeyEquiv">r</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Revert</string> - <string key="keyEquivalent">r</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1920365172" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="394582570"> - <reference key="NSMenu" ref="485786537"/> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title"/> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="0" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="368703582"> - <reference key="NSMenu" ref="485786537"/> - <string key="NSTitle">Page Setup…</string> - <string key="NSKeyEquiv">P</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Page Setup…</string> - <string key="keyEquivalent">P</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1885431653" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="380214655"> - <reference key="NSMenu" ref="485786537"/> - <string key="NSTitle">Print…</string> - <string key="NSKeyEquiv">p</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Print…</string> - <string key="keyEquivalent">p</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1886547572" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - </array> - <string key="title">File</string> - <integer value="0" key="menuID"/> - <integer value="0" key="excludesMarkColumn"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="usePencilGlyph"/> - <integer value="0" key="hidden"/> - <integer value="0" key="condenseSeparators"/> - </object> - <string key="title">File</string> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="0" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="819734449"> - <reference key="NSMenu" ref="616200452"/> - <string key="NSTitle">Edit</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="NSAction">submenuAction:</string> - <object class="IBHIMenu" key="NSSubmenu" id="834799733"> - <string key="NSTitle">Edit</string> - <array class="NSMutableArray" key="NSMenuItems"> - <object class="IBHIMenuItem" id="625195073"> - <reference key="NSMenu" ref="834799733"/> - <string key="NSTitle">Undo</string> - <string key="NSKeyEquiv">z</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Undo</string> - <string key="keyEquivalent">z</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1970168943" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="981604047"> - <reference key="NSMenu" ref="834799733"/> - <string key="NSTitle">Redo</string> - <string key="NSKeyEquiv">Z</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Redo</string> - <string key="keyEquivalent">Z</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1919247471" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="801198865"> - <reference key="NSMenu" ref="834799733"/> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title"/> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="0" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="183407141"> - <reference key="NSMenu" ref="834799733"/> - <string key="NSTitle">Cut</string> - <string key="NSKeyEquiv">x</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Cut</string> - <string key="keyEquivalent">x</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1668641824" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="721987953"> - <reference key="NSMenu" ref="834799733"/> - <string key="NSTitle">Copy</string> - <string key="NSKeyEquiv">c</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Copy</string> - <string key="keyEquivalent">c</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1668247673" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="163774340"> - <reference key="NSMenu" ref="834799733"/> - <string key="NSTitle">Paste</string> - <string key="NSKeyEquiv">v</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Paste</string> - <string key="keyEquivalent">v</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1885434740" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="524060676"> - <reference key="NSMenu" ref="834799733"/> - <string key="NSTitle">Delete</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Delete</string> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1668048225" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="899041567"> - <reference key="NSMenu" ref="834799733"/> - <string key="NSTitle">Select All</string> - <string key="NSKeyEquiv">a</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Select All</string> - <string key="keyEquivalent">a</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1935764588" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="460043965"> - <reference key="NSMenu" ref="834799733"/> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title"/> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="0" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="450835793"> - <reference key="NSMenu" ref="834799733"/> - <string key="NSTitle">Special Characters…</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Special Characters…</string> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1667789424" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - </array> - <string key="title">Edit</string> - <integer value="0" key="menuID"/> - <integer value="0" key="excludesMarkColumn"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="usePencilGlyph"/> - <integer value="0" key="hidden"/> - <integer value="0" key="condenseSeparators"/> - </object> - <string key="title">Edit</string> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="0" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="388631461"> - <reference key="NSMenu" ref="616200452"/> - <string key="NSTitle">Window</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="NSAction">submenuAction:</string> - <object class="IBHIMenu" key="NSSubmenu" id="205795869"> - <string key="NSTitle">Window</string> - <array class="NSMutableArray" key="NSMenuItems"> - <object class="IBHIMenuItem" id="349612756"> - <reference key="NSMenu" ref="205795869"/> - <string key="NSTitle">Zoom Window</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Zoom Window</string> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="2054123373" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="936621331"> - <reference key="NSMenu" ref="205795869"/> - <string key="NSTitle">Minimize Window</string> - <string key="NSKeyEquiv">m</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Minimize Window</string> - <string key="keyEquivalent">m</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="1" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1835626089" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="221099875"> - <reference key="NSMenu" ref="205795869"/> - <string key="NSTitle">Minimize All Windows</string> - <string key="NSKeyEquiv">m</string> - <int key="NSKeyEquivModMask">1572864</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Minimize All Windows</string> - <string key="keyEquivalent">m</string> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="1" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1572864" key="keyEquivalentModifierMask"/> - <integer value="1835626081" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="779649640"> - <reference key="NSMenu" ref="205795869"/> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title"/> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="0" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="264609315"> - <reference key="NSMenu" ref="205795869"/> - <string key="NSTitle">Bring All to Front</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Bring All to Front</string> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="1" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="1650881140" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - <object class="IBHIMenuItem" id="603622129"> - <reference key="NSMenu" ref="205795869"/> - <string key="NSTitle">Arrange in Front</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1572864</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="811799834"/> - <reference key="NSMixedImage" ref="947510406"/> - <string key="title">Arrange in Front</string> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="1" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1572864" key="keyEquivalentModifierMask"/> - <integer value="1718775412" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - </array> - <string key="name">_NSWindowsMenu</string> - <string key="title">Window</string> - <integer value="0" key="menuID"/> - <integer value="0" key="excludesMarkColumn"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="usePencilGlyph"/> - <integer value="0" key="hidden"/> - <integer value="0" key="condenseSeparators"/> - </object> - <string key="title">Window</string> - <string key="keyEquivalent"/> - <integer value="0" key="disabled"/> - <integer value="0" key="checked"/> - <integer value="0" key="submenuParentChoosable"/> - <integer value="0" key="dynamic"/> - <integer value="0" key="notPreviousAlternate"/> - <integer value="0" key="hidden"/> - <integer value="0" key="ignoreMeta"/> - <integer value="0" key="sectionHeader"/> - <integer value="0" key="customDraw"/> - <integer value="0" key="autoRepeat"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="updateSingleItem"/> - <integer value="0" key="includeInCmdKeyMatching"/> - <integer value="1048576" key="keyEquivalentModifierMask"/> - <integer value="0" key="command"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <integer value="0" key="helpTagDisplaySide"/> - </object> - </array> - <string key="name">_NSMainMenu</string> - <string key="title">main</string> - <integer value="0" key="menuID"/> - <integer value="0" key="excludesMarkColumn"/> - <integer value="0" key="autoDisable"/> - <integer value="0" key="usePencilGlyph"/> - <integer value="0" key="hidden"/> - <integer value="0" key="condenseSeparators"/> - </object> - <object class="IBHIWindowTemplate" id="706261407"> - <integer value="0" key="doesNotHide"/> - <integer value="0" key="squareCorners"/> - <integer value="0" key="autoViewDragTracking"/> - <integer value="1" key="receivesActivates"/> - <integer value="0" key="receivesUpdates"/> - <integer value="1" key="hasCloseBox"/> - <integer value="1" key="hasCollapseBox"/> - <integer value="1" key="hasHorizontalZoom"/> - <integer value="1" key="resizable"/> - <integer value="0" key="hasSideTitle"/> - <integer value="1" key="hasVerticalZoom"/> - <integer value="1" key="standardHandler"/> - <integer value="1" key="liveResize"/> - <integer value="0" key="toolbarButton"/> - <integer value="0" key="metal"/> - <integer value="0" key="unifiedTitleAndToolbar"/> - <integer value="1" key="compositing"/> - <integer value="0" key="ignoreClicks"/> - <integer value="0" key="asyncDrag"/> - <integer value="1" key="constrained"/> - <integer value="0" key="hideOnFullScreen"/> - <integer value="0" key="hideOnSuspend"/> - <integer value="1" key="hasShadow"/> - <integer value="0" key="noMetalContentSeparator"/> - <integer value="0" key="doesNotCycle"/> - <integer value="1" key="inWindowMenu"/> - <integer value="0" key="visibleWithoutLogin"/> - <integer value="0" key="opaqueForEvents"/> - <integer value="6" key="windowClass"/> - <integer value="0" key="themeBrush"/> - <integer value="0" key="windowPosition"/> - <integer value="0" key="scalingMode"/> - <nil key="helpTagText"/> - <nil key="helpTagExtendedText"/> - <nil key="classID"/> - <string key="title">Window</string> - <object class="IBHIRootControl" key="rootControl" id="582312270"> - <nil key="NSNextResponder"/> - <int key="NSvFlags">256</int> - <string key="NSFrameSize">{480, 360}</string> - <integer value="0" key="controlSignature"/> - <integer value="0" key="controlID"/> - <integer value="1" key="enabled"/> - <integer value="0" key="hidden"/> - <integer value="9999" key="fontStyle"/> - <integer value="0" key="controlSize"/> - <integer value="0" key="command"/> - <nil key="helpTagExtendedText"/> - <nil key="helpTagText"/> - <integer value="0" key="helpTagDisplaySide"/> - <reference key="auxiliaryProperties" ref="0"/> - <object class="IBCarbonHILayoutInfo" key="layoutInfo"> - <nil key="bindingTopView"/> - <integer value="0" key="bindingTopKind"/> - <real value="0.0" key="bindingTopOffset"/> - <nil key="bindingLeftView"/> - <integer value="0" key="bindingLeftKind"/> - <real value="0.0" key="bindingLeftOffset"/> - <nil key="bindingBottomView"/> - <integer value="0" key="bindingBottomKind"/> - <real value="0.0" key="bindingBottomOffset"/> - <nil key="bindingRightView"/> - <integer value="0" key="bindingRightKind"/> - <real value="0.0" key="bindingRightOffset"/> - <real value="0.0" key="scaleXRatio"/> - <nil key="scaleXView"/> - <integer value="0" key="scaleXKind"/> - <real value="0.0" key="scaleYRatio"/> - <nil key="scaleYView"/> - <integer value="0" key="scaleYKind"/> - <integer value="0" key="positionXKind"/> - <nil key="positionXView"/> - <real value="0.0" key="positionXOffset"/> - <integer value="0" key="positionYKind"/> - <nil key="positionYView"/> - <real value="0.0" key="positionYOffset"/> - </object> - <integer value="0" key="layoutSuspended"/> - <reference key="instantiationProperties" ref="0"/> - <nil key="classID"/> - </object> - <integer value="0" key="autoPositionMask"/> - <string key="windowRectAsNSRect">{{300, 204}, {480, 360}}</string> - <string key="autoScreenRectAsNSRect">{{0, 0}, {1024, 768}}</string> - <integer value="0" key="helpTagDisplaySide"/> - <reference key="instantiationProperties" ref="0"/> - </object> - </array> - <object class="IBObjectContainer" key="IBDocument.Objects"> - <array class="NSMutableArray" key="connectionRecords"/> - <object class="IBMutableOrderedSet" key="objectRecords"> - <array key="orderedObjects"> - <object class="IBObjectRecord"> - <int key="objectID">0</int> - <reference key="object" ref="0"/> - <reference key="children" ref="916772132"/> - <nil key="parent"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">29</int> - <reference key="object" ref="616200452"/> - <array class="NSMutableArray" key="children"> - <reference ref="43512438"/> - <reference ref="819734449"/> - <reference ref="402039252"/> - <reference ref="388631461"/> - </array> - <reference key="parent" ref="0"/> - <string key="objectName">MenuBar</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">166</int> - <reference key="object" ref="706261407"/> - <array class="NSMutableArray" key="children"> - <reference ref="582312270"/> - </array> - <reference key="parent" ref="0"/> - <string key="objectName">MainWindow</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">127</int> - <reference key="object" ref="43512438"/> - <array class="NSMutableArray" key="children"> - <reference ref="485786537"/> - </array> - <reference key="parent" ref="616200452"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">152</int> - <reference key="object" ref="819734449"/> - <array class="NSMutableArray" key="children"> - <reference ref="834799733"/> - </array> - <reference key="parent" ref="616200452"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">185</int> - <reference key="object" ref="402039252"/> - <array class="NSMutableArray" key="children"> - <reference ref="625538049"/> - </array> - <reference key="parent" ref="616200452"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">192</int> - <reference key="object" ref="388631461"/> - <array class="NSMutableArray" key="children"> - <reference ref="205795869"/> - </array> - <reference key="parent" ref="616200452"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">167</int> - <reference key="object" ref="582312270"/> - <reference key="parent" ref="706261407"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">131</int> - <reference key="object" ref="485786537"/> - <array class="NSMutableArray" key="children"> - <reference ref="394582570"/> - <reference ref="591139417"/> - <reference ref="228956699"/> - <reference ref="532381823"/> - <reference ref="381430449"/> - <reference ref="368703582"/> - <reference ref="380214655"/> - <reference ref="854940440"/> - <reference ref="69866885"/> - <reference ref="69335588"/> - </array> - <reference key="parent" ref="43512438"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">147</int> - <reference key="object" ref="834799733"/> - <array class="NSMutableArray" key="children"> - <reference ref="625195073"/> - <reference ref="801198865"/> - <reference ref="183407141"/> - <reference ref="163774340"/> - <reference ref="981604047"/> - <reference ref="899041567"/> - <reference ref="721987953"/> - <reference ref="524060676"/> - <reference ref="450835793"/> - <reference ref="460043965"/> - </array> - <reference key="parent" ref="819734449"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">184</int> - <reference key="object" ref="625538049"/> - <array class="NSMutableArray" key="children"> - <reference ref="397827260"/> - </array> - <reference key="parent" ref="402039252"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">195</int> - <reference key="object" ref="205795869"/> - <array class="NSMutableArray" key="children"> - <reference ref="936621331"/> - <reference ref="221099875"/> - <reference ref="603622129"/> - <reference ref="779649640"/> - <reference ref="264609315"/> - <reference ref="349612756"/> - </array> - <reference key="parent" ref="388631461"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">128</int> - <reference key="object" ref="394582570"/> - <reference key="parent" ref="485786537"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">130</int> - <reference key="object" ref="591139417"/> - <reference key="parent" ref="485786537"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">132</int> - <reference key="object" ref="228956699"/> - <reference key="parent" ref="485786537"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">133</int> - <reference key="object" ref="532381823"/> - <reference key="parent" ref="485786537"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">134</int> - <reference key="object" ref="381430449"/> - <reference key="parent" ref="485786537"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">135</int> - <reference key="object" ref="368703582"/> - <reference key="parent" ref="485786537"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">136</int> - <reference key="object" ref="380214655"/> - <reference key="parent" ref="485786537"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">137</int> - <reference key="object" ref="854940440"/> - <reference key="parent" ref="485786537"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">138</int> - <reference key="object" ref="69866885"/> - <reference key="parent" ref="485786537"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">139</int> - <reference key="object" ref="69335588"/> - <reference key="parent" ref="485786537"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">141</int> - <reference key="object" ref="625195073"/> - <reference key="parent" ref="834799733"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">142</int> - <reference key="object" ref="801198865"/> - <reference key="parent" ref="834799733"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">143</int> - <reference key="object" ref="183407141"/> - <reference key="parent" ref="834799733"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">144</int> - <reference key="object" ref="163774340"/> - <reference key="parent" ref="834799733"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">146</int> - <reference key="object" ref="981604047"/> - <reference key="parent" ref="834799733"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">148</int> - <reference key="object" ref="899041567"/> - <reference key="parent" ref="834799733"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">149</int> - <reference key="object" ref="721987953"/> - <reference key="parent" ref="834799733"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">151</int> - <reference key="object" ref="524060676"/> - <reference key="parent" ref="834799733"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">198</int> - <reference key="object" ref="450835793"/> - <reference key="parent" ref="834799733"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">199</int> - <reference key="object" ref="460043965"/> - <reference key="parent" ref="834799733"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">187</int> - <reference key="object" ref="397827260"/> - <reference key="parent" ref="625538049"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">190</int> - <reference key="object" ref="936621331"/> - <reference key="parent" ref="205795869"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">191</int> - <reference key="object" ref="221099875"/> - <reference key="parent" ref="205795869"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">193</int> - <reference key="object" ref="603622129"/> - <reference key="parent" ref="205795869"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">194</int> - <reference key="object" ref="779649640"/> - <reference key="parent" ref="205795869"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">196</int> - <reference key="object" ref="264609315"/> - <reference key="parent" ref="205795869"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">197</int> - <reference key="object" ref="349612756"/> - <reference key="parent" ref="205795869"/> - </object> - </array> - </object> - <dictionary class="NSMutableDictionary" key="flattenedProperties"/> - <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/> - <nil key="activeLocalization"/> - <dictionary class="NSMutableDictionary" key="localizations"/> - <nil key="sourceID"/> - <int key="maxID">200</int> - </object> - <object class="IBClassDescriber" key="IBDocument.Classes"/> - <int key="IBDocument.localizationMode">0</int> - <string key="IBDocument.TargetRuntimeIdentifier">IBCarbonFramework</string> - <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies"> - <string key="NS.key.0">com.apple.InterfaceBuilder.CarbonPlugin.macosx</string> - <integer value="1030" key="NS.object.0"/> - </object> - <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> - <nil key="IBDocument.LastKnownRelativeProjectPath"/> - <int key="IBDocument.defaultPropertyAccessControl">3</int> - </data> -</archive> diff --git a/macosx/SciTest/Info.plist b/macosx/SciTest/Info.plist deleted file mode 100644 index 7163dff62..000000000 --- a/macosx/SciTest/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>CFBundleDevelopmentRegion</key> - <string>English</string> - <key>CFBundleExecutable</key> - <string>SciTest</string> - <key>CFBundleIconFile</key> - <string></string> - <key>CFBundleIdentifier</key> - <string>com.apple.myCarbonApp</string> - <key>CFBundleInfoDictionaryVersion</key> - <string>6.0</string> - <key>CFBundlePackageType</key> - <string>APPL</string> - <key>CFBundleSignature</key> - <string>????</string> - <key>CFBundleVersion</key> - <string>1.0</string> - <key>CSResourcesFileMapped</key> - <true/> -</dict> -</plist> diff --git a/macosx/SciTest/SciTest.xcode/project.pbxproj b/macosx/SciTest/SciTest.xcode/project.pbxproj deleted file mode 100644 index 117a7e8d4..000000000 --- a/macosx/SciTest/SciTest.xcode/project.pbxproj +++ /dev/null @@ -1,299 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 11947A8713DF89B300771BF5 /* main.xib in Resources */ = {isa = PBXBuildFile; fileRef = 11947A8513DF89B300771BF5 /* main.xib */; }; - 3002B123087DCEC600CEAF79 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3002B122087DCEC600CEAF79 /* main.cpp */; }; - 30973FF8086B7F4F0088809C /* libscintilla.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 30973FF7086B7F4F0088809C /* libscintilla.a */; }; - 8D0C4E8D0486CD37000505A6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */; }; - 8D0C4E920486CD37000505A6 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 20286C33FDCF999611CA2CEA /* Carbon.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 0867D6ABFE840B52C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; }; - 11947A8613DF89B300771BF5 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/main.xib; sourceTree = "<group>"; }; - 20286C33FDCF999611CA2CEA /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; }; - 3002B122087DCEC600CEAF79 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; }; - 30973FF7086B7F4F0088809C /* libscintilla.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libscintilla.a; path = ../../bin/libscintilla.a; sourceTree = SOURCE_ROOT; }; - 32DBCF6D0370B57F00C91783 /* SciTest_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SciTest_Prefix.pch; sourceTree = "<group>"; }; - 4A9504C8FFE6A3BC11CA0CBA /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = "<absolute>"; }; - 4A9504CAFFE6A41611CA0CBA /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = "<absolute>"; }; - 8D0C4E960486CD37000505A6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; }; - 8D0C4E970486CD37000505A6 /* SciTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SciTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 8D0C4E910486CD37000505A6 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D0C4E920486CD37000505A6 /* Carbon.framework in Frameworks */, - 30973FF8086B7F4F0088809C /* libscintilla.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 195DF8CFFE9D517E11CA2CBB /* Products */ = { - isa = PBXGroup; - children = ( - 8D0C4E970486CD37000505A6 /* SciTest.app */, - ); - name = Products; - sourceTree = "<group>"; - }; - 20286C29FDCF999611CA2CEA /* SciTest */ = { - isa = PBXGroup; - children = ( - 20286C2AFDCF999611CA2CEA /* Sources */, - 20286C2CFDCF999611CA2CEA /* Resources */, - 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */, - 195DF8CFFE9D517E11CA2CBB /* Products */, - ); - name = SciTest; - sourceTree = "<group>"; - }; - 20286C2AFDCF999611CA2CEA /* Sources */ = { - isa = PBXGroup; - children = ( - 3002B122087DCEC600CEAF79 /* main.cpp */, - 32DBCF6D0370B57F00C91783 /* SciTest_Prefix.pch */, - ); - name = Sources; - sourceTree = "<group>"; - }; - 20286C2CFDCF999611CA2CEA /* Resources */ = { - isa = PBXGroup; - children = ( - 11947A8513DF89B300771BF5 /* main.xib */, - 8D0C4E960486CD37000505A6 /* Info.plist */, - 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */, - ); - name = Resources; - sourceTree = "<group>"; - }; - 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */ = { - isa = PBXGroup; - children = ( - 30973FF7086B7F4F0088809C /* libscintilla.a */, - 20286C33FDCF999611CA2CEA /* Carbon.framework */, - 4A9504CAFFE6A41611CA0CBA /* CoreServices.framework */, - 4A9504C8FFE6A3BC11CA0CBA /* ApplicationServices.framework */, - ); - name = "External Frameworks and Libraries"; - sourceTree = "<group>"; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 8D0C4E890486CD37000505A6 /* SciTest */ = { - isa = PBXNativeTarget; - buildConfigurationList = 304E977D0C0519E500702100 /* Build configuration list for PBXNativeTarget "SciTest" */; - buildPhases = ( - 8D0C4E8C0486CD37000505A6 /* Resources */, - 8D0C4E8F0486CD37000505A6 /* Sources */, - 8D0C4E910486CD37000505A6 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = SciTest; - productInstallPath = "$(HOME)/Applications"; - productName = SciTest; - productReference = 8D0C4E970486CD37000505A6 /* SciTest.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 20286C28FDCF999611CA2CEA /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0410; - }; - buildConfigurationList = 304E97810C0519E500702100 /* Build configuration list for PBXProject "SciTest" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - ); - mainGroup = 20286C29FDCF999611CA2CEA /* SciTest */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 8D0C4E890486CD37000505A6 /* SciTest */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 8D0C4E8C0486CD37000505A6 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D0C4E8D0486CD37000505A6 /* InfoPlist.strings in Resources */, - 11947A8713DF89B300771BF5 /* main.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 8D0C4E8F0486CD37000505A6 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3002B123087DCEC600CEAF79 /* main.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 0867D6AAFE840B52C02AAC07 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 0867D6ABFE840B52C02AAC07 /* English */, - ); - name = InfoPlist.strings; - sourceTree = "<group>"; - }; - 11947A8513DF89B300771BF5 /* main.xib */ = { - isa = PBXVariantGroup; - children = ( - 11947A8613DF89B300771BF5 /* English */, - ); - name = main.xib; - sourceTree = "<group>"; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 304E977E0C0519E500702100 /* Development */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = SciTest_Prefix.pch; - HEADER_SEARCH_PATHS = ( - .., - ../../include, - ../../src, - ../../lexlib, - ); - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = "$(HOME)/Applications"; - LIBRARY_SEARCH_PATHS = ../../bin; - OTHER_CFLAGS = ( - "-DSCI_NAMESPACE=1", - "-DSCI_NAMESPACE", - "-DMACOSX", - "-DSCI_LEXER", - ); - OTHER_CPLUSPLUSFLAGS = ( - "-DSCI_NAMESPACE=1", - "-DSCI_NAMESPACE", - "-DMACOSX", - "-DSCI_LEXER", - ); - PRODUCT_NAME = SciTest; - WRAPPER_EXTENSION = app; - ZERO_LINK = YES; - }; - name = Development; - }; - 304E977F0C0519E500702100 /* Deployment */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = YES; - GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = SciTest_Prefix.pch; - HEADER_SEARCH_PATHS = ( - .., - ../../include, - ../../src, - ../../lexlib, - ); - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = "$(HOME)/Applications"; - LIBRARY_SEARCH_PATHS = ""; - PRODUCT_NAME = SciTest; - WRAPPER_EXTENSION = app; - ZERO_LINK = NO; - }; - name = Deployment; - }; - 304E97800C0519E500702100 /* Default */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = SciTest_Prefix.pch; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = "$(HOME)/Applications"; - LIBRARY_SEARCH_PATHS = ""; - PRODUCT_NAME = SciTest; - WRAPPER_EXTENSION = app; - }; - name = Default; - }; - 304E97820C0519E500702100 /* Development */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Development; - }; - 304E97830C0519E500702100 /* Deployment */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Deployment; - }; - 304E97840C0519E500702100 /* Default */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Default; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 304E977D0C0519E500702100 /* Build configuration list for PBXNativeTarget "SciTest" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 304E977E0C0519E500702100 /* Development */, - 304E977F0C0519E500702100 /* Deployment */, - 304E97800C0519E500702100 /* Default */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Default; - }; - 304E97810C0519E500702100 /* Build configuration list for PBXProject "SciTest" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 304E97820C0519E500702100 /* Development */, - 304E97830C0519E500702100 /* Deployment */, - 304E97840C0519E500702100 /* Default */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Default; - }; -/* End XCConfigurationList section */ - }; - rootObject = 20286C28FDCF999611CA2CEA /* Project object */; -} diff --git a/macosx/SciTest/SciTest_Prefix.pch b/macosx/SciTest/SciTest_Prefix.pch deleted file mode 100644 index 552cf97fc..000000000 --- a/macosx/SciTest/SciTest_Prefix.pch +++ /dev/null @@ -1,5 +0,0 @@ -// -// Prefix header for all source files of the 'SciTest' target in the 'SciTest' project. -// - -#include <Carbon/Carbon.h> diff --git a/macosx/SciTest/main.cpp b/macosx/SciTest/main.cpp deleted file mode 100644 index 0239c4024..000000000 --- a/macosx/SciTest/main.cpp +++ /dev/null @@ -1,255 +0,0 @@ -// -// main.c -// SciTest -// -// Copyright (c) 2005-2006 ActiveState Software Inc. -// All rights reserved. -// -// Created by Shane Caraveo on 3/20/05. -// - -#include <Carbon/Carbon.h> -#include "TView.h" -#include "TCarbonEvent.h" -#include "ScintillaMacOSX.h" - -extern "C" HIViewRef scintilla_new(void); - -const HILayoutInfo kBindToParentLayout = { - kHILayoutInfoVersionZero, - { { NULL, kHILayoutBindTop }, { NULL, kHILayoutBindLeft }, { NULL, kHILayoutBindBottom }, { NULL, kHILayoutBindRight } }, - { { NULL, kHILayoutScaleAbsolute, 0 }, { NULL, kHILayoutScaleAbsolute, 0 } }, - { { NULL, kHILayoutPositionTop, 0 }, { NULL, kHILayoutPositionLeft, 0 } } -}; - -using namespace Scintilla; - -/* XPM */ -static const char *ac_class[] = { -/* columns rows colors chars-per-pixel */ -"18 12 24 1", -" c black", -". c #403030", -"X c #473636", -"o c #4E3C3C", -"O c #474141", -"+ c #5F4C4C", -"@ c #756362", -"# c #98342C", -"$ c #A0392F", -"% c #B24235", -"& c #B2443C", -"* c #B34E3E", -"= c #B54E44", -"- c #B65146", -"; c #B7584F", -": c #B8554C", -"> c #B75A50", -", c #B95852", -"< c #B96259", -"1 c #B89B9B", -"2 c #BCA0A0", -"3 c #C1A5A5", -"4 c gray100", -"5 c None", -/* pixels */ -"555555555555555555", -"55553$$$$$$$#@5555", -"55552;%&&==;=o5555", -"55551>&&*=;:=.5555", -"55551>&*=;::=.5555", -"55551>*==:::-X5555", -"55551>==:::,;.5555", -"55551<==:;,<>.5555", -"55551<;;;;<<;.5555", -"55551;-==;;;;X5555", -"55555+XX..X..O5555", -"555555555555555555" -}; - -const char keywords[]="and and_eq asm auto bitand bitor bool break " -"case catch char class compl const const_cast continue " -"default delete do double dynamic_cast else enum explicit export extern false float for " -"friend goto if inline int long mutable namespace new not not_eq " -"operator or or_eq private protected public " -"register reinterpret_cast return short signed sizeof static static_cast struct switch " -"template this throw true try typedef typeid typename union unsigned using " -"virtual void volatile wchar_t while xor xor_eq"; - -pascal OSStatus WindowEventHandler(EventHandlerCallRef inCallRef, - EventRef inEvent, - void* inUserData ) -{ - HIViewRef sciView = *reinterpret_cast<HIViewRef*>( inUserData ); - WindowRef window = GetControlOwner(sciView); - ScintillaMacOSX* scintilla; - GetControlProperty( sciView, scintillaMacOSType, 0, sizeof( scintilla ), NULL, &scintilla ); - TCarbonEvent event( inEvent ); - - // If the window is not active, let the standard window handler execute. - if ( ! IsWindowActive( window ) ) return eventNotHandledErr; - - const HIViewRef rootView = HIViewGetRoot( window ); - assert( rootView != NULL ); - - if ( event.GetKind() == kEventMouseDown ) - { - UInt32 inKeyModifiers; - event.GetParameter( kEventParamKeyModifiers, &inKeyModifiers ); - - EventMouseButton inMouseButton; - event.GetParameter<EventMouseButton>( kEventParamMouseButton, typeMouseButton, &inMouseButton ); - if (inMouseButton == kEventMouseButtonTertiary) { - if (inKeyModifiers & optionKey) { - const char *test = "\001This is a test calltip This is a test calltip This is a test calltip"; - scintilla->WndProc( SCI_CALLTIPSHOW, 0, (long int)test ); - } else { - const char *list = "test_1?0 test_2 test_3 test_4 test_5 test_6 test_7 test_8 test_9 test_10 test_11 test_12"; - scintilla->WndProc( SCI_AUTOCSHOW, 0, (long int)list ); - } - return noErr; - } - } - - return eventNotHandledErr; -} - -int main(int argc, char* argv[]) -{ - IBNibRef nibRef; - WindowRef window; - - OSStatus err; - - // Create a Nib reference passing the name of the nib file (without the .nib extension) - // CreateNibReference only searches into the application bundle. - err = CreateNibReference(CFSTR("main"), &nibRef); - require_noerr( err, CantGetNibRef ); - - // Once the nib reference is created, set the menu bar. "MainMenu" is the name of the menu bar - // object. This name is set in InterfaceBuilder when the nib is created. - err = SetMenuBarFromNib(nibRef, CFSTR("MenuBar")); - require_noerr( err, CantSetMenuBar ); - - // Then create a window. "MainWindow" is the name of the window object. This name is set in - // InterfaceBuilder when the nib is created. - err = CreateWindowFromNib(nibRef, CFSTR("MainWindow"), &window); - require_noerr( err, CantCreateWindow ); - - // We don't need the nib reference anymore. - DisposeNibReference(nibRef); - - HIRect boundsRect; - // GOOD and BAD methods off embedding into a window. This is used - // to test Window::SetPositionRelative under different situations. -#define GOOD -#ifdef GOOD -#ifdef USE_CONTROL - ControlRef root; - GetRootControl(window, &root); -#else - HIViewRef root; - HIViewFindByID(HIViewGetRoot(window), - kHIViewWindowContentID, - &root); -#endif - HIViewGetBounds(root, &boundsRect); - -#else // BAD like mozilla - HIViewRef root; - root = HIViewGetRoot(window); - - Rect cBounds, sBounds; - GetWindowBounds(window, kWindowContentRgn, &cBounds); - GetWindowBounds(window, kWindowStructureRgn, &sBounds); - boundsRect.origin.x = cBounds.left - sBounds.left; - boundsRect.origin.y = cBounds.top - sBounds.top; - boundsRect.size.width = cBounds.right - cBounds.left; - boundsRect.size.height = cBounds.bottom - cBounds.top; -#endif - - // get a scintilla control, and add it to it's parent container - HIViewRef sciView; - sciView = scintilla_new(); - HIViewAddSubview(root, sciView); - - // some scintilla init - ScintillaMacOSX* scintilla; - GetControlProperty( sciView, scintillaMacOSType, 0, sizeof( scintilla ), NULL, &scintilla ); - - scintilla->WndProc( SCI_SETLEXER, SCLEX_CPP, 0); - scintilla->WndProc( SCI_SETSTYLEBITS, 5, 0); - - scintilla->WndProc(SCI_STYLESETFORE, 0, 0x808080); // White space - scintilla->WndProc(SCI_STYLESETFORE, 1, 0x007F00); // Comment - scintilla->WndProc(SCI_STYLESETITALIC, 1, 1); // Comment - scintilla->WndProc(SCI_STYLESETFORE, 2, 0x007F00); // Line comment - scintilla->WndProc(SCI_STYLESETITALIC, 2, 1); // Line comment - scintilla->WndProc(SCI_STYLESETFORE, 3, 0x3F703F); // Doc comment - scintilla->WndProc(SCI_STYLESETITALIC, 3, 1); // Doc comment - scintilla->WndProc(SCI_STYLESETFORE, 4, 0x7F7F00); // Number - scintilla->WndProc(SCI_STYLESETFORE, 5, 0x7F0000); // Keyword - scintilla->WndProc(SCI_STYLESETBOLD, 5, 1); // Keyword - scintilla->WndProc(SCI_STYLESETFORE, 6, 0x7F007F); // String - scintilla->WndProc(SCI_STYLESETFORE, 7, 0x7F007F); // Character - scintilla->WndProc(SCI_STYLESETFORE, 8, 0x804080); // UUID - scintilla->WndProc(SCI_STYLESETFORE, 9, 0x007F7F); // Preprocessor - scintilla->WndProc(SCI_STYLESETFORE,10, 0x000000); // Operators - scintilla->WndProc(SCI_STYLESETBOLD,10, 1); // Operators - scintilla->WndProc(SCI_STYLESETFORE,11, 0x000000); // Identifiers - - - scintilla->WndProc(SCI_SETKEYWORDS, 0, (sptr_t)(char *)keywords); // Keyword - - /* - these fail compilation on osx now - scintilla->WndProc( SCI_SETPROPERTY, "fold", (long int)"1"); - scintilla->WndProc( SCI_SETPROPERTY, "fold.compact", (long int)"0"); - scintilla->WndProc( SCI_SETPROPERTY, "fold.comment", (long int)"1"); - scintilla->WndProc( SCI_SETPROPERTY, "fold.preprocessor", (long int)"1"); - */ - - scintilla->WndProc( SCI_REGISTERIMAGE, 0, (long int)ac_class); - - scintilla->WndProc( SCI_SETMARGINTYPEN, 0, (long int)SC_MARGIN_NUMBER); - scintilla->WndProc( SCI_SETMARGINWIDTHN, 0, (long int)30); - scintilla->WndProc( SCI_SETMARGINTYPEN, 1, (long int)SC_MARGIN_SYMBOL); - scintilla->WndProc( SCI_SETMARGINMASKN, 1, (long int)SC_MASK_FOLDERS); - scintilla->WndProc( SCI_SETMARGINWIDTHN, 1, (long int)20); - scintilla->WndProc( SCI_SETMARGINTYPEN, 2, (long int)SC_MARGIN_SYMBOL); - scintilla->WndProc( SCI_SETMARGINWIDTHN, 2, (long int)16); - //scintilla->WndProc( SCI_SETWRAPMODE, SC_WRAP_WORD, 0); - //scintilla->WndProc( SCI_SETWRAPVISUALFLAGS, SC_WRAPVISUALFLAG_END | SC_WRAPVISUALFLAG_START, 0); - - // set the size of scintilla to the size of the container - HIViewSetFrame( sciView, &boundsRect ); - - // bind the size of scintilla to the size of it's container window - HIViewSetLayoutInfo(sciView, &kBindToParentLayout); - - // setup some event handling - static const EventTypeSpec kWindowMouseEvents[] = - { - { kEventClassMouse, kEventMouseDown }, - }; - - InstallEventHandler( GetWindowEventTarget( window ), WindowEventHandler, - GetEventTypeCount( kWindowMouseEvents ), kWindowMouseEvents, &sciView, NULL ); - - // show scintilla - ShowControl(sciView); - - SetAutomaticControlDragTrackingEnabledForWindow(window, true); - - // The window was created hidden so show it. - ShowWindow( window ); - - // Call the event loop - RunApplicationEventLoop(); - -CantCreateWindow: -CantSetMenuBar: -CantGetNibRef: - return err; -} - diff --git a/macosx/SciTest/version.plist b/macosx/SciTest/version.plist deleted file mode 100644 index df8c3dc7d..000000000 --- a/macosx/SciTest/version.plist +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>BuildVersion</key> - <string>92</string> - <key>CFBundleVersion</key> - <string>1.0</string> - <key>ProductBuildVersion</key> - <string>7K571</string> - <key>ProjectName</key> - <string>NibPBTemplates</string> - <key>SourceVersion</key> - <string>1200000</string> -</dict> -</plist> diff --git a/macosx/ScintillaCallTip.cxx b/macosx/ScintillaCallTip.cxx deleted file mode 100644 index 6799b435a..000000000 --- a/macosx/ScintillaCallTip.cxx +++ /dev/null @@ -1,117 +0,0 @@ - -#include "ScintillaMacOSX.h" -#include "ScintillaCallTip.h" -#include "CallTip.h" - -using namespace Scintilla; - -const CFStringRef ScintillaCallTip::kScintillaCallTipClassID = CFSTR( "org.scintilla.calltip" ); -const ControlKind ScintillaCallTip::kScintillaCallTipKind = { 'ejon', 'Scct' }; - -ScintillaCallTip::ScintillaCallTip( void* windowid ) : - TView( reinterpret_cast<HIViewRef>( windowid ) ) -{ - ActivateInterface( kMouse ); - // debugPrint = true; -} - -void ScintillaCallTip::Draw( - RgnHandle /*inLimitRgn*/, - CGContextRef inContext ) -{ - // Get a reference to the Scintilla C++ object - CallTip* ctip = NULL; - OSStatus err; - err = GetControlProperty( GetViewRef(), scintillaCallTipType, 0, sizeof( ctip ), NULL, &ctip ); - assert(err == noErr); - if (ctip == NULL) return; - - 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()); - ctip->PaintCT(surfaceWindow); - surfaceWindow->Release(); - delete surfaceWindow; - } - -} - -ControlPartCode ScintillaCallTip::HitTest( const HIPoint& where ) -{ - if ( CGRectContainsPoint( Bounds(), where ) ) - return 1; - else - return kControlNoPart; -} - -OSStatus ScintillaCallTip::MouseDown(HIPoint& location, UInt32 /*inKeyModifiers*/, EventMouseButton button, UInt32 /*inClickCount*/ ) -{ - if ( button != kEventMouseButtonPrimary ) return eventNotHandledErr; - CallTip* ctip = NULL; - ScintillaMacOSX *sciThis = NULL; - OSStatus err = GetControlProperty( GetViewRef(), scintillaCallTipType, 0, sizeof( ctip ), NULL, &ctip ); - err = GetControlProperty( GetViewRef(), scintillaMacOSType, 0, sizeof( sciThis ), NULL, &sciThis ); - ctip->MouseClick( Scintilla::Point( static_cast<int>( location.x ), static_cast<int>( location.y ) )); - sciThis->CallTipClick(); - return noErr; -} - -OSStatus ScintillaCallTip::MouseUp(HIPoint& /*inMouseLocation*/, UInt32 /*inKeyModifiers*/, EventMouseButton button, UInt32 /*inClickCount*/ ) -{ - if ( button != kEventMouseButtonPrimary ) return eventNotHandledErr; - return noErr; -} - -OSStatus ScintillaCallTip::MouseDragged( HIPoint& location, UInt32 /*modifiers*/, EventMouseButton /*button*/, UInt32 /*clickCount*/ ) -{ - SetThemeCursor( kThemeArrowCursor ); - return noErr; -} - -HIViewRef ScintillaCallTip::Create() -{ - // Register the HIView, if needed - static bool registered = false; - - if ( not registered ) - { - TView::RegisterSubclass( kScintillaCallTipClassID, Construct ); - registered = true; - } - - OSStatus err = noErr; - EventRef event = CreateInitializationEvent(); - assert( event != NULL ); - - HIViewRef control = NULL; - err = HIObjectCreate( kScintillaCallTipClassID, event, reinterpret_cast<HIObjectRef*>( &control ) ); - ReleaseEvent( event ); - if ( err == noErr ) { - Platform::DebugPrintf("ScintillaCallTip::Create control %08X\n",control); - return control; - } - return NULL; -} - -OSStatus ScintillaCallTip::Construct( HIViewRef inControl, TView** outView ) -{ - *outView = new ScintillaCallTip( inControl ); - Platform::DebugPrintf("ScintillaCallTip::Construct scintilla %08X\n",*outView); - if ( *outView != NULL ) - return noErr; - else - return memFullErr; -} - -extern "C" { -HIViewRef scintilla_calltip_new() { - return ScintillaCallTip::Create(); -} -} diff --git a/macosx/ScintillaCallTip.h b/macosx/ScintillaCallTip.h deleted file mode 100644 index 525804942..000000000 --- a/macosx/ScintillaCallTip.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ScintillaMacOSX.h - * tutorial - * - * Created by Evan Jones on Sun Sep 01 2002. - * Copyright (c) 2002 __MyCompanyName__. All rights reserved. - * - */ -#ifndef SCINTILLA_CALLTIP_H -#define SCINTILLA_CALLTIP_H - -#include "TView.h" - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <ctype.h> -#include <time.h> - -#include "Platform.h" -#include "Scintilla.h" - -static const OSType scintillaCallTipType = 'Scct'; - -namespace Scintilla { - -class ScintillaCallTip : public TView -{ -public: - // Private so ScintillaCallTip objects can not be copied - ScintillaCallTip(const ScintillaCallTip &) : TView( NULL ) {} - ScintillaCallTip &operator=(const ScintillaCallTip &) { return * this; } - ~ScintillaCallTip() {}; - -public: - /** This is the class ID that we've assigned to Scintilla. */ - static const CFStringRef kScintillaCallTipClassID; - static const ControlKind kScintillaCallTipKind; - - ScintillaCallTip( void* windowid ); - - /** Returns the HIView object kind, needed to subclass TView. */ - virtual ControlKind GetKind() { return kScintillaCallTipKind; } - -private: - - virtual ControlPartCode HitTest( const HIPoint& where ); - virtual void Draw( RgnHandle rgn, CGContextRef gc ); - virtual OSStatus MouseDown( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); - virtual OSStatus MouseUp( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); - virtual OSStatus MouseDragged( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); - -public: - static HIViewRef Create(); -private: - static OSStatus Construct( HIViewRef inControl, TView** outView ); - -}; - - -} - - -#endif diff --git a/macosx/ScintillaListBox.cxx b/macosx/ScintillaListBox.cxx deleted file mode 100644 index 90c72d857..000000000 --- a/macosx/ScintillaListBox.cxx +++ /dev/null @@ -1,103 +0,0 @@ - -#include "ScintillaMacOSX.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<HIViewRef>( 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()); - 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; - ScintillaMacOSX *sciThis = NULL; - OSStatus err = GetControlProperty( GetViewRef(), scintillaListBoxType, 0, sizeof( ctip ), NULL, &ctip ); - err = GetControlProperty( GetViewRef(), scintillaMacOSType, 0, sizeof( sciThis ), NULL, &sciThis ); - ctip->MouseClick( Scintilla::Point( static_cast<int>( location.x ), static_cast<int>( location.y ) )); - 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<HIObjectRef*>( &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(); -} -} diff --git a/macosx/ScintillaListBox.h b/macosx/ScintillaListBox.h deleted file mode 100644 index e26d354eb..000000000 --- a/macosx/ScintillaListBox.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * ScintillaMacOSX.h - * tutorial - * - * Created by Evan Jones on Sun Sep 01 2002. - * Copyright (c) 2002 __MyCompanyName__. All rights reserved. - * - */ -#ifndef SCINTILLA_LISTBOX_H -#define SCINTILLA_LISTBOX_H - -#include "TView.h" - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <ctype.h> -#include <time.h> - -#include "Platform.h" -#include "Scintilla.h" - -static const OSType scintillaListBoxType = 'sclb'; - -namespace Scintilla { - -class ScintillaListBox : public TView -{ -public: - // Private so ScintillaListBox objects can not be copied - ScintillaListBox(const ScintillaListBox &) : TView( NULL ) {} - ScintillaListBox &operator=(const ScintillaListBox &) { return * this; } - ~ScintillaListBox() {}; - -public: - /** This is the class ID that we've assigned to Scintilla. */ - static const CFStringRef kScintillaListBoxClassID; - static const ControlKind kScintillaListBoxKind; - - ScintillaListBox( void* windowid ); - - /** Returns the HIView object kind, needed to subclass TView. */ - virtual ControlKind GetKind() { return kScintillaListBoxKind; } - -private: - - virtual ControlPartCode HitTest( const HIPoint& where ); - virtual void Draw( RgnHandle rgn, CGContextRef gc ); - virtual OSStatus MouseDown( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); - virtual OSStatus MouseUp( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); - -public: - static HIViewRef Create(); -private: - static OSStatus Construct( HIViewRef inControl, TView** outView ); - -}; - - -} - - -#endif diff --git a/macosx/ScintillaMacOSX.cxx b/macosx/ScintillaMacOSX.cxx deleted file mode 100644 index d1bee757f..000000000 --- a/macosx/ScintillaMacOSX.cxx +++ /dev/null @@ -1,2244 +0,0 @@ -// Scintilla source code edit control -// ScintillaMacOSX.cxx - Mac OS X subclass of ScintillaBase -// Copyright 2003 by Evan Jones <ejones@uwaterloo.ca> -// Based on ScintillaGTK.cxx Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org> -// The License.txt file describes the conditions under which this software may be distributed. - - -#include "ScintillaMacOSX.h" -#ifdef EXT_INPUT -// External Input Editor -#include "ExtInput.h" -#else -#include "UniConversion.h" -#endif - -using namespace Scintilla; - -const CFStringRef ScintillaMacOSX::kScintillaClassID = CFSTR( "org.scintilla.scintilla" ); -const ControlKind ScintillaMacOSX::kScintillaKind = { 'ejon', 'Scin' }; - -extern "C" HIViewRef scintilla_calltip_new(void); - -#ifndef WM_UNICHAR -#define WM_UNICHAR 0x0109 -#endif - -// required for paste/dragdrop, see comment in paste function below -static int BOMlen(unsigned char *cstr) { - switch(cstr[0]) { - case 0xEF: // BOM_UTF8 - if (cstr[1] == 0xBB && cstr[2] == 0xBF) { - return 3; - } - break; - case 0xFE: - if (cstr[1] == 0xFF) { - if (cstr[2] == 0x00 && cstr[3] == 0x00) { - return 4; - } - return 2; - } - break; - case 0xFF: - if (cstr[1] == 0xFE) { - if (cstr[2] == 0x00 && cstr[3] == 0x00) { - return 4; - } - return 2; - } - break; - case 0x00: - if (cstr[1] == 0x00) { - if (cstr[2] == 0xFE && cstr[3] == 0xFF) { - return 4; - } - if (cstr[2] == 0xFF && cstr[3] == 0xFE) { - return 4; - } - return 2; - } - break; - } - - return 0; -} - -#ifdef EXT_INPUT -#define SCI_CMD ( SCI_ALT | SCI_CTRL | SCI_SHIFT) - -static const KeyToCommand macMapDefault[] = { - {SCK_DOWN, SCI_CMD, SCI_DOCUMENTEND}, - {SCK_UP, SCI_CMD, SCI_DOCUMENTSTART}, - {SCK_LEFT, SCI_CMD, SCI_VCHOME}, - {SCK_RIGHT, SCI_CMD, SCI_LINEEND}, - {SCK_DOWN, SCI_NORM, SCI_LINEDOWN}, - {SCK_DOWN, SCI_SHIFT, SCI_LINEDOWNEXTEND}, - {SCK_DOWN, SCI_CTRL, SCI_LINESCROLLDOWN}, - {SCK_DOWN, SCI_ASHIFT, SCI_LINEDOWNRECTEXTEND}, - {SCK_UP, SCI_NORM, SCI_LINEUP}, - {SCK_UP, SCI_SHIFT, SCI_LINEUPEXTEND}, - {SCK_UP, SCI_CTRL, SCI_LINESCROLLUP}, - {SCK_UP, SCI_ASHIFT, SCI_LINEUPRECTEXTEND}, - {'[', SCI_CTRL, SCI_PARAUP}, - {'[', SCI_CSHIFT, SCI_PARAUPEXTEND}, - {']', SCI_CTRL, SCI_PARADOWN}, - {']', SCI_CSHIFT, SCI_PARADOWNEXTEND}, - {SCK_LEFT, SCI_NORM, SCI_CHARLEFT}, - {SCK_LEFT, SCI_SHIFT, SCI_CHARLEFTEXTEND}, - {SCK_LEFT, SCI_ALT, SCI_WORDLEFT}, - {SCK_LEFT, SCI_CSHIFT, SCI_WORDLEFTEXTEND}, - {SCK_LEFT, SCI_ASHIFT, SCI_CHARLEFTRECTEXTEND}, - {SCK_RIGHT, SCI_NORM, SCI_CHARRIGHT}, - {SCK_RIGHT, SCI_SHIFT, SCI_CHARRIGHTEXTEND}, - {SCK_RIGHT, SCI_ALT, SCI_WORDRIGHT}, - {SCK_RIGHT, SCI_CSHIFT, SCI_WORDRIGHTEXTEND}, - {SCK_RIGHT, SCI_ASHIFT, SCI_CHARRIGHTRECTEXTEND}, - {'/', SCI_CTRL, SCI_WORDPARTLEFT}, - {'/', SCI_CSHIFT, SCI_WORDPARTLEFTEXTEND}, - {'\\', SCI_CTRL, SCI_WORDPARTRIGHT}, - {'\\', SCI_CSHIFT, SCI_WORDPARTRIGHTEXTEND}, - {SCK_HOME, SCI_NORM, SCI_VCHOME}, - {SCK_HOME, SCI_SHIFT, SCI_VCHOMEEXTEND}, - {SCK_HOME, SCI_CTRL, SCI_DOCUMENTSTART}, - {SCK_HOME, SCI_CSHIFT, SCI_DOCUMENTSTARTEXTEND}, - {SCK_HOME, SCI_ALT, SCI_HOMEDISPLAY}, -// {SCK_HOME, SCI_ASHIFT, SCI_HOMEDISPLAYEXTEND}, - {SCK_HOME, SCI_ASHIFT, SCI_VCHOMERECTEXTEND}, - {SCK_END, SCI_NORM, SCI_LINEEND}, - {SCK_END, SCI_SHIFT, SCI_LINEENDEXTEND}, - {SCK_END, SCI_CTRL, SCI_DOCUMENTEND}, - {SCK_END, SCI_CSHIFT, SCI_DOCUMENTENDEXTEND}, - {SCK_END, SCI_ALT, SCI_LINEENDDISPLAY}, -// {SCK_END, SCI_ASHIFT, SCI_LINEENDDISPLAYEXTEND}, - {SCK_END, SCI_ASHIFT, SCI_LINEENDRECTEXTEND}, - {SCK_PRIOR, SCI_NORM, SCI_PAGEUP}, - {SCK_PRIOR, SCI_SHIFT, SCI_PAGEUPEXTEND}, - {SCK_PRIOR, SCI_ASHIFT, SCI_PAGEUPRECTEXTEND}, - {SCK_NEXT, SCI_NORM, SCI_PAGEDOWN}, - {SCK_NEXT, SCI_SHIFT, SCI_PAGEDOWNEXTEND}, - {SCK_NEXT, SCI_ASHIFT, SCI_PAGEDOWNRECTEXTEND}, - {SCK_DELETE, SCI_NORM, SCI_CLEAR}, - {SCK_DELETE, SCI_SHIFT, SCI_CUT}, - {SCK_DELETE, SCI_CTRL, SCI_DELWORDRIGHT}, - {SCK_DELETE, SCI_CSHIFT, SCI_DELLINERIGHT}, - {SCK_INSERT, SCI_NORM, SCI_EDITTOGGLEOVERTYPE}, - {SCK_INSERT, SCI_SHIFT, SCI_PASTE}, - {SCK_INSERT, SCI_CTRL, SCI_COPY}, - {SCK_ESCAPE, SCI_NORM, SCI_CANCEL}, - {SCK_BACK, SCI_NORM, SCI_DELETEBACK}, - {SCK_BACK, SCI_SHIFT, SCI_DELETEBACK}, - {SCK_BACK, SCI_CTRL, SCI_DELWORDLEFT}, - {SCK_BACK, SCI_ALT, SCI_UNDO}, - {SCK_BACK, SCI_CSHIFT, SCI_DELLINELEFT}, - {'Z', SCI_CTRL, SCI_UNDO}, - {'Y', SCI_CTRL, SCI_REDO}, - {'X', SCI_CTRL, SCI_CUT}, - {'C', SCI_CTRL, SCI_COPY}, - {'V', SCI_CTRL, SCI_PASTE}, - {'A', SCI_CTRL, SCI_SELECTALL}, - {SCK_TAB, SCI_NORM, SCI_TAB}, - {SCK_TAB, SCI_SHIFT, SCI_BACKTAB}, - {SCK_RETURN, SCI_NORM, SCI_NEWLINE}, - {SCK_RETURN, SCI_SHIFT, SCI_NEWLINE}, - {SCK_ADD, SCI_CTRL, SCI_ZOOMIN}, - {SCK_SUBTRACT, SCI_CTRL, SCI_ZOOMOUT}, - {SCK_DIVIDE, SCI_CTRL, SCI_SETZOOM}, - //'L', SCI_CTRL, SCI_FORMFEED, - {'L', SCI_CTRL, SCI_LINECUT}, - {'L', SCI_CSHIFT, SCI_LINEDELETE}, - {'T', SCI_CSHIFT, SCI_LINECOPY}, - {'T', SCI_CTRL, SCI_LINETRANSPOSE}, - {'D', SCI_CTRL, SCI_SELECTIONDUPLICATE}, - {'U', SCI_CTRL, SCI_LOWERCASE}, - {'U', SCI_CSHIFT, SCI_UPPERCASE}, - {0,0,0}, -}; -#endif - -ScintillaMacOSX::ScintillaMacOSX( void* windowid ) : - TView( reinterpret_cast<HIViewRef>( windowid ) ) -{ - notifyObj = NULL; - notifyProc = NULL; - wMain = windowid; - OSStatus err; - err = GetThemeMetric( kThemeMetricScrollBarWidth, &scrollBarFixedSize ); - assert( err == noErr ); - - mouseTrackingRef = NULL; - mouseTrackingID.signature = scintillaMacOSType; - mouseTrackingID.id = (SInt32)this; - capturedMouse = false; - - // Enable keyboard events and mouse events -#if !defined(CONTAINER_HANDLES_EVENTS) - ActivateInterface( kKeyboardFocus ); - ActivateInterface( kMouse ); - ActivateInterface( kDragAndDrop ); -#endif - ActivateInterface( kMouseTracking ); - - Initialise(); - - // Create some bounds rectangle which will just get reset to the correct rectangle later - Rect tempScrollRect; - tempScrollRect.top = -1; - tempScrollRect.left = 400; - tempScrollRect.bottom = 300; - tempScrollRect.right = 450; - - // Create the scroll bar with fake values that will get set correctly later - err = CreateScrollBarControl( this->GetOwner(), &tempScrollRect, 0, 0, 100, 100, true, LiveScrollHandler, &vScrollBar ); - assert( vScrollBar != NULL && err == noErr ); - err = CreateScrollBarControl( this->GetOwner(), &tempScrollRect, 0, 0, 100, 100, true, LiveScrollHandler, &hScrollBar ); - assert( hScrollBar != NULL && err == noErr ); - - // Set a property on the scrollbars to store a pointer to the Scintilla object - ScintillaMacOSX* objectPtr = this; - err = SetControlProperty( vScrollBar, scintillaMacOSType, 0, sizeof( this ), &objectPtr ); - assert( err == noErr ); - err = SetControlProperty( hScrollBar, scintillaMacOSType, 0, sizeof( this ), &objectPtr ); - assert( err == noErr ); - - // set this into our parent control so we can be retrieved easily at a later time - // (see scintilla_send below) - err = SetControlProperty( reinterpret_cast<HIViewRef>( windowid ), scintillaMacOSType, 0, sizeof( this ), &objectPtr ); - assert( err == noErr ); - - // Tell Scintilla not to buffer: Quartz buffers drawing for us - // TODO: Can we disable this option on Mac OS X? - WndProc( SCI_SETBUFFEREDDRAW, 0, 0 ); - // Turn on UniCode mode - WndProc( SCI_SETCODEPAGE, SC_CP_UTF8, 0 ); - - const EventTypeSpec commandEventInfo[] = { - { kEventClassCommand, kEventProcessCommand }, - { kEventClassCommand, kEventCommandUpdateStatus }, - }; - - err = InstallEventHandler( GetControlEventTarget( reinterpret_cast<HIViewRef>( windowid ) ), - CommandEventHandler, - GetEventTypeCount( commandEventInfo ), - commandEventInfo, - this, NULL); -#ifdef EXT_INPUT - ExtInput::attach (GetViewRef()); - for (int i = 0; macMapDefault[i].key; i++) - { - this->kmap.AssignCmdKey(macMapDefault[i].key, macMapDefault[i].modifiers, macMapDefault[i].msg); - } -#endif -} - -ScintillaMacOSX::~ScintillaMacOSX() { - // If the window is closed and the timer is not removed, - // A segment violation will occur when it attempts to fire the timer next. - if ( mouseTrackingRef != NULL ) { - ReleaseMouseTrackingRegion(mouseTrackingRef); - } - mouseTrackingRef = NULL; - SetTicking(false); -#ifdef EXT_INPUT - ExtInput::detach (GetViewRef()); -#endif -} - -void ScintillaMacOSX::Initialise() { - // TODO: Do anything here? Maybe this stuff should be here instead of the constructor? -} - -void ScintillaMacOSX::Finalise() { - SetTicking(false); - ScintillaBase::Finalise(); -} - -// -------------------------------------------------------------------------------------------------------------- -// -// IsDropInFinderTrash - Returns true if the given dropLocation AEDesc is a descriptor of the Finder's Trash. -// -#pragma segment Drag - -Boolean IsDropInFinderTrash(AEDesc *dropLocation) -{ - OSErr result; - AEDesc dropSpec; - FSSpec *theSpec; - CInfoPBRec thePB; - short trashVRefNum; - long trashDirID; - - // Coerce the dropLocation descriptor into an FSSpec. If there's no dropLocation or - // it can't be coerced into an FSSpec, then it couldn't have been the Trash. - - if ((dropLocation->descriptorType != typeNull) && - (AECoerceDesc(dropLocation, typeFSS, &dropSpec) == noErr)) - { - unsigned char flags = HGetState((Handle)dropSpec.dataHandle); - - HLock((Handle)dropSpec.dataHandle); - theSpec = (FSSpec *) *dropSpec.dataHandle; - - // Get the directory ID of the given dropLocation object. - - thePB.dirInfo.ioCompletion = 0L; - thePB.dirInfo.ioNamePtr = (StringPtr) &theSpec->name; - thePB.dirInfo.ioVRefNum = theSpec->vRefNum; - thePB.dirInfo.ioFDirIndex = 0; - thePB.dirInfo.ioDrDirID = theSpec->parID; - - result = PBGetCatInfoSync(&thePB); - - HSetState((Handle)dropSpec.dataHandle, flags); - AEDisposeDesc(&dropSpec); - - if (result != noErr) - return false; - - // If the result is not a directory, it must not be the Trash. - - if (!(thePB.dirInfo.ioFlAttrib & (1 << 4))) - return false; - - // Get information about the Trash folder. - - FindFolder(theSpec->vRefNum, kTrashFolderType, kCreateFolder, &trashVRefNum, &trashDirID); - - // If the directory ID of the dropLocation object is the same as the directory ID - // returned by FindFolder, then the drop must have occurred into the Trash. - - if (thePB.dirInfo.ioDrDirID == trashDirID) - return true; - } - - return false; - -} // IsDropInFinderTrash - -HIPoint ScintillaMacOSX::GetLocalPoint(::Point pt) -{ - // get the mouse position so we can offset it - Rect bounds; - GetWindowBounds( GetOwner(), kWindowStructureRgn, &bounds ); - - PRectangle hbounds = wMain.GetPosition(); - HIViewRef parent = HIViewGetSuperview(GetViewRef()); - Rect pbounds; - GetControlBounds(parent, &pbounds); - - bounds.left += pbounds.left + hbounds.left; - bounds.top += pbounds.top + hbounds.top; - - HIPoint offset = { pt.h - bounds.left, pt.v - bounds.top }; - return offset; -} - -void ScintillaMacOSX::StartDrag() { - if (sel.Empty()) return; - - // calculate the bounds of the selection - PRectangle client = GetTextRectangle(); - int selStart = sel.RangeMain().Start().Position(); - int selEnd = sel.RangeMain().End().Position(); - int startLine = pdoc->LineFromPosition(selStart); - int endLine = pdoc->LineFromPosition(selEnd); - Point pt; - int startPos, endPos, ep; - Rect rcSel; - rcSel.top = rcSel.bottom = rcSel.right = rcSel.left = -1; - for (int l = startLine; l <= endLine; l++) { - startPos = WndProc(SCI_GETLINESELSTARTPOSITION, l, 0); - endPos = WndProc(SCI_GETLINESELENDPOSITION, l, 0); - if (endPos == startPos) continue; - // step back a position if we're counting the newline - ep = WndProc(SCI_GETLINEENDPOSITION, l, 0); - if (endPos > ep) endPos = ep; - - pt = LocationFromPosition(startPos); // top left of line selection - if (pt.x < rcSel.left || rcSel.left < 0) rcSel.left = pt.x; - if (pt.y < rcSel.top || rcSel.top < 0) rcSel.top = pt.y; - - pt = LocationFromPosition(endPos); // top right of line selection - pt.y += vs.lineHeight; // get to the bottom of the line - if (pt.x > rcSel.right || rcSel.right < 0) { - if (pt.x > client.right) - rcSel.right = client.right; - else - rcSel.right = pt.x; - } - if (pt.y > rcSel.bottom || rcSel.bottom < 0) { - if (pt.y > client.bottom) - rcSel.bottom = client.bottom; - else - rcSel.bottom = pt.y; - } - } - - // must convert to global coordinates for drag regions, but also save the - // image rectangle for further calculations and copy operations - PRectangle imageRect = PRectangle(rcSel.left, rcSel.top, rcSel.right, rcSel.bottom); - QDLocalToGlobalRect(GetWindowPort(GetOwner()), &rcSel); - - // get the mouse position so we can offset it - HIPoint offset = GetLocalPoint(mouseDownEvent.where); - offset.y = (imageRect.top * 1.0) - offset.y; - offset.x = (imageRect.left * 1.0) - offset.x; - - // to get a bitmap of the text we're dragging, we just use Paint on a - // pixmap surface. - SurfaceImpl *sw = new SurfaceImpl(); - SurfaceImpl *pixmap = NULL; - - if (sw) { - pixmap = new SurfaceImpl(); - if (pixmap) { - client = GetClientRectangle(); - paintState = painting; - sw->InitPixMap( client.Width(), client.Height(), NULL, NULL ); - paintingAllText = true; - Paint(sw, imageRect); - paintState = notPainting; - - pixmap->InitPixMap( imageRect.Width(), imageRect.Height(), NULL, NULL ); - - CGContextRef gc = pixmap->GetContext(); - - // to make Paint() work on a bitmap, we have to flip our coordinates - // and translate the origin - //fprintf(stderr, "translate to %d\n", client.Height() ); - CGContextTranslateCTM(gc, 0, imageRect.Height()); - CGContextScaleCTM(gc, 1.0, -1.0); - - pixmap->CopyImageRectangle( *sw, imageRect, PRectangle( 0, 0, imageRect.Width(), imageRect.Height() )); - // XXX TODO: overwrite any part of the image that is not part of the - // selection to make it transparent. right now we just use - // the full rectangle which may include non-selected text. - } - sw->Release(); - delete sw; - } - - // now we initiate the drag session - - RgnHandle dragRegion = NewRgn(); - RgnHandle tempRegion; - DragRef inDrag; - DragAttributes attributes; - AEDesc dropLocation; - SInt16 mouseDownModifiers, mouseUpModifiers; - bool copyText; - CGImageRef image = NULL; - - RectRgn(dragRegion, &rcSel); - - SelectionText selectedText; - CopySelectionRange(&selectedText); - PasteboardRef theClipboard; - SetPasteboardData(theClipboard, selectedText, true); - NewDragWithPasteboard( theClipboard, &inDrag); - CFRelease( theClipboard ); - - // Set the item's bounding rectangle in global coordinates. - SetDragItemBounds(inDrag, 1, &rcSel); - - // Prepare the drag region. - tempRegion = NewRgn(); - CopyRgn(dragRegion, tempRegion); - InsetRgn(tempRegion, 1, 1); - DiffRgn(dragRegion, tempRegion, dragRegion); - DisposeRgn(tempRegion); - - // if we have a pixmap, lets use that - if (pixmap) { - image = pixmap->GetImage(); - SetDragImageWithCGImage (inDrag, image, &offset, kDragStandardTranslucency); - } - - // Drag the text. TrackDrag will return userCanceledErr if the drop whooshed back for any reason. - inDragDrop = ddDragging; - OSErr error = TrackDrag(inDrag, &mouseDownEvent, dragRegion); - inDragDrop = ddNone; - - // Check to see if the drop occurred in the Finder's Trash. If the drop occurred - // in the Finder's Trash and a copy operation wasn't specified, delete the - // source selection. Note that we can continute to get the attributes, drop location - // modifiers, etc. of the drag until we dispose of it using DisposeDrag. - if (error == noErr) { - GetDragAttributes(inDrag, &attributes); - if (!(attributes & kDragInsideSenderApplication)) - { - GetDropLocation(inDrag, &dropLocation); - - GetDragModifiers(inDrag, 0L, &mouseDownModifiers, &mouseUpModifiers); - copyText = (mouseDownModifiers | mouseUpModifiers) & optionKey; - - if ((!copyText) && (IsDropInFinderTrash(&dropLocation))) - { - // delete the selected text from the buffer - ClearSelection(); - } - - AEDisposeDesc(&dropLocation); - } - } - - // Dispose of this drag, 'cause we're done. - DisposeDrag(inDrag); - DisposeRgn(dragRegion); - - if (pixmap) { - CGImageRelease(image); - pixmap->Release(); - delete pixmap; - } -} - -void ScintillaMacOSX::SetDragCursor(DragRef inDrag) -{ - DragAttributes attributes; - SInt16 modifiers = 0; - ThemeCursor cursor = kThemeCopyArrowCursor; - GetDragAttributes( inDrag, &attributes ); - - if ( attributes & kDragInsideSenderWindow ) { - GetDragModifiers(inDrag, &modifiers, NULL, NULL); - switch (modifiers & ~btnState) // Filter out btnState (on for drop) - { - case optionKey: - // it's a copy, leave it as a copy arrow - break; - - case cmdKey: - case cmdKey | optionKey: - default: - // what to do with these? rectangular drag? - cursor = kThemeArrowCursor; - break; - } - } - SetThemeCursor(cursor); -} - -bool ScintillaMacOSX::DragEnter(DragRef inDrag ) -{ - if (!DragWithin(inDrag)) - return false; - - DragAttributes attributes; - GetDragAttributes( inDrag, &attributes ); - - // only show the drag hilight if the drag has left the sender window per HI spec - if( attributes & kDragHasLeftSenderWindow ) - { - HIRect textFrame; - RgnHandle hiliteRgn = NewRgn(); - - // get the text view's frame ... - HIViewGetFrame( GetViewRef(), &textFrame ); - - // ... and convert it into a region for ShowDragHilite - HIShapeRef textShape = HIShapeCreateWithRect( &textFrame ); - HIShapeGetAsQDRgn( textShape, hiliteRgn ); - CFRelease( textShape ); - - // add the drag hilight to the inside of the text view - ShowDragHilite( inDrag, hiliteRgn, true ); - - DisposeRgn( hiliteRgn ); - } - SetDragCursor(inDrag); - return true; -} - -Scintilla::Point ScintillaMacOSX::GetDragPoint(DragRef inDrag) -{ - ::Point mouse, globalMouse; - GetDragMouse(inDrag, &mouse, &globalMouse); - HIPoint hiPoint = GetLocalPoint (globalMouse); - return Point(static_cast<int>(hiPoint.x), static_cast<int>(hiPoint.y)); -} - - -void ScintillaMacOSX::DragScroll() -{ -#define RESET_SCROLL_TIMER(lines) \ - scrollSpeed = (lines); \ - scrollTicks = 2000; - - if (!posDrag.IsValid()) { - RESET_SCROLL_TIMER(1); - return; - } - Point dragMouse = LocationFromPosition(posDrag); - int line = pdoc->LineFromPosition(posDrag.Position()); - int currentVisibleLine = cs.DisplayFromDoc(line); - int lastVisibleLine = Platform::Minimum(topLine + LinesOnScreen() - 1, pdoc->LinesTotal() - 1); - - if (currentVisibleLine <= topLine && topLine > 0) { - ScrollTo( topLine - scrollSpeed ); - } else if (currentVisibleLine >= lastVisibleLine) { - ScrollTo( topLine + scrollSpeed ); - } else { - RESET_SCROLL_TIMER(1); - return; - } - if (scrollSpeed == 1) { - scrollTicks -= timer.tickSize; - if (scrollTicks <= 0) { - RESET_SCROLL_TIMER(5); - } - } - - SetDragPosition(SPositionFromLocation(dragMouse)); - -#undef RESET_SCROLL_TIMER -} - -bool ScintillaMacOSX::DragWithin(DragRef inDrag ) -{ - PasteboardRef pasteBoard; - bool isFileURL = false; - if (!GetDragData(inDrag, pasteBoard, NULL, &isFileURL)) { - return false; - } - - Point pt = GetDragPoint (inDrag); - SetDragPosition(SPositionFromLocation(pt)); - SetDragCursor(inDrag); - - return true; -} - -bool ScintillaMacOSX::DragLeave(DragRef inDrag ) -{ - HideDragHilite( inDrag ); - SetDragPosition(SelectionPosition(invalidPosition)); - WndProc(SCI_SETCURSOR, Window::cursorArrow, 0); - return true; -} - -enum -{ - kFormatBad, - kFormatText, - kFormatUnicode, - kFormatUTF8, - kFormatFile -}; - -bool ScintillaMacOSX::GetDragData(DragRef inDrag, PasteboardRef &pasteBoard, - SelectionText *selectedText, bool *isFileURL) -{ - // TODO: add support for special flavors: flavorTypeHFS and flavorTypePromiseHFS so we - // can handle files being dropped on the editor - OSStatus status; - status = GetDragPasteboard(inDrag, &pasteBoard); - if (status != noErr) { - return false; - } - return GetPasteboardData(pasteBoard, selectedText, isFileURL); -} - -void ScintillaMacOSX::SetPasteboardData(PasteboardRef &theClipboard, const SelectionText &selectedText, bool inDragDropSession) -{ - if (selectedText.len == 0) - return; - - CFStringEncoding encoding = ( IsUnicodeMode() ? kCFStringEncodingUTF8 : kCFStringEncodingMacRoman); - - // Create a CFString from the ASCII/UTF8 data, convert it to UTF16 - CFStringRef string = CFStringCreateWithBytes( NULL, reinterpret_cast<UInt8*>( selectedText.s ), selectedText.len - 1, encoding, false ); - - PasteboardCreate((inDragDropSession - ? kPasteboardUniqueName - : kPasteboardClipboard), &theClipboard ); - PasteboardClear( theClipboard ); - - CFDataRef data = NULL; - if (selectedText.rectangular) { - // This is specific to scintilla, allows us to drag rectangular selections - // around the document - data = CFStringCreateExternalRepresentation ( kCFAllocatorDefault, string, kCFStringEncodingUnicode, 0 ); - if (data) { - PasteboardPutItemFlavor( theClipboard, (PasteboardItemID)1, - CFSTR("com.scintilla.utf16-plain-text.rectangular"), - data, 0 ); - CFRelease(data); - } - } - data = CFStringCreateExternalRepresentation ( kCFAllocatorDefault, string, kCFStringEncodingUnicode, 0 ); - if (data) { - PasteboardPutItemFlavor( theClipboard, (PasteboardItemID)1, - CFSTR("public.utf16-plain-text"), - data, 0 ); - CFRelease(data); - data = NULL; - } - data = CFStringCreateExternalRepresentation ( kCFAllocatorDefault, string, kCFStringEncodingMacRoman, 0 ); - if (data) { - PasteboardPutItemFlavor( theClipboard, (PasteboardItemID)1, - CFSTR("com.apple.traditional-mac-plain-text"), - data, 0 ); - CFRelease(data); - data = NULL; - } - CFRelease(string); -} - -bool ScintillaMacOSX::GetPasteboardData(PasteboardRef &pasteBoard, - SelectionText *selectedText, - bool *isFileURL) -{ - // how many items in the pasteboard? - CFDataRef data; - CFStringRef textString = NULL; - bool isRectangular = selectedText ? selectedText->rectangular : false; - ItemCount i, itemCount; - OSStatus status = PasteboardGetItemCount(pasteBoard, &itemCount); - if (status != noErr) { - return false; - } - - // as long as we didn't get our text, let's loop on the items. We stop as soon as we get it - CFArrayRef flavorTypeArray = NULL; - bool haveMatch = false; - for (i = 1; i <= itemCount; i++) - { - PasteboardItemID itemID; - CFIndex j, flavorCount = 0; - - status = PasteboardGetItemIdentifier(pasteBoard, i, &itemID); - if (status != noErr) { - return false; - } - - // how many flavors in this item? - status = PasteboardCopyItemFlavors(pasteBoard, itemID, &flavorTypeArray); - if (status != noErr) { - return false; - } - - if (flavorTypeArray != NULL) - flavorCount = CFArrayGetCount(flavorTypeArray); - - // as long as we didn't get our text, let's loop on the flavors. We stop as soon as we get it - for(j = 0; j < flavorCount; j++) - { - CFDataRef flavorData; - CFStringRef flavorType = (CFStringRef)CFArrayGetValueAtIndex(flavorTypeArray, j); - if (flavorType != NULL) - { - int format = kFormatBad; - if (UTTypeConformsTo(flavorType, CFSTR("public.file-url"))) { - format = kFormatFile; - *isFileURL = true; - } - else if (UTTypeConformsTo(flavorType, CFSTR("com.scintilla.utf16-plain-text.rectangular"))) { - format = kFormatUnicode; - isRectangular = true; - } - else if (UTTypeConformsTo(flavorType, CFSTR("public.utf16-plain-text"))) { // this is 'utxt' - format = kFormatUnicode; - } - else if (UTTypeConformsTo(flavorType, CFSTR("public.utf8-plain-text"))) { - format = kFormatUTF8; - } - else if (UTTypeConformsTo(flavorType, CFSTR("com.apple.traditional-mac-plain-text"))) { // this is 'TEXT' - format = kFormatText; - } - if (format == kFormatBad) - continue; - - // if we got a flavor match, and we have no textString, we just want - // to know that we can accept this data, so jump out now - if (selectedText == NULL) { - haveMatch = true; - goto PasteboardDataRetrieved; - } - if (PasteboardCopyItemFlavorData(pasteBoard, itemID, flavorType, &flavorData) == noErr) - { - CFIndex dataSize = CFDataGetLength (flavorData); - const UInt8* dataBytes = CFDataGetBytePtr (flavorData); - switch (format) - { - case kFormatFile: - case kFormatText: - data = CFDataCreate (NULL, dataBytes, dataSize); - textString = CFStringCreateFromExternalRepresentation (NULL, data, kCFStringEncodingMacRoman); - break; - case kFormatUnicode: - data = CFDataCreate (NULL, dataBytes, dataSize); - textString = CFStringCreateFromExternalRepresentation (NULL, data, kCFStringEncodingUnicode); - break; - case kFormatUTF8: - data = CFDataCreate (NULL, dataBytes, dataSize); - textString = CFStringCreateFromExternalRepresentation (NULL, data, kCFStringEncodingUTF8); - break; - } - CFRelease (flavorData); - goto PasteboardDataRetrieved; - } - } - } - } -PasteboardDataRetrieved: - if (flavorTypeArray != NULL) CFRelease(flavorTypeArray); - int newlen = 0; - if (textString != NULL) { - selectedText->s = GetStringFromCFString(textString, &selectedText->len); - selectedText->rectangular = isRectangular; - // Default allocator releases both the CFString and the UniChar buffer (text) - CFRelease( textString ); - textString = NULL; - } - if (haveMatch || selectedText != NULL && selectedText->s != NULL) { - return true; - } - return false; -} - -char *ScintillaMacOSX::GetStringFromCFString(CFStringRef &textString, int *textLen) -{ - - // Allocate a buffer, plus the null byte - CFIndex numUniChars = CFStringGetLength( textString ); - CFStringEncoding encoding = ( IsUnicodeMode() ? kCFStringEncodingUTF8 : kCFStringEncodingMacRoman); - CFIndex maximumByteLength = CFStringGetMaximumSizeForEncoding( numUniChars, encoding ) + 1; - char* cstring = new char[maximumByteLength]; - CFIndex usedBufferLength = 0; - CFIndex numCharsConverted; - numCharsConverted = CFStringGetBytes( textString, CFRangeMake( 0, numUniChars ), encoding, - '?', false, reinterpret_cast<UInt8*>( cstring ), - maximumByteLength, &usedBufferLength ); - cstring[usedBufferLength] = '\0'; // null terminate the ASCII/UTF8 string - - // determine whether a BOM is in the string. Apps like Emacs prepends a BOM - // to the string, CFStrinGetBytes reflects that (though it may change in the conversion) - // so we need to remove it before pasting into our buffer. TextWrangler has no - // problem dealing with BOM when pasting into it. - int bomLen = BOMlen((unsigned char *)cstring); - - // convert line endings to the document line ending - *textLen = 0; - char *result = Document::TransformLineEnds(textLen, - cstring + bomLen, - usedBufferLength - bomLen, - pdoc->eolMode); - delete[] cstring; - return result; -} - -OSStatus ScintillaMacOSX::DragReceive(DragRef inDrag ) -{ - // dragleave IS called, but for some reason (probably to do with inDrag) - // the hide hilite does not happen unless we do it here - HideDragHilite( inDrag ); - - PasteboardRef pasteBoard; - SelectionText selectedText; - CFStringRef textString = NULL; - bool isFileURL = false; - if (!GetDragData(inDrag, pasteBoard, &selectedText, &isFileURL)) { - return dragNotAcceptedErr; - } - - if (isFileURL) { - NotifyURIDropped(selectedText.s); - } else { - // figure out if this is a move or a paste - DragAttributes attributes; - SInt16 modifiers = 0; - GetDragAttributes( inDrag, &attributes ); - bool moving = true; - - SelectionPosition position = SPositionFromLocation(GetDragPoint(inDrag)); - if ( attributes & kDragInsideSenderWindow ) { - GetDragModifiers(inDrag, NULL, NULL, &modifiers); - switch (modifiers & ~btnState) // Filter out btnState (on for drop) - { - case optionKey: - // default is copy text - moving = false; - break; - case cmdKey: - case cmdKey | optionKey: - default: - // what to do with these? rectangular drag? - break; - } - } - - DropAt(position, selectedText.s, moving, selectedText.rectangular); - } - - return noErr; -} - -// Extended UTF8-UTF6-conversion to handle surrogate pairs correctly (CL265070) -void ScintillaMacOSX::InsertCharacters (const UniChar* buf, int len) -{ - CFStringRef str = CFStringCreateWithCharactersNoCopy (NULL, buf, (UInt32) len, kCFAllocatorNull); - CFStringEncoding encoding = ( IsUnicodeMode() ? kCFStringEncodingUTF8 : kCFStringEncodingMacRoman); - CFRange range = { 0, len }; - CFIndex bufLen; - CFStringGetBytes (str, range, encoding, '?', false, NULL, 0, &bufLen); - UInt8* utf8buf = new UInt8 [bufLen]; - CFStringGetBytes (str, range, encoding, '?', false, utf8buf, bufLen, NULL); - AddCharUTF ((char*) utf8buf, bufLen, false); - delete [] utf8buf; - CFRelease (str); -} - -/** The simulated message loop. */ -sptr_t ScintillaMacOSX::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { - switch (iMessage) { - case SCI_GETDIRECTFUNCTION: - Platform::DebugDisplay( "ScintillaMacOSX::WndProc: Returning DirectFunction address.\n" ); - return reinterpret_cast<sptr_t>( DirectFunction ); - - case SCI_GETDIRECTPOINTER: - Platform::DebugDisplay( "ScintillaMacOSX::WndProc: Returning Direct pointer address.\n" ); - return reinterpret_cast<sptr_t>( this ); - - case SCI_GRABFOCUS: - Platform::DebugDisplay( "ScintillaMacOSX::WndProc: Got an unhandled message. Ignoring it.\n" ); - break; - case WM_UNICHAR: - if (IsUnicodeMode()) { - // Extended UTF8-UTF6-conversion to handle surrogate pairs correctly (CL265070) - UniChar wcs[1] = { (UniChar) wParam}; - InsertCharacters(wcs, 1); - return 1; - } else { - return 0; - } - - default: - unsigned int r = ScintillaBase::WndProc(iMessage, wParam, lParam); - - return r; - } - return 0l; -} - -sptr_t ScintillaMacOSX::DefWndProc(unsigned int, uptr_t, sptr_t) { - return 0; -} - -void ScintillaMacOSX::SetTicking(bool on) { - if (timer.ticking != on) { - timer.ticking = on; - if (timer.ticking) { - // Scintilla ticks = milliseconds - EventLoopTimerRef timerRef = NULL; - InstallTimer( timer.tickSize * kEventDurationMillisecond, &timerRef ); - assert( timerRef != NULL ); - timer.tickerID = reinterpret_cast<TickerID>( timerRef ); - } else if ( timer.tickerID != NULL ) { - RemoveEventLoopTimer( reinterpret_cast<EventLoopTimerRef>( timer.tickerID ) ); - } - } - timer.ticksToWait = caret.period; -} - -bool ScintillaMacOSX::SetIdle(bool on) { - if (on) { - // Start idler, if it's not running. - if (idler.state == false) { - idler.state = true; - EventLoopTimerRef idlTimer; - InstallEventLoopIdleTimer(GetCurrentEventLoop(), - timer.tickSize * kEventDurationMillisecond, - 75 * kEventDurationMillisecond, - IdleTimerEventHandler, this, &idlTimer); - idler.idlerID = reinterpret_cast<IdlerID>( idlTimer ); - } - } else { - // Stop idler, if it's running - if (idler.state == true) { - idler.state = false; - if (idler.idlerID != NULL) - RemoveEventLoopTimer( reinterpret_cast<EventLoopTimerRef>( idler.idlerID ) ); - } - } - return true; -} - -pascal void ScintillaMacOSX::IdleTimerEventHandler( EventLoopTimerRef inTimer, - EventLoopIdleTimerMessage inState, - void *scintilla ) -{ - ScintillaMacOSX *sciThis = reinterpret_cast<ScintillaMacOSX*>( scintilla ); - bool ret = sciThis->Idle(); - if (ret == false) { - sciThis->SetIdle(false); - } -} - -void ScintillaMacOSX::SetMouseCapture(bool on) { - capturedMouse = on; - if (mouseDownCaptures) { - if (capturedMouse) { - WndProc(SCI_SETCURSOR, Window::cursorArrow, 0); - } else { - // reset to normal, buttonmove will change for other area's in the editor - WndProc(SCI_SETCURSOR, (long int)SC_CURSORNORMAL, 0); - } - } -} - -bool ScintillaMacOSX::HaveMouseCapture() { - return capturedMouse; -} - -// The default GetClientRectangle calls GetClientPosition on wMain. -// We override it to return "view local" co-ordinates so we can draw properly -// plus we need to remove the space occupied by the scroll bars -PRectangle ScintillaMacOSX::GetClientRectangle() { - PRectangle rc = wMain.GetClientPosition(); - if (verticalScrollBarVisible) - rc.right -= scrollBarFixedSize + 1; - if (horizontalScrollBarVisible && (wrapState == eWrapNone)) - rc.bottom -= scrollBarFixedSize + 1; - // Move to origin - rc.right -= rc.left; - rc.bottom -= rc.top; - rc.left = 0; - rc.top = 0; - return rc; -} - -// Synchronously paint a rectangle of the window. -void ScintillaMacOSX::SyncPaint(void* gc, PRectangle rc) { - paintState = painting; - rcPaint = rc; - PRectangle rcText = GetTextRectangle(); - paintingAllText = rcPaint.Contains(rcText); - //Platform::DebugPrintf("ScintillaMacOSX::SyncPaint %0d,%0d %0d,%0d\n", - // rcPaint.left, rcPaint.top, rcPaint.right, rcPaint.bottom); - Surface *sw = Surface::Allocate(); - if (sw) { - sw->Init( gc, wMain.GetID() ); - Paint(sw, rc); - if (paintState == paintAbandoned) { - // do a FULL paint. - rcPaint = GetClientRectangle(); - paintState = painting; - paintingAllText = true; - Paint(sw, rcPaint); - wMain.InvalidateAll(); - } - sw->Release(); - delete sw; - } - paintState = notPainting; -} - -void ScintillaMacOSX::ScrollText(int /*linesToMove*/) { - // This function will invalidate the correct regions of the view, - // So shortly after this happens, draw will be called. - // But I'm not quite sure how this works ... - // I have a feeling that it is only supposed to work in conjunction with an HIScrollView. - // TODO: Cook up my own bitblt scroll: Grab the bits on screen, blit them shifted, invalidate the remaining stuff - //CGRect r = CGRectMake( 0, 0, rc.Width(), rc.Height() ); - //HIViewScrollRect( reinterpret_cast<HIViewRef>( wMain.GetID() ), NULL, 0, vs.lineHeight * linesToMove ); - wMain.InvalidateAll(); -} - -void ScintillaMacOSX::SetVerticalScrollPos() { - SetControl32BitValue( vScrollBar, topLine ); -} - -void ScintillaMacOSX::SetHorizontalScrollPos() { - SetControl32BitValue( hScrollBar, xOffset ); -} - -bool ScintillaMacOSX::ModifyScrollBars(int nMax, int nPage) { - Platform::DebugPrintf( "nMax: %d nPage: %d hScroll (%d -> %d) page: %d\n", nMax, nPage, 0, scrollWidth, GetTextRectangle().Width() ); - // Minimum value = 0 - // TODO: This is probably not needed, since we set this when the scroll bars are created - SetControl32BitMinimum( vScrollBar, 0 ); - SetControl32BitMinimum( hScrollBar, 0 ); - - // Maximum vertical value = nMax + 1 - nPage (lines available to scroll) - SetControl32BitMaximum( vScrollBar, Platform::Maximum( nMax + 1 - nPage, 0 ) ); - // Maximum horizontal value = scrollWidth - GetTextRectangle().Width() (pixels available to scroll) - SetControl32BitMaximum( hScrollBar, Platform::Maximum( scrollWidth - GetTextRectangle().Width(), 0 ) ); - - // Vertical page size = nPage - SetControlViewSize( vScrollBar, nPage ); - // Horizontal page size = TextRectangle().Width() - SetControlViewSize( hScrollBar, GetTextRectangle().Width() ); - - // TODO: Verify what this return value is for - // The scroll bar components will handle if they need to be rerendered or not - return false; -} - -void ScintillaMacOSX::ReconfigureScrollBars() { - PRectangle rc = wMain.GetClientPosition(); - Resize(rc.Width(), rc.Height()); -} - -void ScintillaMacOSX::Resize(int width, int height) { - // Get the horizontal/vertical size of the scroll bars - GetThemeMetric( kThemeMetricScrollBarWidth, &scrollBarFixedSize ); - - bool showSBHorizontal = horizontalScrollBarVisible && (wrapState == eWrapNone); - HIRect scrollRect; - if (verticalScrollBarVisible) { - scrollRect.origin.x = width - scrollBarFixedSize; - scrollRect.origin.y = 0; - scrollRect.size.width = scrollBarFixedSize; - if (showSBHorizontal) { - scrollRect.size.height = Platform::Maximum(1, height - scrollBarFixedSize); - } else { - scrollRect.size.height = height; - } - - HIViewSetFrame( vScrollBar, &scrollRect ); - if (HIViewGetSuperview(vScrollBar) == NULL) { - HIViewSetDrawingEnabled( vScrollBar, true ); - HIViewSetVisible(vScrollBar, true); - HIViewAddSubview(GetViewRef(), vScrollBar ); - Draw1Control(vScrollBar); - } - } else if (HIViewGetSuperview(vScrollBar) != NULL) { - HIViewSetDrawingEnabled( vScrollBar, false ); - HIViewRemoveFromSuperview(vScrollBar); - } - - if (showSBHorizontal) { - scrollRect.origin.x = 0; - // Always draw the scrollbar to avoid the "potiential" horizontal scroll bar and to avoid the resize box. - // This should be "good enough". Best would be to avoid the resize box. - // Even better would be to embed Scintilla inside an HIScrollView, which would handle this for us. - scrollRect.origin.y = height - scrollBarFixedSize; - if (verticalScrollBarVisible) { - scrollRect.size.width = Platform::Maximum( 1, width - scrollBarFixedSize ); - } else { - scrollRect.size.width = width; - } - scrollRect.size.height = scrollBarFixedSize; - - HIViewSetFrame( hScrollBar, &scrollRect ); - if (HIViewGetSuperview(hScrollBar) == NULL) { - HIViewSetDrawingEnabled( hScrollBar, true ); - HIViewAddSubview( GetViewRef(), hScrollBar ); - Draw1Control(hScrollBar); - } - } else if (HIViewGetSuperview(hScrollBar) != NULL) { - HIViewSetDrawingEnabled( hScrollBar, false ); - HIViewRemoveFromSuperview(hScrollBar); - } - - ChangeSize(); - - // fixup mouse tracking regions, this causes mouseenter/exit to work - if (HIViewGetSuperview(GetViewRef()) != NULL) { - RgnHandle rgn = NewRgn(); - HIRect r; - HIViewGetFrame( reinterpret_cast<HIViewRef>( GetViewRef() ), &r ); - SetRectRgn(rgn, short (r.origin.x), short (r.origin.y), - short (r.origin.x + r.size.width - (verticalScrollBarVisible ? scrollBarFixedSize : 0)), - short (r.origin.y + r.size.height - (showSBHorizontal ? scrollBarFixedSize : 0))); - if (mouseTrackingRef == NULL) { - CreateMouseTrackingRegion(GetOwner(), rgn, NULL, - kMouseTrackingOptionsLocalClip, - mouseTrackingID, NULL, - GetControlEventTarget( GetViewRef() ), - &mouseTrackingRef); - } else { - ChangeMouseTrackingRegion(mouseTrackingRef, rgn, NULL); - } - DisposeRgn(rgn); - } else { - if (mouseTrackingRef != NULL) { - ReleaseMouseTrackingRegion(mouseTrackingRef); - } - mouseTrackingRef = NULL; - } -} - -pascal void ScintillaMacOSX::LiveScrollHandler( HIViewRef control, SInt16 part ) -{ - int currentValue = GetControl32BitValue( control ); - int min = GetControl32BitMinimum( control ); - int max = GetControl32BitMaximum( control ); - int page = GetControlViewSize( control ); - - // Get a reference to the Scintilla C++ object - ScintillaMacOSX* scintilla = NULL; - OSStatus err; - err = GetControlProperty( control, scintillaMacOSType, 0, sizeof( scintilla ), NULL, &scintilla ); - assert( err == noErr && scintilla != NULL ); - - int singleScroll = 0; - if ( control == scintilla->vScrollBar ) - { - // Vertical single scroll = one line - // TODO: Is there a Scintilla preference for this somewhere? - singleScroll = 1; - } else { - assert( control == scintilla->hScrollBar ); - // Horizontal single scroll = 20 pixels (hardcoded from ScintillaWin) - // TODO: Is there a Scintilla preference for this somewhere? - singleScroll = 20; - } - - // Determine the new value - int newValue = 0; - switch ( part ) - { - case kControlUpButtonPart: - newValue = Platform::Maximum( currentValue - singleScroll, min ); - break; - - case kControlDownButtonPart: - // the the user scrolls to the right, allow more scroll space - if ( control == scintilla->hScrollBar && currentValue >= max) { - // change the max value - scintilla->scrollWidth += singleScroll; - SetControl32BitMaximum( control, - Platform::Maximum( scintilla->scrollWidth - scintilla->GetTextRectangle().Width(), 0 ) ); - max = GetControl32BitMaximum( control ); - scintilla->SetScrollBars(); - } - newValue = Platform::Minimum( currentValue + singleScroll, max ); - break; - - case kControlPageUpPart: - newValue = Platform::Maximum( currentValue - page, min ); - break; - - case kControlPageDownPart: - newValue = Platform::Minimum( currentValue + page, max ); - break; - - case kControlIndicatorPart: - case kControlNoPart: - newValue = currentValue; - break; - - default: - assert( false ); - return; - } - - // Set the new value - if ( control == scintilla->vScrollBar ) - { - scintilla->ScrollTo( newValue ); - } else { - assert( control == scintilla->hScrollBar ); - scintilla->HorizontalScrollTo( newValue ); - } -} - -bool ScintillaMacOSX::ScrollBarHit(HIPoint location) { - // is this on our scrollbars? If so, track them - HIViewRef view; - // view is null if on editor, otherwise on scrollbar - HIViewGetSubviewHit(reinterpret_cast<ControlRef>(wMain.GetID()), - &location, true, &view); - if (view) { - HIViewPartCode part; - - // make the point local to a scrollbar - PRectangle client = GetClientRectangle(); - if (view == vScrollBar) { - location.x -= client.Width(); - } else if (view == hScrollBar) { - location.y -= client.Height(); - } else { - fprintf(stderr, "got a subview hit, but not a scrollbar???\n"); - return false; - } - - HIViewGetPartHit(view, &location, &part); - - switch (part) - { - case kControlUpButtonPart: - case kControlDownButtonPart: - case kControlPageUpPart: - case kControlPageDownPart: - case kControlIndicatorPart: - ::Point p; - p.h = location.x; - p.v = location.y; - // We are assuming Appearance 1.1 or later, so we - // have the "live scroll" variant of the scrollbar, - // which lets you pass the action proc to TrackControl - // for the thumb (this was illegal in previous - // versions of the defproc). - isTracking = true; - ::TrackControl(view, p, ScintillaMacOSX::LiveScrollHandler); - ::HiliteControl(view, 0); - isTracking = false; - // The mouseup was eaten by TrackControl, however if we - // do not get a mouseup in the scintilla xbl widget, - // many bad focus issues happen. Simply post a mouseup - // and this firey pit becomes a bit cooler. - PostEvent(mouseUp, 0); - break; - default: - fprintf(stderr, "PlatformScrollBarHit part %d\n", part); - } - return true; - } - return false; -} - -void ScintillaMacOSX::NotifyFocus(bool focus) { -#ifdef EXT_INPUT - ExtInput::activate (GetViewRef(), focus); -#endif - if (NULL != notifyProc) - notifyProc (notifyObj, WM_COMMAND, - (uintptr_t) ((focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS) << 16), - (uintptr_t) GetViewRef()); -} - -void ScintillaMacOSX::NotifyChange() { - if (NULL != notifyProc) - notifyProc (notifyObj, WM_COMMAND, - (uintptr_t) (SCEN_CHANGE << 16), - (uintptr_t) GetViewRef()); -} - -void ScintillaMacOSX::registerNotifyCallback(intptr_t windowid, SciNotifyFunc callback) { - notifyObj = windowid; - notifyProc = callback; -} - -void ScintillaMacOSX::NotifyParent(SCNotification scn) { - if (NULL != notifyProc) { - scn.nmhdr.hwndFrom = (void*) this; - scn.nmhdr.idFrom = (unsigned int)wMain.GetID(); - notifyProc (notifyObj, WM_NOTIFY, (uintptr_t) 0, (uintptr_t) &scn); - } -} - -void ScintillaMacOSX::NotifyKey(int key, int modifiers) { - SCNotification scn; - scn.nmhdr.code = SCN_KEY; - scn.ch = key; - scn.modifiers = modifiers; - - NotifyParent(scn); -} - -void ScintillaMacOSX::NotifyURIDropped(const char *list) { - SCNotification scn; - scn.nmhdr.code = SCN_URIDROPPED; - scn.text = list; - - NotifyParent(scn); -} - -#ifndef EXT_INPUT -// Extended UTF8-UTF6-conversion to handle surrogate pairs correctly (CL265070) -int ScintillaMacOSX::KeyDefault(int key, int modifiers) { - if (!(modifiers & SCI_CTRL) && !(modifiers & SCI_ALT) && (key < 256)) { - AddChar(key); - return 1; - } else { - // Pass up to container in case it is an accelerator - NotifyKey(key, modifiers); - return 0; - } - //Platform::DebugPrintf("SK-key: %d %x %x\n",key, modifiers); -} -#endif - -template <class T, class U> -struct StupidMap -{ -public: - T key; - U value; -}; - -template <class T, class U> -inline static U StupidMapFindFunction( const StupidMap<T, U>* elements, size_t length, const T& desiredKey ) -{ - for ( size_t i = 0; i < length; ++ i ) - { - if ( elements[i].key == desiredKey ) - { - return elements[i].value; - } - } - - return NULL; -} - -// NOTE: If this macro is used on a StupidMap that isn't defined by StupidMap x[] = ... -// The size calculation will fail! -#define StupidMapFind( x, y ) StupidMapFindFunction( x, sizeof(x)/sizeof(*x), y ) - -pascal OSStatus ScintillaMacOSX::CommandEventHandler( EventHandlerCallRef /*inCallRef*/, EventRef event, void* data ) -{ - // TODO: Verify automatically that each constant only appears once? - const StupidMap<UInt32, void (ScintillaMacOSX::*)()> processCommands[] = { - { kHICommandCopy, &ScintillaMacOSX::Copy }, - { kHICommandPaste, &ScintillaMacOSX::Paste }, - { kHICommandCut, &ScintillaMacOSX::Cut }, - { kHICommandUndo, &ScintillaMacOSX::Undo }, - { kHICommandRedo, &ScintillaMacOSX::Redo }, - { kHICommandClear, &ScintillaMacOSX::ClearSelectionSimple }, - { kHICommandSelectAll, &ScintillaMacOSX::SelectAll }, - }; - const StupidMap<UInt32, bool (ScintillaMacOSX::*)()> canProcessCommands[] = { - { kHICommandCopy, &ScintillaMacOSX::HasSelection }, - { kHICommandPaste, &ScintillaMacOSX::CanPaste }, - { kHICommandCut, &ScintillaMacOSX::HasSelection }, - { kHICommandUndo, &ScintillaMacOSX::CanUndo }, - { kHICommandRedo, &ScintillaMacOSX::CanRedo }, - { kHICommandClear, &ScintillaMacOSX::HasSelection }, - { kHICommandSelectAll, &ScintillaMacOSX::AlwaysTrue }, - }; - - HICommand command; - OSStatus result = GetEventParameter( event, kEventParamDirectObject, typeHICommand, NULL, sizeof( command ), NULL, &command ); - assert( result == noErr ); - - UInt32 kind = GetEventKind( event ); - Platform::DebugPrintf("ScintillaMacOSX::CommandEventHandler kind %d\n", kind); - - ScintillaMacOSX* scintilla = reinterpret_cast<ScintillaMacOSX*>( data ); - assert( scintilla != NULL ); - - if ( kind == kEventProcessCommand ) - { -#ifdef EXT_INPUT - // We are getting a HI command, so stop extended input - ExtInput::stop (scintilla->GetViewRef()); -#endif - // Find the method pointer that matches this command - void (ScintillaMacOSX::*methodPtr)() = StupidMapFind( processCommands, command.commandID ); - - if ( methodPtr != NULL ) - { - // Call the method if we found it, and tell the caller that we handled this event - (scintilla->*methodPtr)(); - result = noErr; - } else { - // tell the caller that we did not handle the event - result = eventNotHandledErr; - } - } - // The default Mac OS X text editor does not handle these events to enable/disable menu items - // Why not? I think it should, so Scintilla does. - else if ( kind == kEventCommandUpdateStatus && ( command.attributes & kHICommandFromMenu ) ) - { - // Find the method pointer that matches this command - bool (ScintillaMacOSX::*methodPtr)() = StupidMapFind( canProcessCommands, command.commandID ); - - if ( methodPtr != NULL ) { - // Call the method if we found it: enabling/disabling menu items - if ( (scintilla->*methodPtr)() ) { - EnableMenuItem( command.menu.menuRef, command.menu.menuItemIndex ); - } else { - DisableMenuItem( command.menu.menuRef, command.menu.menuItemIndex ); - } - result = noErr; - } else { - // tell the caller that we did not handle the event - result = eventNotHandledErr; - } - } else { - // Unhandled event: We should never get here - assert( false ); - result = eventNotHandledErr; - } - - return result; -} - -bool ScintillaMacOSX::HasSelection() -{ - return ( !sel.Empty() ); -} - -bool ScintillaMacOSX::CanUndo() -{ - return pdoc->CanUndo(); -} - -bool ScintillaMacOSX::CanRedo() -{ - return pdoc->CanRedo(); -} - -bool ScintillaMacOSX::AlwaysTrue() -{ - return true; -} - -void ScintillaMacOSX::CopyToClipboard(const SelectionText &selectedText) { - PasteboardRef theClipboard; - SetPasteboardData(theClipboard, selectedText, false); // not in drag/drop - // Done with the CFString - CFRelease( theClipboard ); -} - -void ScintillaMacOSX::Copy() -{ - if (!sel.Empty()) { -#ifdef EXT_INPUT - ExtInput::stop (GetViewRef()); -#endif - SelectionText selectedText; - CopySelectionRange(&selectedText); - fprintf(stderr, "copied text is rectangular? %d\n", selectedText.rectangular); - CopyToClipboard(selectedText); - } -} - -bool ScintillaMacOSX::CanPaste() -{ - if (!Editor::CanPaste()) - return false; - - PasteboardRef theClipboard; - bool isFileURL = false; - - PasteboardCreate( kPasteboardClipboard, &theClipboard ); - bool ok = GetPasteboardData(theClipboard, NULL, &isFileURL); - CFRelease( theClipboard ); - return ok; -} - -void ScintillaMacOSX::Paste() -{ - Paste(false); -} - -// XXX there is no system flag (I can find) to tell us that a paste is rectangular, so -// applications must implement an additional command (eg. option-V like BBEdit) -// in order to provide rectangular paste -void ScintillaMacOSX::Paste(bool forceRectangular) -{ - PasteboardRef theClipboard; - SelectionText selectedText; - selectedText.rectangular = forceRectangular; - bool isFileURL = false; - PasteboardCreate( kPasteboardClipboard, &theClipboard ); - bool ok = GetPasteboardData(theClipboard, &selectedText, &isFileURL); - CFRelease( theClipboard ); - fprintf(stderr, "paste is rectangular? %d\n", selectedText.rectangular); - if (!ok || !selectedText.s) - // no data or no flavor we support - return; - - pdoc->BeginUndoAction(); - ClearSelection(); - if (selectedText.rectangular) { - SelectionPosition selStart = sel.RangeMain().Start(); - PasteRectangular(selStart, selectedText.s, selectedText.len); - } else - if ( pdoc->InsertString( sel.RangeMain().caret.Position(), selectedText.s, selectedText.len ) ) { - SetEmptySelection( sel.RangeMain().caret.Position() + selectedText.len ); - } - - pdoc->EndUndoAction(); - - Redraw(); - EnsureCaretVisible(); -} - -void ScintillaMacOSX::CreateCallTipWindow(PRectangle rc) { - // create a calltip window - if (!ct.wCallTip.Created()) { - WindowClass windowClass = kHelpWindowClass; - WindowAttributes attributes = kWindowNoAttributes; - Rect contentBounds; - WindowRef outWindow; - - // convert PRectangle to Rect - // this adjustment gets the calltip window placed in the correct location relative - // to our editor window - Rect bounds; - OSStatus err; - err = GetWindowBounds( this->GetOwner(), kWindowGlobalPortRgn, &bounds ); - assert( err == noErr ); - contentBounds.top = rc.top + bounds.top; - contentBounds.bottom = rc.bottom + bounds.top; - contentBounds.right = rc.right + bounds.left; - contentBounds.left = rc.left + bounds.left; - - // create our calltip hiview - HIViewRef ctw = scintilla_calltip_new(); - CallTip* objectPtr = &ct; - ScintillaMacOSX* sciThis = this; - SetControlProperty( ctw, scintillaMacOSType, 0, sizeof( this ), &sciThis ); - SetControlProperty( ctw, scintillaCallTipType, 0, sizeof( objectPtr ), &objectPtr ); - - CreateNewWindow(windowClass, attributes, &contentBounds, &outWindow); - ControlRef root; - CreateRootControl(outWindow, &root); - - HIViewRef hiroot = HIViewGetRoot (outWindow); - HIViewAddSubview(hiroot, ctw); - - HIRect boundsRect; - HIViewGetFrame(hiroot, &boundsRect); - HIViewSetFrame( ctw, &boundsRect ); - - // bind the size of the calltip to the size of it's container window - HILayoutInfo layout = { - kHILayoutInfoVersionZero, - { - { NULL, kHILayoutBindTop, 0 }, - { NULL, kHILayoutBindLeft, 0 }, - { NULL, kHILayoutBindBottom, 0 }, - { NULL, kHILayoutBindRight, 0 } - }, - { - { NULL, kHILayoutScaleAbsolute, 0 }, - { NULL, kHILayoutScaleAbsolute, 0 } - - }, - { - { NULL, kHILayoutPositionTop, 0 }, - { NULL, kHILayoutPositionLeft, 0 } - } - }; - HIViewSetLayoutInfo(ctw, &layout); - - ct.wCallTip = root; - ct.wDraw = ctw; - ct.wCallTip.SetWindow(outWindow); - HIViewSetVisible(ctw,true); - - } -} - -void ScintillaMacOSX::CallTipClick() -{ - ScintillaBase::CallTipClick(); -} - -void ScintillaMacOSX::AddToPopUp( const char *label, int cmd, bool enabled ) -{ - // Translate stuff into menu item attributes - MenuItemAttributes attributes = 0; - if ( label[0] == '\0' ) attributes |= kMenuItemAttrSeparator; - if ( ! enabled ) attributes |= kMenuItemAttrDisabled; - - // Translate Scintilla commands into Mac OS commands - // TODO: If I create an AEDesc, OS X may insert these standard - // text editing commands into the menu for me - MenuCommand macCommand; - switch( cmd ) - { - case idcmdUndo: - macCommand = kHICommandUndo; - break; - case idcmdRedo: - macCommand = kHICommandRedo; - break; - case idcmdCut: - macCommand = kHICommandCut; - break; - case idcmdCopy: - macCommand = kHICommandCopy; - break; - case idcmdPaste: - macCommand = kHICommandPaste; - break; - case idcmdDelete: - macCommand = kHICommandClear; - break; - case idcmdSelectAll: - macCommand = kHICommandSelectAll; - break; - case 0: - macCommand = 0; - break; - default: - assert( false ); - return; - } - - CFStringRef string = CFStringCreateWithCString( NULL, label, kCFStringEncodingUTF8 ); - OSStatus err; - err = AppendMenuItemTextWithCFString( reinterpret_cast<MenuRef>( popup.GetID() ), - string, attributes, macCommand, NULL ); - assert( err == noErr ); - - CFRelease( string ); - string = NULL; -} - -void ScintillaMacOSX::ClaimSelection() { - // Mac OS X does not have a primary selection -} - -/** A wrapper function to permit external processes to directly deliver messages to our "message loop". */ -sptr_t ScintillaMacOSX::DirectFunction( - ScintillaMacOSX *sciThis, unsigned int iMessage, uptr_t wParam, sptr_t lParam) { - return sciThis->WndProc(iMessage, wParam, lParam); -} - -sptr_t scintilla_send_message(void* sci, unsigned int iMessage, uptr_t wParam, sptr_t lParam) { - HIViewRef control = reinterpret_cast<HIViewRef>(sci); - // Platform::DebugPrintf("scintilla_send_message %08X control %08X\n",sci,control); - // Get a reference to the Scintilla C++ object - ScintillaMacOSX* scintilla = NULL; - OSStatus err; - err = GetControlProperty( control, scintillaMacOSType, 0, sizeof( scintilla ), NULL, &scintilla ); - assert( err == noErr && scintilla != NULL ); - //Platform::DebugPrintf("scintilla_send_message scintilla %08X\n",scintilla); - - return scintilla->WndProc(iMessage, wParam, lParam); -} - -void ScintillaMacOSX::TimerFired( EventLoopTimerRef ) -{ - Tick(); - DragScroll(); -} - -OSStatus ScintillaMacOSX::BoundsChanged( UInt32 /*inOptions*/, const HIRect& inOriginalBounds, const HIRect& inCurrentBounds, RgnHandle /*inInvalRgn*/ ) -{ - // If the width or height changed, modify the scroll bars and notify Scintilla - // This event is also delivered when the window moves, and we don't care about that - if ( inOriginalBounds.size.width != inCurrentBounds.size.width || inOriginalBounds.size.height != inCurrentBounds.size.height ) - { - Resize( static_cast<int>( inCurrentBounds.size.width ), static_cast<int>( inCurrentBounds.size.height ) ); - } - return noErr; -} - -void ScintillaMacOSX::Draw( RgnHandle rgn, CGContextRef gc ) -{ - Rect invalidRect; - GetRegionBounds( rgn, &invalidRect ); - - // NOTE: We get draw events that include the area covered by the scroll bar. No fear: Scintilla correctly ignores them - SyncPaint( gc, PRectangle( invalidRect.left, invalidRect.top, invalidRect.right, invalidRect.bottom ) ); -} - -ControlPartCode ScintillaMacOSX::HitTest( const HIPoint& where ) -{ - if ( CGRectContainsPoint( Bounds(), where ) ) - return 1; - else - return kControlNoPart; -} - -OSStatus ScintillaMacOSX::SetFocusPart( ControlPartCode desiredFocus, RgnHandle /*invalidRgn*/, Boolean /*inFocusEverything*/, ControlPartCode* outActualFocus ) -{ - assert( outActualFocus != NULL ); - - if ( desiredFocus == 0 ) { - // We are losing the focus - SetFocusState(false); - } else { - // We are getting the focus - SetFocusState(true); - } - - *outActualFocus = desiredFocus; - return noErr; -} - -// Map Mac Roman character codes to their equivalent Scintilla codes -static inline int KeyTranslate( UniChar unicodeChar ) -{ - switch ( unicodeChar ) - { - case kDownArrowCharCode: - return SCK_DOWN; - case kUpArrowCharCode: - return SCK_UP; - case kLeftArrowCharCode: - return SCK_LEFT; - case kRightArrowCharCode: - return SCK_RIGHT; - case kHomeCharCode: - return SCK_HOME; - case kEndCharCode: - return SCK_END; -#ifndef EXT_INPUT - case kPageUpCharCode: - return SCK_PRIOR; - case kPageDownCharCode: - return SCK_NEXT; -#endif - case kDeleteCharCode: - return SCK_DELETE; - // TODO: Is there an insert key in the mac world? My insert key is the "help" key - case kHelpCharCode: - return SCK_INSERT; - case kEnterCharCode: - case kReturnCharCode: - return SCK_RETURN; -#ifdef EXT_INPUT - // BP 2006-08-22: These codes below should not be translated. Otherwise TextInput() will fail for keys like SCK_ADD, which is '+'. - case kBackspaceCharCode: - return SCK_BACK; - case kFunctionKeyCharCode: - case kBellCharCode: - case kVerticalTabCharCode: - case kFormFeedCharCode: - case 14: - case 15: - case kCommandCharCode: - case kCheckCharCode: - case kAppleLogoCharCode: - case 21: - case 22: - case 23: - case 24: - case 25: - case 26: - case kEscapeCharCode: - return 0; // ignore - default: - return unicodeChar; -#else - case kEscapeCharCode: - return SCK_ESCAPE; - case kBackspaceCharCode: - return SCK_BACK; - case '\t': - return SCK_TAB; - case '+': - return SCK_ADD; - case '-': - return SCK_SUBTRACT; - case '/': - return SCK_DIVIDE; - case kFunctionKeyCharCode: - return kFunctionKeyCharCode; - default: - return 0; -#endif - } -} - -static inline UniChar GetCharacterWithoutModifiers( EventRef rawKeyboardEvent ) -{ - UInt32 keyCode; - // Get the key code from the raw key event - GetEventParameter( rawKeyboardEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof( keyCode ), NULL, &keyCode ); - - // Get the current keyboard layout - // TODO: If this is a performance sink, we need to cache these values - SInt16 lastKeyLayoutID = GetScriptVariable( /*currentKeyScript*/ GetScriptManagerVariable(smKeyScript), smScriptKeys); - Handle uchrHandle = GetResource('uchr', lastKeyLayoutID); - - if (uchrHandle) { - // Translate the key press ignoring ctrl and option - UInt32 ignoredDeadKeys = 0; - UInt32 ignoredActualLength = 0; - UniChar unicodeKey = 0; - // (((modifiers & shiftKey) >> 8) & 0xFF) - OSStatus err; - err = UCKeyTranslate( reinterpret_cast<UCKeyboardLayout*>( *uchrHandle ), keyCode, kUCKeyActionDown, - /* modifierKeyState */ 0, LMGetKbdType(), kUCKeyTranslateNoDeadKeysMask, &ignoredDeadKeys, - /* buffer length */ 1, - /* actual length */ &ignoredActualLength, - /* string */ &unicodeKey ); - assert( err == noErr ); - - return unicodeKey; - } - return 0; -} - -// Text input is very annoying: -// If the control key is pressed, or if the key is a "special" key (eg. arrow keys, function keys, whatever) -// we let Scintilla handle it. If scintilla does not handle it, we do nothing (eventNotHandledErr). -// Otherwise, the event is just some text and we add it to the buffer -OSStatus ScintillaMacOSX::TextInput( TCarbonEvent& event ) -{ - // Obtain the number of bytes of text - UInt32 actualSize = 0; - OSStatus err; - err = event.GetParameterSize( kEventParamTextInputSendText, &actualSize ); - assert( err == noErr ); - assert( actualSize != 0 ); - - const int numUniChars = actualSize / sizeof( UniChar ); - -#ifdef EXT_INPUT - UniChar* text = new UniChar [numUniChars]; - err = event.GetParameter( kEventParamTextInputSendText, typeUnicodeText, actualSize, text ); - PLATFORM_ASSERT( err == noErr ); - - int modifiers = GetCurrentEventKeyModifiers(); - - // Loop over all characters in sequence - for (int i = 0; i < numUniChars; i++) - { - UniChar key = KeyTranslate( text[i] ); - if (!key) - continue; - - bool consumed = false; - - // need to go here first so e.g. Tab indentation works - KeyDown ((int) key, (modifiers & shiftKey) != 0 || (modifiers & cmdKey) != 0, (modifiers & controlKey) != 0 || (modifiers & cmdKey) != 0, - (modifiers & optionKey) != 0 || (modifiers & cmdKey) != 0, &consumed); - - // BP 2007-01-08: 1452623 Second Cmd+s to save doc inserts an "s" into the text on Mac. - // At this point we need to ignore all cmd/option keys with char value smaller than 32 - if( !consumed ) - consumed = ( modifiers & ( cmdKey | optionKey ) ) != 0 && text[i] < 32; - - // If not consumed, insert the original key - if (!consumed) - InsertCharacters (text+i, 1); - } - - delete[] text; - return noErr; -#else - // Allocate a buffer for the text using Core Foundation - UniChar* text = reinterpret_cast<UniChar*>( CFAllocatorAllocate( CFAllocatorGetDefault(), actualSize, 0 ) ); - assert( text != NULL ); - - // Get a copy of the text - err = event.GetParameter( kEventParamTextInputSendText, typeUnicodeText, actualSize, text ); - assert( err == noErr ); - - // TODO: This is a gross hack to ignore function keys - // Surely we can do better? - if ( numUniChars == 1 && text[0] == kFunctionKeyCharCode ) return eventNotHandledErr; - int modifiers = GetCurrentEventKeyModifiers(); - int scintillaKey = KeyTranslate( text[0] ); - - // Create a CFString which wraps and takes ownership of the "text" buffer - CFStringRef string = CFStringCreateWithCharactersNoCopy( NULL, text, numUniChars, NULL ); - assert( string != NULL ); - //delete text; - text = NULL; - - // If we have a single unicode character that is special or - // to process a command. Try to do some translation. - if ( numUniChars == 1 && ( modifiers & controlKey || scintillaKey != 0 ) ) { - // If we have a modifier, we need to get the character without modifiers - if ( modifiers & controlKey ) { - EventRef rawKeyboardEvent = NULL; - event.GetParameter( - kEventParamTextInputSendKeyboardEvent, - typeEventRef, - sizeof( EventRef ), - &rawKeyboardEvent ); - assert( rawKeyboardEvent != NULL ); - scintillaKey = GetCharacterWithoutModifiers( rawKeyboardEvent ); - - // Make sure that we still handle special characters correctly - int temp = KeyTranslate( scintillaKey ); - if ( temp != 0 ) scintillaKey = temp; - - // TODO: This is a gross Unicode hack: ASCII chars have a value < 127 - if ( scintillaKey <= 127 ) { - scintillaKey = toupper( (char) scintillaKey ); - } - } - - // Code taken from Editor::KeyDown - // It is copied here because we don't want to feed the key via - // KeyDefault if there is no special action - DwellEnd(false); - int scintillaModifiers = ( (modifiers & shiftKey) ? SCI_SHIFT : 0) | ( (modifiers & controlKey) ? SCI_CTRL : 0) | - ( (modifiers & optionKey) ? SCI_ALT : 0); - int msg = kmap.Find( scintillaKey, scintillaModifiers ); - if (msg) { - // The keymap has a special event for this key: perform the operation - WndProc(msg, 0, 0); - err = noErr; - } else { - // We do not handle this event - err = eventNotHandledErr; - } - } else { - CFStringEncoding encoding = ( IsUnicodeMode() ? kCFStringEncodingUTF8 : kCFStringEncodingASCII); - - // Allocate the buffer (don't forget the null!) - CFIndex maximumByteLength = CFStringGetMaximumSizeForEncoding( numUniChars, encoding ) + 1; - char* buffer = new char[maximumByteLength]; - - CFIndex usedBufferLength = 0; - CFIndex numCharsConverted; - numCharsConverted = CFStringGetBytes( string, CFRangeMake( 0, numUniChars ), encoding, - '?', false, reinterpret_cast<UInt8*>( buffer ), - maximumByteLength, &usedBufferLength ); - assert( numCharsConverted == numUniChars ); - buffer[usedBufferLength] = '\0'; // null terminate - - // Add all the characters to the document - // NOTE: OS X doesn't specify that text input events provide only a single character - // if we get a single character, add it as a character - // otherwise, we insert the entire string - if ( numUniChars == 1 ) { - AddCharUTF( buffer, usedBufferLength ); - } else { - // WARNING: This is an untested code path as with my US keyboard, I only enter a single character at a time - if (pdoc->InsertString(sel.RangeMain().caret.Position(), buffer, usedBufferLength)) { - SetEmptySelection(sel.RangeMain().caret.Position() + usedBufferLength); - } - } - - // Free the buffer that was allocated - delete[] buffer; - buffer = NULL; - err = noErr; - } - - // Default allocator releases both the CFString and the UniChar buffer (text) - CFRelease( string ); - string = NULL; - - return err; -#endif -} - -UInt32 ScintillaMacOSX::GetBehaviors() -{ - return TView::GetBehaviors() | kControlGetsFocusOnClick | kControlSupportsEmbedding; -} - -OSStatus ScintillaMacOSX::MouseEntered(HIPoint& location, UInt32 /*inKeyModifiers*/, EventMouseButton /*inMouseButton*/, UInt32 /*inClickCount*/ ) -{ - if (!HaveMouseCapture() && HIViewGetSuperview(GetViewRef()) != NULL) { - HIViewRef view; - HIViewGetSubviewHit(reinterpret_cast<ControlRef>(wMain.GetID()), &location, true, &view); - if (view) { - // the hit is on a subview (ie. scrollbars) - WndProc(SCI_SETCURSOR, Window::cursorArrow, 0); - } else { - // reset to normal, buttonmove will change for other area's in the editor - WndProc(SCI_SETCURSOR, (long int)SC_CURSORNORMAL, 0); - ButtonMove( Point( static_cast<int>( location.x ), static_cast<int>( location.y ) ) ); - } - return noErr; - } - return eventNotHandledErr; -} - -OSStatus ScintillaMacOSX::MouseExited(HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ) -{ - if (HIViewGetSuperview(GetViewRef()) != NULL) { - if (HaveMouseCapture()) { - ButtonUp( Scintilla::Point( static_cast<int>( location.x ), static_cast<int>( location.y ) ), - static_cast<int>( GetCurrentEventTime() / kEventDurationMillisecond ), - (modifiers & controlKey) != 0 ); - } - WndProc(SCI_SETCURSOR, Window::cursorArrow, 0); - return noErr; - } - return eventNotHandledErr; -} - - -OSStatus ScintillaMacOSX::MouseDown( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount , TCarbonEvent& inEvent) -{ - ConvertEventRefToEventRecord( inEvent.GetEventRef(), &mouseDownEvent ); - return MouseDown(location, modifiers, button, clickCount); -} - -OSStatus ScintillaMacOSX::MouseDown( EventRecord *event ) -{ - HIPoint pt = GetLocalPoint(event->where); - int button = kEventMouseButtonPrimary; - mouseDownEvent = *event; - - if ( event->modifiers & controlKey ) - button = kEventMouseButtonSecondary; - return MouseDown(pt, event->modifiers, button, 1); -} - -OSStatus ScintillaMacOSX::MouseDown( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 /*clickCount*/ ) -{ - // We only deal with the first mouse button - if ( button != kEventMouseButtonPrimary ) return eventNotHandledErr; - // TODO: Verify that Scintilla wants the time in milliseconds - if (!HaveMouseCapture() && HIViewGetSuperview(GetViewRef()) != NULL) { - if (ScrollBarHit(location)) return noErr; - } - ButtonDown( Scintilla::Point( static_cast<int>( location.x ), static_cast<int>( location.y ) ), - static_cast<int>( GetCurrentEventTime() / kEventDurationMillisecond ), - (modifiers & shiftKey) != 0, - (modifiers & controlKey) != 0, - (modifiers & cmdKey) ); -#if !defined(CONTAINER_HANDLES_EVENTS) - OSStatus err; - err = SetKeyboardFocus( this->GetOwner(), this->GetViewRef(), 1 ); - ::SetUserFocusWindow(::HIViewGetWindow( this->GetViewRef() )); - return noErr; -#else - return eventNotHandledErr; // allow event to go to container -#endif -} - -OSStatus ScintillaMacOSX::MouseUp( EventRecord *event ) -{ - HIPoint pt = GetLocalPoint(event->where); - int button = kEventMouseButtonPrimary; - if ( event->modifiers & controlKey ) - button = kEventMouseButtonSecondary; - return MouseUp(pt, event->modifiers, button, 1); -} - -OSStatus ScintillaMacOSX::MouseUp( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 /*clickCount*/ ) -{ - // We only deal with the first mouse button - if ( button != kEventMouseButtonPrimary ) return eventNotHandledErr; - ButtonUp( Scintilla::Point( static_cast<int>( location.x ), static_cast<int>( location.y ) ), - static_cast<int>( GetCurrentEventTime() / kEventDurationMillisecond ), - (modifiers & controlKey) != 0 ); - -#if !defined(CONTAINER_HANDLES_EVENTS) - return noErr; -#else - return eventNotHandledErr; // allow event to go to container -#endif -} - -OSStatus ScintillaMacOSX::MouseDragged( EventRecord *event ) -{ - HIPoint pt = GetLocalPoint(event->where); - int button = 0; - if ( event->modifiers & btnStateBit ) { - button = kEventMouseButtonPrimary; - if ( event->modifiers & controlKey ) - button = kEventMouseButtonSecondary; - } - return MouseDragged(pt, event->modifiers, button, 1); -} - -OSStatus ScintillaMacOSX::MouseDragged( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ) -{ -#if !defined(CONTAINER_HANDLES_EVENTS) - ButtonMove( Scintilla::Point( static_cast<int>( location.x ), static_cast<int>( location.y ) ) ); - return noErr; -#else - if (HaveMouseCapture() && !inDragDrop) { - MouseTrackingResult mouseStatus = 0; - ::Point theQDPoint; - UInt32 outModifiers; - EventTimeout inTimeout=0.1; - while (mouseStatus != kMouseTrackingMouseReleased) { - ButtonMove( Scintilla::Point( static_cast<int>( location.x ), static_cast<int>( location.y ) ) ); - TrackMouseLocationWithOptions((GrafPtr)-1, - kTrackMouseLocationOptionDontConsumeMouseUp, - inTimeout, - &theQDPoint, - &outModifiers, - &mouseStatus); - location = GetLocalPoint(theQDPoint); - } - ButtonUp( Scintilla::Point( static_cast<int>( location.x ), static_cast<int>( location.y ) ), - static_cast<int>( GetCurrentEventTime() / kEventDurationMillisecond ), - (modifiers & controlKey) != 0 ); - } else { - if (!HaveMouseCapture() && HIViewGetSuperview(GetViewRef()) != NULL) { - HIViewRef view; - HIViewGetSubviewHit(reinterpret_cast<ControlRef>(wMain.GetID()), &location, true, &view); - if (view) { - // the hit is on a subview (ie. scrollbars) - WndProc(SCI_SETCURSOR, Window::cursorArrow, 0); - return eventNotHandledErr; - } else { - // reset to normal, buttonmove will change for other area's in the editor - WndProc(SCI_SETCURSOR, (long int)SC_CURSORNORMAL, 0); - } - } - ButtonMove( Scintilla::Point( static_cast<int>( location.x ), static_cast<int>( location.y ) ) ); - } - return eventNotHandledErr; // allow event to go to container -#endif -} - -OSStatus ScintillaMacOSX::MouseWheelMoved( EventMouseWheelAxis axis, SInt32 delta, UInt32 modifiers ) -{ - if ( axis != 1 ) return eventNotHandledErr; - - if ( modifiers & controlKey ) { - // Zoom! We play with the font sizes in the styles. - // Number of steps/line is ignored, we just care if sizing up or down - if ( delta > 0 ) { - KeyCommand( SCI_ZOOMIN ); - } else { - KeyCommand( SCI_ZOOMOUT ); - } - } else { - // Decide if this should be optimized? - ScrollTo( topLine - delta ); - } - - return noErr; -} - -OSStatus ScintillaMacOSX::ContextualMenuClick( HIPoint& location ) -{ - // convert screen coords to window relative - Rect bounds; - OSStatus err; - err = GetWindowBounds( this->GetOwner(), kWindowContentRgn, &bounds ); - assert( err == noErr ); - location.x += bounds.left; - location.y += bounds.top; - ContextMenu( Scintilla::Point( static_cast<int>( location.x ), static_cast<int>( location.y ) ) ); - return noErr; -} - -OSStatus ScintillaMacOSX::ActiveStateChanged() -{ - // If the window is being deactivated, lose the focus and turn off the ticking - if ( ! this->IsActive() ) { - DropCaret(); - //SetFocusState( false ); - SetTicking( false ); - } else { - ShowCaretAtCurrentPosition(); - } - return noErr; -} - -HIViewRef ScintillaMacOSX::Create() -{ - // Register the HIView, if needed - static bool registered = false; - - if ( not registered ) { - TView::RegisterSubclass( kScintillaClassID, Construct ); - registered = true; - } - - OSStatus err = noErr; - EventRef event = CreateInitializationEvent(); - assert( event != NULL ); - - HIViewRef control = NULL; - err = HIObjectCreate( kScintillaClassID, event, reinterpret_cast<HIObjectRef*>( &control ) ); - ReleaseEvent( event ); - if ( err == noErr ) { - Platform::DebugPrintf("ScintillaMacOSX::Create control %08X\n",control); - return control; - } - return NULL; -} - -OSStatus ScintillaMacOSX::Construct( HIViewRef inControl, TView** outView ) -{ - *outView = new ScintillaMacOSX( inControl ); - Platform::DebugPrintf("ScintillaMacOSX::Construct scintilla %08X\n",*outView); - if ( *outView != NULL ) - return noErr; - else - return memFullErr; // could be a lie -} - -extern "C" { -HIViewRef scintilla_new() { - return ScintillaMacOSX::Create(); -} -} diff --git a/macosx/ScintillaMacOSX.h b/macosx/ScintillaMacOSX.h deleted file mode 100644 index fe871119b..000000000 --- a/macosx/ScintillaMacOSX.h +++ /dev/null @@ -1,239 +0,0 @@ -/* - * ScintillaMacOSX.h - * tutorial - * - * Original code by Evan Jones on Sun Sep 01 2002. - * Contributors: - * Shane Caraveo, ActiveState - * Bernd Paradies, Adobe - * - */ -#include "TView.h" - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <ctype.h> -#include <time.h> - -#include <vector> -#include <map> - -#include "Platform.h" -#include "Scintilla.h" -#include "PlatMacOSX.h" - - -#include "ScintillaWidget.h" -#ifdef SCI_LEXER -#include "SciLexer.h" -#include "PropSetSimple.h" -#include "ILexer.h" -#include "LexAccessor.h" -#include "Accessor.h" -#endif -#include "SVector.h" -#include "SplitVector.h" -#include "Partitioning.h" -#include "RunStyles.h" -#include "ContractionState.h" -#include "CellBuffer.h" -#include "CallTip.h" -#include "KeyMap.h" -#include "Indicator.h" -#include "XPM.h" -#include "LineMarker.h" -#include "Style.h" -#include "AutoComplete.h" -#include "ViewStyle.h" -#include "CharClassify.h" -#include "Decoration.h" -#include "Document.h" -#include "Selection.h" -#include "PositionCache.h" -#include "Editor.h" -#include "ScintillaBase.h" -#include "ScintillaCallTip.h" - -static const OSType scintillaMacOSType = 'Scin'; - -namespace Scintilla { - -/** -On the Mac, there is no WM_COMMAND or WM_NOTIFY message that can be sent -back to the parent. Therefore, there must be a callback handler that acts -like a Windows WndProc, where Scintilla can send notifications to. Use -ScintillaMacOSX::registerNotifyHandler() to register such a handler. -Messgae format is: -<br> -WM_COMMAND: HIWORD (wParam) = notification code, LOWORD (wParam) = 0 (no control ID), lParam = ScintillaMacOSX* -<br> -WM_NOTIFY: wParam = 0 (no control ID), lParam = ptr to SCNotification structure, with hwndFrom set to ScintillaMacOSX* -*/ -typedef void(*SciNotifyFunc) (intptr_t windowid, unsigned int iMessage, uintptr_t wParam, uintptr_t lParam); - -/** -Scintilla sends these two messages to the nofity handler. Please refer -to the Windows API doc for details about the message format. -*/ -#define WM_COMMAND 1001 -#define WM_NOTIFY 1002 - -class ScintillaMacOSX : public ScintillaBase, public TView -{ - public: - HIViewRef vScrollBar; - HIViewRef hScrollBar; - SInt32 scrollBarFixedSize; - SciNotifyFunc notifyProc; - intptr_t notifyObj; - - bool capturedMouse; - // true if scintilla initiated the drag session - bool inDragSession() { return inDragDrop == ddDragging; }; - bool isTracking; - - // Private so ScintillaMacOSX objects can not be copied - ScintillaMacOSX(const ScintillaMacOSX &) : ScintillaBase(), TView( NULL ) {} - ScintillaMacOSX &operator=(const ScintillaMacOSX &) { return * this; } - -public: - /** This is the class ID that we've assigned to Scintilla. */ - static const CFStringRef kScintillaClassID; - static const ControlKind kScintillaKind; - - ScintillaMacOSX( void* windowid ); - virtual ~ScintillaMacOSX(); - //~ static void ClassInit(GtkObjectClass* object_class, GtkWidgetClass *widget_class); - - /** Returns the HIView object kind, needed to subclass TView. */ - virtual ControlKind GetKind() { return kScintillaKind; } - - /// Register the notify callback - void registerNotifyCallback(intptr_t windowid, SciNotifyFunc callback); -private: - virtual void Initialise(); - virtual void Finalise(); - - // pasteboard support - bool GetPasteboardData(PasteboardRef &pasteBoard, - SelectionText *selectedText, bool *isFileURL); - void SetPasteboardData(PasteboardRef &pasteBoard, - const SelectionText &selectedText, - bool inDragDropSession); - char *GetStringFromCFString(CFStringRef &textString, int *textLen); - - // Drag and drop - virtual void StartDrag(); - Scintilla::Point GetDragPoint(DragRef inDrag); - bool GetDragData(DragRef inDrag, PasteboardRef &pasteBoard, - SelectionText *selectedText, - bool *isFileURL); - void SetDragCursor(DragRef inDrag); - virtual bool DragEnter(DragRef inDrag ); - virtual bool DragWithin(DragRef inDrag ); - virtual bool DragLeave(DragRef inDrag ); - virtual OSStatus DragReceive(DragRef inDrag ); - void DragScroll(); - int scrollSpeed; - int scrollTicks; - - EventRecord mouseDownEvent; - MouseTrackingRef mouseTrackingRef; - MouseTrackingRegionID mouseTrackingID; - HIPoint GetLocalPoint(::Point pt); - - void InsertCharacters (const UniChar* buf, int len); - static pascal void IdleTimerEventHandler(EventLoopTimerRef inTimer, - EventLoopIdleTimerMessage inState, - void *scintilla ); - -public: // Public for scintilla_send_message - virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam); - - void SyncPaint( void* gc, PRectangle rc); - //void FullPaint( void* gc ); - virtual void Draw( RgnHandle rgn, CGContextRef gc ); - - virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam); - virtual void SetTicking(bool on); - virtual bool SetIdle(bool on); - virtual void SetMouseCapture(bool on); - virtual bool HaveMouseCapture(); - virtual PRectangle GetClientRectangle(); - - virtual void ScrollText(int linesToMove); - virtual void SetVerticalScrollPos(); - virtual void SetHorizontalScrollPos(); - virtual bool ModifyScrollBars(int nMax, int nPage); - virtual void ReconfigureScrollBars(); - void Resize(int width, int height); - static pascal void LiveScrollHandler( ControlHandle control, SInt16 part ); - bool ScrollBarHit(HIPoint location); - - virtual void NotifyChange(); - virtual void NotifyFocus(bool focus); - virtual void NotifyParent(SCNotification scn); - void NotifyKey(int key, int modifiers); - void NotifyURIDropped(const char *list); -#ifndef EXT_INPUT - // Extended UTF8-UTF6-conversion to handle surrogate pairs correctly (CL265070) - virtual int KeyDefault(int key, int modifiers); -#endif - static pascal OSStatus CommandEventHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* data ); - - bool HasSelection(); - bool CanUndo(); - bool CanRedo(); - bool AlwaysTrue(); - virtual void CopyToClipboard(const SelectionText &selectedText); - virtual void Copy(); - virtual bool CanPaste(); - virtual void Paste(); - virtual void Paste(bool rectangular); - virtual void CreateCallTipWindow(PRectangle rc); - virtual void AddToPopUp(const char *label, int cmd = 0, bool enabled = true); - virtual void ClaimSelection(); - void ClearSelectionSimple() { - ClearSelection(); - } - - static sptr_t DirectFunction(ScintillaMacOSX *sciThis, - unsigned int iMessage, uptr_t wParam, sptr_t lParam); - - /** Timer event handler. Simply turns around and calls Tick. */ - virtual void TimerFired( EventLoopTimerRef ); - virtual OSStatus BoundsChanged( UInt32 inOptions, const HIRect& inOriginalBounds, const HIRect& inCurrentBounds, RgnHandle inInvalRgn ); - virtual ControlPartCode HitTest( const HIPoint& where ); - virtual OSStatus SetFocusPart( ControlPartCode desiredFocus, RgnHandle, Boolean, ControlPartCode* outActualFocus ); - virtual OSStatus TextInput( TCarbonEvent& event ); - - // Configure the features of this control - virtual UInt32 GetBehaviors(); - - virtual OSStatus MouseDown( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount, TCarbonEvent& inEvent ); - virtual OSStatus MouseDown( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); - virtual OSStatus MouseDown( EventRecord *rec ); - virtual OSStatus MouseUp( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); - virtual OSStatus MouseUp( EventRecord *rec ); - virtual OSStatus MouseDragged( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); - virtual OSStatus MouseDragged( EventRecord *rec ); - virtual OSStatus MouseEntered( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); - virtual OSStatus MouseExited( HIPoint& location, UInt32 modifiers, EventMouseButton button, UInt32 clickCount ); - virtual OSStatus MouseWheelMoved( EventMouseWheelAxis axis, SInt32 delta, UInt32 modifiers ); - virtual OSStatus ContextualMenuClick( HIPoint& location ); - - virtual OSStatus ActiveStateChanged(); - - virtual void CallTipClick(); - - -public: - static HIViewRef Create(); -private: - static OSStatus Construct( HIViewRef inControl, TView** outView ); - -}; - - -} diff --git a/macosx/TCarbonEvent.cxx b/macosx/TCarbonEvent.cxx deleted file mode 100644 index eca31e569..000000000 --- a/macosx/TCarbonEvent.cxx +++ /dev/null @@ -1,519 +0,0 @@ -/* - File: TCarbonEvent.cp - - Version: 1.0 - - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Copyright © 2002 Apple Computer, Inc., All Rights Reserved -*/ - -#include "TCarbonEvent.h" - -//----------------------------------------------------------------------------------- -// TCarbonEvent constructor -//----------------------------------------------------------------------------------- -// -TCarbonEvent::TCarbonEvent( - UInt32 inClass, - UInt32 inKind ) -{ - CreateEvent( NULL, inClass, inKind, GetCurrentEventTime(), 0, &fEvent ); -} - -//----------------------------------------------------------------------------------- -// TCarbonEvent constructor -//----------------------------------------------------------------------------------- -// -TCarbonEvent::TCarbonEvent( - EventRef inEvent ) -{ - fEvent = inEvent; - RetainEvent( fEvent ); -} - -//----------------------------------------------------------------------------------- -// TCarbonEvent destructor -//----------------------------------------------------------------------------------- -// -TCarbonEvent::~TCarbonEvent() -{ - ReleaseEvent( fEvent ); -} - -//----------------------------------------------------------------------------------- -// GetClass -//----------------------------------------------------------------------------------- -// -UInt32 TCarbonEvent::GetClass() const -{ - return GetEventClass( fEvent ); -} - -//----------------------------------------------------------------------------------- -// GetKind -//----------------------------------------------------------------------------------- -// -UInt32 TCarbonEvent::GetKind() const -{ - return GetEventKind( fEvent ); -} - -//----------------------------------------------------------------------------------- -// SetTime -//----------------------------------------------------------------------------------- -// -void TCarbonEvent::SetTime( - EventTime inTime ) -{ - SetEventTime( fEvent, inTime ); -} - -//----------------------------------------------------------------------------------- -// GetTime -//----------------------------------------------------------------------------------- -// -EventTime TCarbonEvent::GetTime() const -{ - return GetEventTime( fEvent ); -} - -//----------------------------------------------------------------------------------- -// Retain -//----------------------------------------------------------------------------------- -// -void TCarbonEvent::Retain() -{ - RetainEvent( fEvent ); -} - -//----------------------------------------------------------------------------------- -// Release -//----------------------------------------------------------------------------------- -// -void TCarbonEvent::Release() -{ - ReleaseEvent( fEvent ); -} - -//----------------------------------------------------------------------------------- -// PostToQueue -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::PostToQueue( - EventQueueRef inQueue, - EventPriority inPriority ) -{ - return PostEventToQueue( inQueue, fEvent, inPriority ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - EventParamType inType, - UInt32 inSize, - const void* inData ) -{ - return SetEventParameter( fEvent, inName, inType, inSize, inData ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - EventParamType inType, - UInt32 inBufferSize, - void* outData ) -{ - return GetEventParameter( fEvent, inName, inType, NULL, inBufferSize, NULL, outData ); -} - -//----------------------------------------------------------------------------------- -// GetParameterType -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameterType( - EventParamName inName, - EventParamType* outType ) -{ - return GetEventParameter( fEvent, inName, typeWildCard, outType, 0, NULL, NULL ); -} - -//----------------------------------------------------------------------------------- -// GetParameterSize -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameterSize( - EventParamName inName, - UInt32* outSize ) -{ - return GetEventParameter( fEvent, inName, typeWildCard, NULL, 0, outSize, NULL ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - Boolean inValue ) -{ - return SetParameter<Boolean>( inName, typeBoolean, inValue ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - Boolean* outValue ) -{ - return GetParameter<Boolean>( inName, typeBoolean, outValue ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - bool inValue ) -{ - return SetParameter<Boolean>( inName, typeBoolean, (Boolean) inValue ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - bool* outValue ) -{ - return GetParameter<Boolean>( inName, sizeof( Boolean ), (Boolean*) outValue ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - Point inPt ) -{ - return SetParameter<Point>( inName, typeQDPoint, inPt ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - Point* outPt ) -{ - return GetParameter<Point>( inName, typeQDPoint, outPt ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - const HIPoint& inPt ) -{ - return SetParameter<HIPoint>( inName, typeHIPoint, inPt ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - HIPoint* outPt ) -{ - return GetParameter<HIPoint>( inName, typeHIPoint, outPt ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - const Rect& inRect ) -{ - return SetParameter<Rect>( inName, typeQDRectangle, inRect ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - Rect* outRect ) -{ - return GetParameter<Rect>( inName, typeQDRectangle, outRect ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - const HIRect& inRect ) -{ - return SetParameter<HIRect>( inName, typeHIRect, inRect ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - HIRect* outRect ) -{ - return GetParameter<HIRect>( inName, typeHIRect, outRect ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - const HISize& inSize ) -{ - return SetParameter<HISize>( inName, typeHISize, inSize ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - HISize* outSize ) -{ - return GetParameter<HISize>( inName, typeHISize, outSize ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - RgnHandle inRegion ) -{ - return SetParameter<RgnHandle>( inName, typeQDRgnHandle, inRegion ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - RgnHandle* outRegion ) -{ - return GetParameter<RgnHandle>( inName, typeQDRgnHandle, outRegion ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - WindowRef inWindow ) -{ - return SetParameter<WindowRef>( inName, typeWindowRef, inWindow ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - WindowRef* outWindow ) -{ - return GetParameter<WindowRef>( inName, typeWindowRef, outWindow ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - ControlRef inControl ) -{ - return SetParameter<ControlRef>( inName, typeControlRef, inControl ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - ControlRef* outControl ) -{ - return GetParameter<ControlRef>( inName, typeControlRef, outControl ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - MenuRef inMenu ) -{ - return SetParameter<MenuRef>( inName, typeMenuRef, inMenu ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - MenuRef* outMenu ) -{ - return GetParameter<MenuRef>( inName, typeMenuRef, outMenu ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - DragRef inDrag ) -{ - return SetParameter<DragRef>( inName, typeDragRef, inDrag ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - DragRef* outDrag ) -{ - return GetParameter<DragRef>( inName, typeDragRef, outDrag ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - UInt32 inValue ) -{ - return SetParameter<UInt32>( inName, typeUInt32, inValue ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - UInt32* outValue ) -{ - return GetParameter<UInt32>( inName, typeUInt32, outValue ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - const HICommand& inValue ) -{ - return SetParameter<HICommand>( inName, typeHICommand, inValue ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - HICommand* outValue ) -{ - return GetParameter<HICommand>( inName, typeHICommand, outValue ); -} - -//----------------------------------------------------------------------------------- -// SetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::SetParameter( - EventParamName inName, - const ControlPartCode& inValue ) -{ - return SetParameter<ControlPartCode>( inName, typeControlPartCode, inValue ); -} - -//----------------------------------------------------------------------------------- -// GetParameter -//----------------------------------------------------------------------------------- -// -OSStatus TCarbonEvent::GetParameter( - EventParamName inName, - ControlPartCode* outValue ) -{ - return GetParameter<ControlPartCode>( inName, typeControlPartCode, outValue ); -} diff --git a/macosx/TCarbonEvent.h b/macosx/TCarbonEvent.h deleted file mode 100644 index d40da9795..000000000 --- a/macosx/TCarbonEvent.h +++ /dev/null @@ -1,230 +0,0 @@ -/* - File: TCarbonEvent.h - - Version: 1.0 - - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Copyright © 2002 Apple Computer, Inc., All Rights Reserved -*/ - -#ifndef TCarbonEvent_H_ -#define TCarbonEvent_H_ - -#include <Carbon/Carbon.h> - -class TCarbonEvent -{ -public: - // Construction/Destruction - TCarbonEvent( - UInt32 inClass, - UInt32 inKind ); - TCarbonEvent( - EventRef inEvent ); - virtual ~TCarbonEvent(); - - UInt32 GetClass() const; - UInt32 GetKind() const; - - // Time - void SetTime( - EventTime inTime ); - EventTime GetTime() const; - - // Retention - void Retain(); - void Release(); - - // Accessors - operator EventRef&() - { return fEvent; }; - EventRef GetEventRef() - { return fEvent; } - - // Posting - OSStatus PostToQueue( - EventQueueRef inQueue, - EventPriority inPriority = kEventPriorityStandard ); - - // Parameters - OSStatus SetParameter( - EventParamName inName, - EventParamType inType, - UInt32 inSize, - const void* inData ); - OSStatus GetParameter( - EventParamName inName, - EventParamType inType, - UInt32 inBufferSize, - void* outData ); - - OSStatus GetParameterType( - EventParamName inName, - EventParamType* outType ); - OSStatus GetParameterSize( - EventParamName inName, - UInt32* outSize ); - - // Simple parameters - OSStatus SetParameter( - EventParamName inName, - Boolean inValue ); - OSStatus GetParameter( - EventParamName inName, - Boolean* outValue ); - - OSStatus SetParameter( - EventParamName inName, - bool inValue ); - OSStatus GetParameter( - EventParamName inName, - bool* outValue ); - - OSStatus SetParameter( - EventParamName inName, - Point inPt ); - OSStatus GetParameter( - EventParamName inName, - Point* outPt ); - - OSStatus SetParameter( - EventParamName inName, - const HIPoint& inPt ); - - OSStatus GetParameter( - EventParamName inName, - HIPoint* outPt ); - - OSStatus SetParameter( - EventParamName inName, - const Rect& inRect ); - OSStatus GetParameter( - EventParamName inName, - Rect* outRect ); - - OSStatus SetParameter( - EventParamName inName, - const HIRect& inRect ); - OSStatus GetParameter( - EventParamName inName, - HIRect* outRect ); - - OSStatus SetParameter( - EventParamName inName, - const HISize& inSize ); - OSStatus GetParameter( - EventParamName inName, - HISize* outSize ); - - OSStatus SetParameter( - EventParamName inName, - RgnHandle inRegion ); - OSStatus GetParameter( - EventParamName inName, - RgnHandle* outRegion ); - - OSStatus SetParameter( - EventParamName inName, - WindowRef inWindow ); - OSStatus GetParameter( - EventParamName inName, - WindowRef* outWindow ); - - OSStatus SetParameter( - EventParamName inName, - ControlRef inControl ); - OSStatus GetParameter( - EventParamName inName, - ControlRef* outControl ); - - OSStatus SetParameter( - EventParamName inName, - MenuRef inMenu ); - OSStatus GetParameter( - EventParamName inName, - MenuRef* outMenu ); - - OSStatus SetParameter( - EventParamName inName, - DragRef inDrag ); - OSStatus GetParameter( - EventParamName inName, - DragRef* outDrag ); - - OSStatus SetParameter( - EventParamName inName, - UInt32 inValue ); - OSStatus GetParameter( - EventParamName inName, - UInt32* outValue ); - - OSStatus SetParameter( - EventParamName inName, - const HICommand& inValue ); - OSStatus GetParameter( - EventParamName inName, - HICommand* outValue ); - - OSStatus SetParameter( - EventParamName inName, - const ControlPartCode& inValue ); - OSStatus GetParameter( - EventParamName inName, - ControlPartCode* outValue ); - - // Template parameters - template <class T> OSStatus SetParameter( - EventParamName inName, - EventParamType inType, - const T& inValue ) - { - return SetParameter( inName, inType, sizeof( T ), &inValue ); - } - - template <class T> OSStatus GetParameter( - EventParamName inName, - EventParamType inType, - T* outValue ) - { - return GetParameter( inName, inType, sizeof( T ), outValue ); - } - -private: - EventRef fEvent; -}; - -#endif // TCarbonEvent_H_ diff --git a/macosx/TRect.h b/macosx/TRect.h deleted file mode 100644 index 5a4199300..000000000 --- a/macosx/TRect.h +++ /dev/null @@ -1,496 +0,0 @@ -/* - File: TRect.h - - Version: 1.0 - - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Copyright © 2002 Apple Computer, Inc., All Rights Reserved -*/ - -#ifndef TRect_H_ -#define TRect_H_ - -#include <Carbon/Carbon.h> - -class TRect - : public HIRect -{ -public: - // Construction/Destruction - TRect(); - TRect( - const HIRect* inRect ); - TRect( - const HIRect& inRect ); - TRect( - const HIPoint& inOrigin, - const HISize& inSize ); - TRect( - float inX, - float inY, - float inWidth, - float inHeight ); - TRect( - const Rect& inRect ); - ~TRect(); - - // Operators - operator HIRect*() - { return this; } - operator Rect() const; - - // Accessors - float MinX() const - { return CGRectGetMinX( *this ); } - float MaxX() const - { return CGRectGetMaxX( *this ); } - float MinY() const - { return CGRectGetMinY( *this ); } - float MaxY() const - { return CGRectGetMaxY( *this ); } - - float Width() const - { return CGRectGetWidth( *this ); } - float Height() const - { return CGRectGetHeight( *this ); } - - const HIPoint& Origin() const - { return origin; } - const HISize& Size() const - { return size; } - - float CenterX() const - { return CGRectGetMidX( *this ); } - float CenterY() const - { return CGRectGetMidY( *this ); } - HIPoint Center() const; - - // Modifiers - const HIRect& Inset( - float inX, - float inY ); - const HIRect& Outset( - float inX, - float inY ); - const HIRect& MoveBy( - float inDx, - float inDy ); - const HIRect& MoveTo( - float inX, - float inY ); - - const HIRect& Set( - const HIRect* inRect ); - const HIRect& Set( - const HIRect& inRect ); - const HIRect& Set( - float inX, - float inY, - float inWidth, - float inHeight ); - const HIRect& Set( - const Rect* inRect ); - - const HIRect& SetAroundCenter( - float inCenterX, - float inCenterY, - float inWidth, - float inHeight ); - - const HIRect& SetWidth( - float inWidth ); - const HIRect& SetHeight( - float inHeight ); - - const HIRect& SetOrigin( - const HIPoint& inOrigin ); - const HIRect& SetOrigin( - float inX, - float inY ); - const HIRect& SetSize( - const HISize& inSize ); - const HIRect& SetSize( - float inWidth, - float inHeight ); - - // Tests - bool Contains( - const HIPoint& inPoint ); - bool Contains( - const HIRect& inRect ); - bool Contains( - const Point& inPoint ); - bool Contains( - const Rect& inRect ); -}; - -//----------------------------------------------------------------------------------- -// TRect constructor -//----------------------------------------------------------------------------------- -// -inline TRect::TRect() -{ -} - -//----------------------------------------------------------------------------------- -// TRect constructor -//----------------------------------------------------------------------------------- -// -inline TRect::TRect( - const HIRect* inRect ) -{ - *this = *inRect; -} - -//----------------------------------------------------------------------------------- -// TRect constructor -//----------------------------------------------------------------------------------- -// -inline TRect::TRect( - const HIRect& inRect ) -{ - origin = inRect.origin; - size = inRect.size; -} - -//----------------------------------------------------------------------------------- -// TRect constructor -//----------------------------------------------------------------------------------- -// -inline TRect::TRect( - const HIPoint& inOrigin, - const HISize& inSize ) -{ - origin = inOrigin; - size = inSize; -} - -//----------------------------------------------------------------------------------- -// TRect constructor -//----------------------------------------------------------------------------------- -// -inline TRect::TRect( - float inX, - float inY, - float inWidth, - float inHeight ) -{ - *this = CGRectMake( inX, inY, inWidth, inHeight ); -} - -//----------------------------------------------------------------------------------- -// TRect destructor -//----------------------------------------------------------------------------------- -// -inline TRect::~TRect() -{ -} - -//----------------------------------------------------------------------------------- -// TRect constructor -//----------------------------------------------------------------------------------- -// -inline TRect::TRect( - const Rect& inRect ) -{ - Set( &inRect ); -} - -//----------------------------------------------------------------------------------- -// Rect operator -//----------------------------------------------------------------------------------- -// Converts the HIRect to a QD rect and returns it -// -inline TRect::operator Rect() const -{ - Rect qdRect; - - qdRect.top = (SInt16) MinY(); - qdRect.left = (SInt16) MinX(); - qdRect.bottom = (SInt16) MaxY(); - qdRect.right = (SInt16) MaxX(); - - return qdRect; -} - -//----------------------------------------------------------------------------------- -// Center -//----------------------------------------------------------------------------------- -// -inline HIPoint TRect::Center() const -{ - return CGPointMake( CGRectGetMidX( *this ), CGRectGetMidY( *this ) ); -} - -//----------------------------------------------------------------------------------- -// Inset -//----------------------------------------------------------------------------------- -// -inline const HIRect& TRect::Inset( - float inX, - float inY ) -{ - *this = CGRectInset( *this, inX, inY ); - - return *this; -} - -//----------------------------------------------------------------------------------- -// Outset -//----------------------------------------------------------------------------------- -// -inline const HIRect& TRect::Outset( - float inX, - float inY ) -{ - *this = CGRectInset( *this, -inX, -inY ); - - return *this; -} - -//----------------------------------------------------------------------------------- -// MoveBy -//----------------------------------------------------------------------------------- -// -inline const HIRect& TRect::MoveBy( - float inDx, - float inDy ) -{ - origin = CGPointMake( MinX() + inDx, MinY() + inDy ); - - return *this; -} - -//----------------------------------------------------------------------------------- -// MoveTo -//----------------------------------------------------------------------------------- -// -inline const HIRect& TRect::MoveTo( - float inX, - float inY ) -{ - origin = CGPointMake( inX, inY ); - - return *this; -} - -//----------------------------------------------------------------------------------- -// Set -//----------------------------------------------------------------------------------- -// -inline const HIRect& TRect::Set( - const HIRect* inRect ) -{ - *this = *inRect; - - return *this; -} - -//----------------------------------------------------------------------------------- -// Set -//----------------------------------------------------------------------------------- -// -inline const HIRect& TRect::Set( - const HIRect& inRect ) -{ - *this = inRect; - - return *this; -} - -//----------------------------------------------------------------------------------- -// Set -//----------------------------------------------------------------------------------- -// -inline const HIRect& TRect::Set( - float inX, - float inY, - float inWidth, - float inHeight ) -{ - *this = CGRectMake( inX, inY, inWidth, inHeight ); - - return *this; -} - -//----------------------------------------------------------------------------------- -// Set -//----------------------------------------------------------------------------------- -// -inline const HIRect& TRect::Set( - const Rect* inRect ) -{ - origin.x = inRect->left; - origin.y = inRect->top; - size.width = inRect->right - inRect->left; - size.height = inRect->bottom - inRect->top; - - return *this; -} - -//----------------------------------------------------------------------------------- -// SetAroundCenter -//----------------------------------------------------------------------------------- -// Sets the rectangle by specifying dimensions around a center point -// -inline const HIRect& TRect::SetAroundCenter( - float inCenterX, - float inCenterY, - float inWidth, - float inHeight ) -{ - *this = CGRectMake( inCenterX - inWidth/2, inCenterY - inHeight/2, inWidth, inHeight ); - - return *this; -} - -//----------------------------------------------------------------------------------- -// SetWidth -//----------------------------------------------------------------------------------- -// -inline const HIRect& TRect::SetWidth( - float inWidth ) -{ - size.width = inWidth; - - return *this; -} - -//----------------------------------------------------------------------------------- -// SetHeight -//----------------------------------------------------------------------------------- -// -inline const HIRect& TRect::SetHeight( - float inHeight ) -{ - size.height = inHeight; - - return *this; -} - -//----------------------------------------------------------------------------------- -// SetOrigin -//----------------------------------------------------------------------------------- -// -inline const HIRect& TRect::SetOrigin( - const HIPoint& inOrigin ) -{ - origin = inOrigin; - - return *this; -} - -//----------------------------------------------------------------------------------- -// SetOrigin -//----------------------------------------------------------------------------------- -// -inline const HIRect& TRect::SetOrigin( - float inX, - float inY ) -{ - origin = CGPointMake( inX, inY ); - - return *this; -} - -//----------------------------------------------------------------------------------- -// SetSize -//----------------------------------------------------------------------------------- -// -inline const HIRect& TRect::SetSize( - const HISize& inSize ) -{ - size = inSize; - - return *this; -} - -//----------------------------------------------------------------------------------- -// SetSize -//----------------------------------------------------------------------------------- -// -inline const HIRect& TRect::SetSize( - float inWidth, - float inHeight ) -{ - size = CGSizeMake( inWidth, inHeight ); - - return *this; -} - -//----------------------------------------------------------------------------------- -// Contains -//----------------------------------------------------------------------------------- -// -inline bool TRect::Contains( - const HIPoint& inPoint ) -{ - return CGRectContainsPoint( *this, inPoint ); -} - -//----------------------------------------------------------------------------------- -// Contains -//----------------------------------------------------------------------------------- -// -inline bool TRect::Contains( - const HIRect& inRect ) -{ - return CGRectContainsRect( *this, inRect ); -} - -//----------------------------------------------------------------------------------- -// Contains -//----------------------------------------------------------------------------------- -// -inline bool TRect::Contains( - const Point& inPoint ) -{ - return Contains( CGPointMake( inPoint.h, inPoint.v ) ); -} - -//----------------------------------------------------------------------------------- -// Contains -//----------------------------------------------------------------------------------- -// -inline bool TRect::Contains( - const Rect& inRect ) -{ - return Contains( CGRectMake( inRect.left, inRect.top, - inRect.right - inRect.left, inRect.bottom - inRect.top ) ); -} - -#endif // TRect_H_ diff --git a/macosx/TView.cxx b/macosx/TView.cxx deleted file mode 100644 index 00a354ae7..000000000 --- a/macosx/TView.cxx +++ /dev/null @@ -1,1442 +0,0 @@ -/* - File: TView.cp - - Version: 1.0 - - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Copyright © 2002 Apple Computer, Inc., All Rights Reserved -*/ - -/* - NOTE: This is NOWHERE near a completely exhaustive implementation of a view. There are - many more carbon events one could intercept and hook into this. -*/ - -#include "TView.h" - -//----------------------------------------------------------------------------------- -// constants -//----------------------------------------------------------------------------------- -// -const EventTypeSpec kHIObjectEvents[] = -{ { kEventClassHIObject, kEventHIObjectConstruct }, - { kEventClassHIObject, kEventHIObjectInitialize }, - { kEventClassHIObject, kEventHIObjectDestruct } -}; - -const EventTypeSpec kHIViewEvents[] = -{ { kEventClassCommand, kEventCommandProcess }, - { kEventClassCommand, kEventCommandUpdateStatus }, - - { kEventClassControl, kEventControlInitialize }, - { kEventClassControl, kEventControlDraw }, - { kEventClassControl, kEventControlHitTest }, - { kEventClassControl, kEventControlGetPartRegion }, - { kEventClassControl, kEventControlGetData }, - { kEventClassControl, kEventControlSetData }, - { kEventClassControl, kEventControlGetOptimalBounds }, - { kEventClassControl, kEventControlBoundsChanged }, - { kEventClassControl, kEventControlTrack }, - { kEventClassControl, kEventControlGetSizeConstraints }, - { kEventClassControl, kEventControlHit }, - - { kEventClassControl, kEventControlHiliteChanged }, - { kEventClassControl, kEventControlActivate }, - { kEventClassControl, kEventControlDeactivate }, - { kEventClassControl, kEventControlValueFieldChanged }, - { kEventClassControl, kEventControlTitleChanged }, - { kEventClassControl, kEventControlEnabledStateChanged }, -}; - -// This param name was accidentally left unexported for -// the release of Jaguar. -const EventParamName kEventParamControlLikesDrag = 'cldg'; - -//----------------------------------------------------------------------------------- -// TView constructor -//----------------------------------------------------------------------------------- -// -TView::TView( - HIViewRef inControl ) - : fViewRef( inControl ) -{ - verify_noerr( InstallEventHandler( GetControlEventTarget( fViewRef ), ViewEventHandler, - GetEventTypeCount( kHIViewEvents ), kHIViewEvents, this, &fHandler ) ); - - mouseEventHandler = NULL; - fAutoInvalidateFlags = 0; - debugPrint = false; -} - -//----------------------------------------------------------------------------------- -// TView destructor -//----------------------------------------------------------------------------------- -// -TView::~TView() -{ - // If we have installed our custom mouse events handler on the window, - // go forth and remove it. Note: -1 is used to indicate that no handler has - // been installed yet, but we want to once we get a window. - if ( mouseEventHandler != NULL && mouseEventHandler != reinterpret_cast<void*>( -1 ) ) - RemoveEventHandler( mouseEventHandler ); - mouseEventHandler = NULL; -} - -//----------------------------------------------------------------------------------- -// Initialize -//----------------------------------------------------------------------------------- -// Called during HIObject construction, this is your subclasses' chance to extract -// any parameters it might have added to the initialization event passed into the -// HIObjectCreate call. -// -OSStatus TView::Initialize( TCarbonEvent& /*inEvent*/ ) -{ - return noErr; -} - -//----------------------------------------------------------------------------------- -// GetBehaviors -//----------------------------------------------------------------------------------- -// Returns our behaviors. Any subclass that overrides this should OR in its behaviors -// into the inherited behaviors. -// -UInt32 TView::GetBehaviors() -{ - return kControlSupportsDataAccess | kControlSupportsGetRegion; -} - -//----------------------------------------------------------------------------------- -// Draw -//----------------------------------------------------------------------------------- -// Draw your view. You should draw based on VIEW coordinates, not frame coordinates. -// -void TView::Draw( - RgnHandle /*inLimitRgn*/, - CGContextRef /*inContext*/ ) -{ -} - -//----------------------------------------------------------------------------------- -// HitTest -//----------------------------------------------------------------------------------- -// Asks your view to return what part of itself (if any) is hit by the point given -// to it. The point is in VIEW coordinates, so you should get the view rect to do -// bounds checking. -// -ControlPartCode TView::HitTest( - const HIPoint& /*inWhere*/ ) -{ - return kControlNoPart; -} - -//----------------------------------------------------------------------------------- -// GetRegion -//----------------------------------------------------------------------------------- -// This is called when someone wants to know certain metrics regarding this view. -// The base class does nothing. Subclasses should handle their own parts, such as -// the content region by overriding this method. The structure region is, by default, -// the view's bounds. If a subclass does not have a region for a given part, it -// should always call the inherited method. -// -OSStatus TView::GetRegion( - ControlPartCode inPart, - RgnHandle outRgn ) -{ -#pragma unused( inPart, outRgn ) - - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// PrintDebugInfo -//----------------------------------------------------------------------------------- -// This is called when asked to print debugging information. -// -void TView::PrintDebugInfo() -{ -} - -//----------------------------------------------------------------------------------- -// GetData -//----------------------------------------------------------------------------------- -// Gets some data from our view. Subclasses should override to handle their own -// defined data tags. If a tag is not understood by the subclass, it should call the -// inherited method. As a convienience, we map the request for ControlKind into our -// GetKind method. -// -OSStatus TView::GetData( - OSType inTag, - ControlPartCode inPart, - Size inSize, - Size* outSize, - void* inPtr ) -{ -#pragma unused( inPart ) - - OSStatus err = noErr; - - switch( inTag ) - { - case kControlKindTag: - if ( inPtr ) - { - if ( inSize != sizeof( ControlKind ) ) - err = errDataSizeMismatch; - else - ( *(ControlKind *) inPtr ) = GetKind(); - } - *outSize = sizeof( ControlKind ); - break; - - default: - err = eventNotHandledErr; - break; - } - - return err; -} - -//----------------------------------------------------------------------------------- -// SetData -//----------------------------------------------------------------------------------- -// Sets some data on our control. Subclasses should override to handle their own -// defined data tags. If a tag is not understood by the subclass, it should call the -// inherited method. -// -OSStatus TView::SetData( - OSType inTag, - ControlPartCode inPart, - Size inSize, - const void* inPtr ) -{ -#pragma unused( inTag, inPart, inSize, inPtr ) - - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// GetOptimalSize -//----------------------------------------------------------------------------------- -// Someone wants to know this view's optimal size and text baseline, probably to help -// do some type of layout. The base class does nothing, but subclasses should -// override and do something meaningful here. -// -OSStatus TView::GetOptimalSize( - HISize* outSize, - float* outBaseLine ) -{ -#pragma unused( outSize, outBaseLine ) - - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// GetSizeConstraints -//----------------------------------------------------------------------------------- -// Someone wants to know this view's minimum and maximum sizes, probably to help -// do some type of layout. The base class does nothing, but subclasses should -// override and do something meaningful here. -// -OSStatus TView::GetSizeConstraints( - HISize* outMin, - HISize* outMax ) -{ -#pragma unused( outMin, outMax ) - - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// BoundsChanged -//----------------------------------------------------------------------------------- -// The bounds of our view have changed. Subclasses can override here to make note -// of it and flush caches, etc. The base class does nothing. -// -OSStatus TView::BoundsChanged( - UInt32 inOptions, - const HIRect& inOriginalBounds, - const HIRect& inCurrentBounds, - RgnHandle inInvalRgn ) -{ -#pragma unused( inOptions, inOriginalBounds, inCurrentBounds, inInvalRgn ) - - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// ControlHit -//----------------------------------------------------------------------------------- -// The was hit. Subclasses can overide to care about what part was hit. -// -OSStatus TView::ControlHit( - ControlPartCode inPart, - UInt32 inModifiers ) -{ -#pragma unused( inPart, inModifiers ) - - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// HiliteChanged -//----------------------------------------------------------------------------------- -// The hilite of our view has changed. Subclasses can override here to make note -// of it and flush caches, etc. The base class does nothing. -// -OSStatus TView::HiliteChanged( - ControlPartCode inOriginalPart, - ControlPartCode inCurrentPart, - RgnHandle inInvalRgn ) -{ -#pragma unused( inOriginalPart, inCurrentPart, inInvalRgn ) - - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// DragEnter -//----------------------------------------------------------------------------------- -// A drag has entered our bounds. The Drag and Drop interface also should have been -// activated or else this method will NOT be called. If true is returned, this view -// likes the drag and will receive drag within/leave/receive messages as appropriate. -// If false is returned, it is assumed the drag is not valid for this view, and no -// further drag activity will flow into this view unless the drag leaves and is -// re-entered. -// -bool TView::DragEnter( - DragRef inDrag ) -{ -#pragma unused( inDrag ) - - return false; -} - -//----------------------------------------------------------------------------------- -// DragWithin -//----------------------------------------------------------------------------------- -// A drag has moved within our bounds. In order for this method to be called, the -// view must have signaled the drag as being desirable in the DragEnter method. The -// Drag and Drop interface also should have been activated. -// -bool TView::DragWithin( - DragRef inDrag ) -{ -#pragma unused( inDrag ) - - return false; -} - -//----------------------------------------------------------------------------------- -// DragLeave -//----------------------------------------------------------------------------------- -// A drag has left. Deal with it. Subclasses should override as necessary. The -// Drag and Drop interface should be activated in order for this method to be valid. -// The drag must have also been accepted in the DragEnter method, else this method -// will NOT be called. -// -bool TView::DragLeave( - DragRef inDrag ) -{ -#pragma unused( inDrag ) - - return false; -} - -//----------------------------------------------------------------------------------- -// DragReceive -//----------------------------------------------------------------------------------- -// Deal with receiving a drag. By default we return dragNotAcceptedErr. I'm not sure -// if this is correct, or eventNotHandledErr. Time will tell... -// -OSStatus TView::DragReceive( - DragRef inDrag ) -{ -#pragma unused( inDrag ) - - return dragNotAcceptedErr; -} - -//----------------------------------------------------------------------------------- -// Track -//----------------------------------------------------------------------------------- -// Default tracking method. Subclasses should override as necessary. We do nothing -// here in the base class, so we return eventNotHandledErr. -// -OSStatus TView::Track( - TCarbonEvent& inEvent, - ControlPartCode* outPart ) -{ -#pragma unused( inEvent, outPart ) - - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// SetFocusPart -//----------------------------------------------------------------------------------- -// Handle focusing. Our base behavior is to punt. -// -OSStatus TView::SetFocusPart( - ControlPartCode inDesiredFocus, - RgnHandle inInvalidRgn, - Boolean inFocusEverything, - ControlPartCode* outActualFocus ) -{ -#pragma unused( inDesiredFocus, inInvalidRgn, inFocusEverything, outActualFocus ) - - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// ProcessCommand -//----------------------------------------------------------------------------------- -// Process a command. Subclasses should override as necessary. -// -OSStatus TView::ProcessCommand( - const HICommand& inCommand ) -{ -#pragma unused( inCommand ) - - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// UpdateCommandStatus -//----------------------------------------------------------------------------------- -// Update the status for a command. Subclasses should override as necessary. -// -OSStatus -TView::UpdateCommandStatus( - const HICommand& inCommand ) -{ -#pragma unused( inCommand ) - - return eventNotHandledErr; -} - -OSStatus TView::MouseDown(HIPoint& /*inMouseLocation*/, UInt32 /*inKeyModifiers*/, EventMouseButton /*inMouseButton*/, UInt32 /*inClickCount*/ , - TCarbonEvent& /*inEvent*/) -{ - return eventNotHandledErr; -} - -OSStatus TView::MouseUp(HIPoint& /*inMouseLocation*/, UInt32 /*inKeyModifiers*/, EventMouseButton /*inMouseButton*/, UInt32 /*inClickCount*/ ) -{ - return eventNotHandledErr; -} - -OSStatus TView::MouseDragged(HIPoint& /*inMouseLocation*/, UInt32 /*inKeyModifiers*/, EventMouseButton /*inMouseButton*/, UInt32 /*inClickCount*/ ) -{ - return eventNotHandledErr; -} - -OSStatus TView::MouseEntered(HIPoint& /*inMouseLocation*/, UInt32 /*inKeyModifiers*/, EventMouseButton /*inMouseButton*/, UInt32 /*inClickCount*/ ) -{ - return eventNotHandledErr; -} - -OSStatus TView::MouseExited(HIPoint& /*inMouseLocation*/, UInt32 /*inKeyModifiers*/, EventMouseButton /*inMouseButton*/, UInt32 /*inClickCount*/ ) -{ - return eventNotHandledErr; -} - -OSStatus TView::MouseWheelMoved( EventMouseWheelAxis /*inAxis*/, SInt32 /*inDelta*/, UInt32 /*inKeyModifiers*/ ) -{ - return eventNotHandledErr; -} - -OSStatus TView::ContextualMenuClick( HIPoint& /*inMouseLocation*/ ) -{ - return eventNotHandledErr; -} - - -//----------------------------------------------------------------------------------- -// ActivateInterface -//----------------------------------------------------------------------------------- -// This routine is used to allow a subclass to turn on a specific event or suite of -// events, like Drag and Drop. This allows us to keep event traffic down if we are -// not interested, but register for the events if we are. -// -OSStatus TView::ActivateInterface( - TView::Interface inInterface ) -{ - OSStatus result = noErr; - - switch( inInterface ) - { - case kDragAndDrop: - { - static const EventTypeSpec kDragEvents[] = - { - { kEventClassControl, kEventControlDragEnter }, - { kEventClassControl, kEventControlDragLeave }, - { kEventClassControl, kEventControlDragWithin }, - { kEventClassControl, kEventControlDragReceive } - }; - - result = AddEventTypesToHandler( fHandler, GetEventTypeCount( kDragEvents ), - kDragEvents ); - - SetControlDragTrackingEnabled( GetViewRef(), true); - } - break; - - case kKeyboardFocus: - { - static const EventTypeSpec kKeyboardFocusEvents[] = - { - { kEventClassControl, kEventControlSetFocusPart }, - { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent }, - }; - - result = AddEventTypesToHandler( fHandler, GetEventTypeCount( kKeyboardFocusEvents ), - kKeyboardFocusEvents ); - } - break; - - case kMouse: - { - if ( mouseEventHandler == NULL ) - { - // This case is quite different: Mouse events are delivered to the window, not the controls. - // mouse wheel events are the exception: They ARE delivered to the control - static const EventTypeSpec kControlMouseEvents[] = - { - { kEventClassMouse, kEventMouseWheelMoved }, - { kEventClassControl, kEventControlContextualMenuClick }, - // So we can reinstall our events when the window changes - { kEventClassControl, kEventControlOwningWindowChanged }, - }; - - result = AddEventTypesToHandler( fHandler, GetEventTypeCount( kControlMouseEvents ), - kControlMouseEvents ); - } - - if ( this->GetOwner() != NULL ) - { - // We use "-1" to indicate that we want to install an event handler once we get a window - if ( mouseEventHandler != NULL && mouseEventHandler != reinterpret_cast<void*>( -1 ) ) - { - result = RemoveEventHandler( mouseEventHandler ); - } - mouseEventHandler = NULL; - - static const EventTypeSpec kWindowMouseEvents[] = - { - { kEventClassMouse, kEventMouseDown }, - { kEventClassMouse, kEventMouseUp }, - { kEventClassMouse, kEventMouseMoved }, - { kEventClassMouse, kEventMouseDragged }, - }; - - result = InstallEventHandler( GetWindowEventTarget( this->GetOwner() ), WindowEventHandler, - GetEventTypeCount( kWindowMouseEvents ), kWindowMouseEvents, - this, &mouseEventHandler ); - } - // If we have no window yet. Set the mouseEventHandler to -1 so when we get one we - // will install the event handler - else - { - mouseEventHandler = reinterpret_cast<EventHandlerRef>( -1 ); - } - } - break; - case kMouseTracking: - { - { - static const EventTypeSpec kControlMouseEvents[] = - { - { kEventClassMouse, kEventMouseEntered }, // only works if mousetracking is started - { kEventClassMouse, kEventMouseExited }, // only works if mousetracking is started - }; - - result = AddEventTypesToHandler( fHandler, GetEventTypeCount( kControlMouseEvents ), - kControlMouseEvents ); - } - } - - //default: - // assert( false ); - } - - return result; -} - -OSStatus TView::InstallTimer( EventTimerInterval inFireDelay, EventLoopTimerRef* outTimer ) -{ - return InstallEventLoopTimer( GetCurrentEventLoop(), inFireDelay, inFireDelay, TimerEventHandler, this, outTimer ); -} - -//----------------------------------------------------------------------------------- -// RegisterSubclass -//----------------------------------------------------------------------------------- -// This routine should be called by subclasses so they can be created as HIObjects. -// -OSStatus TView::RegisterSubclass( - CFStringRef inID, - ConstructProc inProc ) -{ - return HIObjectRegisterSubclass( inID, kHIViewClassID, 0, ObjectEventHandler, - GetEventTypeCount( kHIObjectEvents ), kHIObjectEvents, (void*) inProc, NULL ); -} - -//----------------------------------------------------------------------------------- -// ObjectEventHandler -//----------------------------------------------------------------------------------- -// Our static event handler proc. We handle any HIObject based events directly in -// here at present. -// -pascal OSStatus TView::ObjectEventHandler( - EventHandlerCallRef inCallRef, - EventRef inEvent, - void* inUserData ) -{ - OSStatus result = eventNotHandledErr; - TView* view = (TView*) inUserData; - TCarbonEvent event( inEvent ); - - switch ( event.GetClass() ) - { - case kEventClassHIObject: - switch ( event.GetKind() ) - { - case kEventHIObjectConstruct: - { - ControlRef control; // ControlRefs are HIObjectRefs - TView* view; - - result = event.GetParameter<HIObjectRef>( kEventParamHIObjectInstance, - typeHIObjectRef, (HIObjectRef*)&control ); - require_noerr( result, ParameterMissing ); - - // on entry for our construct event, we're passed the - // creation proc we registered with for this class. - // we use it now to create the instance, and then we - // replace the instance parameter data with said instance - // as type void. - - result = (*(ConstructProc)inUserData)( control, &view ); - if ( result == noErr ) - event.SetParameter<TViewPtr>( kEventParamHIObjectInstance, - typeVoidPtr, view ); - } - break; - - case kEventHIObjectInitialize: - result = CallNextEventHandler( inCallRef, inEvent ); - if ( result == noErr ) - result = view->Initialize( event ); - break; - - case kEventHIObjectDestruct: - delete view; - break; - } - break; - } - -ParameterMissing: - - return result; -} - -//----------------------------------------------------------------------------------- -// ViewEventHandler -//----------------------------------------------------------------------------------- -// Our static event handler proc. We handle all non-HIObject events here. -// -pascal OSStatus TView::ViewEventHandler( - EventHandlerCallRef inCallRef, - EventRef inEvent, - void* inUserData ) -{ - OSStatus result; - TView* view = (TView*) inUserData; - TCarbonEvent event( inEvent ); - //if (view->debugPrint) - // fprintf(stderr,"TView::ViewEventHandler\n"); - result = view->HandleEvent( inCallRef, event ); - - return result; -} - - -pascal OSStatus TView::WindowEventHandler( - EventHandlerCallRef inCallRef, - EventRef inEvent, - void* inUserData ) -{ - TView* view = reinterpret_cast<TView*>( inUserData ); - TCarbonEvent event( inEvent ); - - const WindowRef window = view->GetOwner(); - if (NULL == window) - return eventNotHandledErr; - - // If the window is not active, let the standard window handler execute. - if ( ! IsWindowActive( window ) ) return eventNotHandledErr; - if (view->debugPrint) - fprintf(stderr,"TView::WindowEventHandler\n"); - - const HIViewRef rootView = HIViewGetRoot( window ); - if (NULL == rootView) - return eventNotHandledErr; - - // TODO: On OS X 10.3, test if this bug still exists - // This is a hack to work around a bug in the OS. See: - // http://lists.apple.com/archives/carbon-development/2002/Sep/29/keventmousemovedeventsno.004.txt - OSStatus err; - if ( event.GetKind() == kEventMouseMoved ) - { - // We need to set some parameters correctly - event.SetParameter( kEventParamWindowRef, window ); - - HIPoint ptMouse; - event.GetParameter( kEventParamMouseLocation, &ptMouse ); - - // convert screen coords to window relative - Rect bounds; - err = GetWindowBounds( window, kWindowStructureRgn, &bounds ); - if( err == noErr ) - { - ptMouse.x -= bounds.left; - ptMouse.y -= bounds.top; - event.SetParameter( kEventParamWindowMouseLocation, ptMouse ); - } - } - - HIViewRef targetView = NULL; - err = HIViewGetViewForMouseEvent( rootView, inEvent, &targetView ); - //if (view->debugPrint) - // fprintf(stderr,"TView::WindowEventHandler root[%08X] viewRef[%08X] targetView[%08X]\n", rootView, view->GetViewRef(), targetView); - if ( targetView == view->GetViewRef() || event.GetKind() == kEventMouseDragged ) - { - return view->HandleEvent( inCallRef, event ); - } - - return eventNotHandledErr; -} - -pascal void TView::TimerEventHandler( EventLoopTimerRef inTimer, void* view ) -{ - reinterpret_cast<TView*>( view )->TimerFired( inTimer ); -} - -//----------------------------------------------------------------------------------- -// HandleEvent -//----------------------------------------------------------------------------------- -// Our object's virtual event handler method. I'm not sure if we need this these days. -// We used to do various things with it, but those days are long gone... -// -OSStatus TView::HandleEvent( - EventHandlerCallRef inCallRef, - TCarbonEvent& inEvent ) -{ -#pragma unused( inCallRef ) - - OSStatus result = eventNotHandledErr; - HIPoint where; - OSType tag; - void * ptr; - Size size, outSize; - UInt32 features; - RgnHandle region = NULL; - ControlPartCode part; - RgnHandle invalRgn; - - switch ( inEvent.GetClass() ) - { - case kEventClassCommand: - { - HICommand command; - - result = inEvent.GetParameter( kEventParamDirectObject, &command ); - require_noerr( result, MissingParameter ); - - switch ( inEvent.GetKind() ) - { - case kEventCommandProcess: - result = ProcessCommand( command ); - break; - - case kEventCommandUpdateStatus: - result = UpdateCommandStatus( command ); - break; - } - } - break; - - case kEventClassControl: - switch ( inEvent.GetKind() ) - { - case kEventControlInitialize: - features = GetBehaviors(); - inEvent.SetParameter( kEventParamControlFeatures, features ); - result = noErr; - break; - - case kEventControlDraw: - { - CGContextRef context = NULL; - - inEvent.GetParameter( kEventParamRgnHandle, ®ion ); - inEvent.GetParameter<CGContextRef>( kEventParamCGContextRef, typeCGContextRef, &context ); - - Draw( region, context ); - result = noErr; - } - break; - - case kEventControlHitTest: - inEvent.GetParameter<HIPoint>( kEventParamMouseLocation, typeHIPoint, &where ); - part = HitTest( where ); - inEvent.SetParameter<ControlPartCode>( kEventParamControlPart, typeControlPartCode, part ); - result = noErr; - break; - - case kEventControlGetPartRegion: - inEvent.GetParameter<ControlPartCode>( kEventParamControlPart, typeControlPartCode, &part ); - inEvent.GetParameter( kEventParamControlRegion, ®ion ); - result = GetRegion( part, region ); - break; - - case kEventControlGetData: - inEvent.GetParameter<ControlPartCode>( kEventParamControlPart, typeControlPartCode, &part ); - inEvent.GetParameter<OSType>( kEventParamControlDataTag, typeEnumeration, &tag ); - inEvent.GetParameter<Ptr>( kEventParamControlDataBuffer, typePtr, (Ptr*)&ptr ); - inEvent.GetParameter<Size>( kEventParamControlDataBufferSize, typeLongInteger, &size ); - - result = GetData( tag, part, size, &outSize, ptr ); - - if ( result == noErr ) - verify_noerr( inEvent.SetParameter<Size>( kEventParamControlDataBufferSize, typeLongInteger, outSize ) ); - break; - - case kEventControlSetData: - inEvent.GetParameter<ControlPartCode>( kEventParamControlPart, typeControlPartCode, &part ); - inEvent.GetParameter<OSType>( kEventParamControlDataTag, typeEnumeration, &tag ); - inEvent.GetParameter<Ptr>( kEventParamControlDataBuffer, typePtr, (Ptr*)&ptr ); - inEvent.GetParameter<Size>( kEventParamControlDataBufferSize, typeLongInteger, &size ); - - result = SetData( tag, part, size, ptr ); - break; - - case kEventControlGetOptimalBounds: - { - HISize size; - float floatBaseLine; - - result = GetOptimalSize( &size, &floatBaseLine ); - if ( result == noErr ) - { - Rect bounds; - SInt16 baseLine; - - GetControlBounds( GetViewRef(), &bounds ); - - bounds.bottom = bounds.top + (SInt16)size.height; - bounds.right = bounds.left + (SInt16)size.width; - baseLine = (SInt16)floatBaseLine; - - inEvent.SetParameter( kEventParamControlOptimalBounds, bounds ); - inEvent.SetParameter<SInt16>( kEventParamControlOptimalBaselineOffset, typeShortInteger, baseLine ); - } - } - break; - - case kEventControlBoundsChanged: - { - HIRect prevRect, currRect; - UInt32 attrs; - - inEvent.GetParameter( kEventParamAttributes, &attrs ); - inEvent.GetParameter( kEventParamOriginalBounds, &prevRect ); - inEvent.GetParameter( kEventParamCurrentBounds, &currRect ); - inEvent.GetParameter( kEventParamControlInvalRgn, &invalRgn ); - - result = BoundsChanged( attrs, prevRect, currRect, invalRgn ); - - if ( mouseEventHandler != NULL ) - { - ActivateInterface( kMouse ); - } - - } - break; - - case kEventControlHit: - { - UInt32 modifiers; - - inEvent.GetParameter<ControlPartCode>( kEventParamControlPart, typeControlPartCode, &part ); - inEvent.GetParameter( kEventParamKeyModifiers, &modifiers ); - - result = ControlHit( part, modifiers ); - } - break; - - case kEventControlHiliteChanged: - { - ControlPartCode prevPart, currPart; - - inEvent.GetParameter<ControlPartCode>( kEventParamControlPreviousPart, typeControlPartCode, &prevPart ); - inEvent.GetParameter<ControlPartCode>( kEventParamControlCurrentPart, typeControlPartCode, &currPart ); - inEvent.GetParameter( kEventParamControlInvalRgn, &invalRgn ); - - result = HiliteChanged( prevPart, currPart, invalRgn ); - - if ( GetAutoInvalidateFlags() & kAutoInvalidateOnHilite ) - Invalidate(); - } - break; - - case kEventControlActivate: - result = ActiveStateChanged(); - - if ( GetAutoInvalidateFlags() & kAutoInvalidateOnActivate ) - Invalidate(); - break; - - case kEventControlDeactivate: - result = ActiveStateChanged(); - - if ( GetAutoInvalidateFlags() & kAutoInvalidateOnActivate ) - Invalidate(); - break; - - case kEventControlValueFieldChanged: - result = ValueChanged(); - - if ( GetAutoInvalidateFlags() & kAutoInvalidateOnValueChange ) - Invalidate(); - break; - - case kEventControlTitleChanged: - result = TitleChanged(); - - if ( GetAutoInvalidateFlags() & kAutoInvalidateOnTitleChange ) - Invalidate(); - break; - - case kEventControlEnabledStateChanged: - result = EnabledStateChanged(); - - if ( GetAutoInvalidateFlags() & kAutoInvalidateOnEnable ) - Invalidate(); - break; - - case kEventControlDragEnter: - case kEventControlDragLeave: - case kEventControlDragWithin: - { - DragRef drag; - bool likesDrag; - - inEvent.GetParameter( kEventParamDragRef, &drag ); - - switch ( inEvent.GetKind() ) - { - case kEventControlDragEnter: - likesDrag = DragEnter( drag ); - // Why only if likesDrag? What if it doesn't? No parameter? - if ( likesDrag ) - result = inEvent.SetParameter( kEventParamControlLikesDrag, likesDrag ); - break; - - case kEventControlDragLeave: - DragLeave( drag ); - result = noErr; - break; - - case kEventControlDragWithin: - DragWithin( drag ); - result = noErr; - break; - } - } - break; - - case kEventControlDragReceive: - { - DragRef drag; - - inEvent.GetParameter( kEventParamDragRef, &drag ); - - result = DragReceive( drag ); - } - break; - - case kEventControlTrack: - { - ControlPartCode part; - - result = Track( inEvent, &part ); - if ( result == noErr ) - verify_noerr( inEvent.SetParameter<ControlPartCode>( kEventParamControlPart, typeControlPartCode, part ) ); - } - break; - - case kEventControlGetSizeConstraints: - { - HISize minSize, maxSize; - - result = GetSizeConstraints( &minSize, &maxSize ); - - if ( result == noErr ) - { - verify_noerr( inEvent.SetParameter( kEventParamMinimumSize, minSize ) ); - verify_noerr( inEvent.SetParameter( kEventParamMaximumSize, maxSize ) ); - } - } - break; - - case kEventControlSetFocusPart: - { - ControlPartCode desiredFocus; - RgnHandle invalidRgn; - Boolean focusEverything; - ControlPartCode actualFocus; - - result = inEvent.GetParameter<ControlPartCode>( kEventParamControlPart, typeControlPartCode, &desiredFocus ); - require_noerr( result, MissingParameter ); - - inEvent.GetParameter( kEventParamControlInvalRgn, &invalidRgn ); - - focusEverything = false; // a good default in case the parameter doesn't exist - - inEvent.GetParameter( kEventParamControlFocusEverything, &focusEverything ); - - result = SetFocusPart( desiredFocus, invalidRgn, focusEverything, &actualFocus ); - - if ( result == noErr ) - verify_noerr( inEvent.SetParameter<ControlPartCode>( kEventParamControlPart, typeControlPartCode, actualFocus ) ); - } - break; - - case kEventControlOwningWindowChanged: - { - // If our owning window has changed, reactivate the mouse interface - if ( mouseEventHandler != NULL ) - { - ActivateInterface( kMouse ); - } - } - break; - - case kEventControlContextualMenuClick: - { - HIPoint ptMouse; - inEvent.GetParameter( kEventParamMouseLocation, &ptMouse ); - result = ContextualMenuClick( ptMouse ); - } - break; - - // some other kind of Control event - default: - break; - } - break; - - case kEventClassTextInput: - result = TextInput( inEvent ); - break; - - case kEventClassMouse: - { - result = inEvent.GetParameter<HIPoint>( kEventParamWindowMouseLocation, typeHIPoint, &where ); - HIViewConvertPoint( &where, NULL, fViewRef ); - - UInt32 inKeyModifiers; - result = inEvent.GetParameter( kEventParamKeyModifiers, &inKeyModifiers ); - if( result != noErr ) - inKeyModifiers = 0; - EventMouseButton inMouseButton = 0; - result = inEvent.GetParameter<EventMouseButton>( kEventParamMouseButton, typeMouseButton, &inMouseButton ); - if (noErr != result) - // assume no button is pressed if there is no button info - inMouseButton = 0; - UInt32 inClickCount; - result = inEvent.GetParameter( kEventParamClickCount, &inClickCount ); - if( result != noErr ) - inClickCount = 0; - - switch ( inEvent.GetKind() ) - { - case kEventMouseWheelMoved: - { - EventMouseWheelAxis inAxis; - result = inEvent.GetParameter<EventMouseWheelAxis>( kEventParamMouseWheelAxis, typeMouseWheelAxis, &inAxis ); - - SInt32 inDelta; - result = inEvent.GetParameter<SInt32>( kEventParamMouseWheelDelta, typeSInt32, &inDelta ); - - result = MouseWheelMoved( inAxis, inDelta, inKeyModifiers ); - break; - } - case kEventMouseDown: - result = MouseDown( where, inKeyModifiers, inMouseButton, inClickCount, inEvent ); - break; - case kEventMouseUp: - result = MouseUp( where, inKeyModifiers, inMouseButton, inClickCount ); - break; - case kEventMouseExited: - result = MouseExited( where, inKeyModifiers, inMouseButton, inClickCount ); - break; - case kEventMouseEntered: - result = MouseEntered( where, inKeyModifiers, inMouseButton, inClickCount ); - break; - case kEventMouseMoved: - case kEventMouseDragged: - result = MouseDragged( where, inKeyModifiers, inMouseButton, inClickCount ); - break; - default:; - } - break; - } - // some other event class - default: - break; - } - -MissingParameter: - return result; -} - -//----------------------------------------------------------------------------------- -// CreateInitializationEvent -//----------------------------------------------------------------------------------- -// Create a basic intialization event containing the parent control and bounds. At -// present we set the bounds to empty and the parent to NULL. In theory, after creating -// this event, any subclass could add its own parameter to receive in its -// Initialize method. -// -EventRef TView::CreateInitializationEvent() -{ - OSStatus result = noErr; - EventRef event; - - result = CreateEvent( NULL, kEventClassHIObject, kEventHIObjectInitialize, - GetCurrentEventTime(), 0, &event ); - require_noerr_action( result, CantCreateEvent, event = NULL ); - -CantCreateEvent: - return event; -} - -//----------------------------------------------------------------------------------- -// Frame -//----------------------------------------------------------------------------------- -// -HIRect TView::Frame() -{ - HIRect frame; - - HIViewGetFrame( GetViewRef(), &frame ); - - return frame; -} - -//----------------------------------------------------------------------------------- -// SetFrame -//----------------------------------------------------------------------------------- -// -OSStatus TView::SetFrame( - const HIRect& inFrame ) -{ - OSStatus err; - - err = HIViewSetFrame( GetViewRef(), &inFrame ); - - return err; -} - -//----------------------------------------------------------------------------------- -// Bounds -//----------------------------------------------------------------------------------- -// -HIRect TView::Bounds() -{ - HIRect bounds; - - HIViewGetBounds( GetViewRef(), &bounds ); - - return bounds; -} - -//----------------------------------------------------------------------------------- -// Show -//----------------------------------------------------------------------------------- -// -OSStatus TView::Show() -{ - return HIViewSetVisible( GetViewRef(), true ); -} - -//----------------------------------------------------------------------------------- -// Hide -//----------------------------------------------------------------------------------- -// -OSStatus TView::Hide() -{ - return HIViewSetVisible( GetViewRef(), false ); -} - -//----------------------------------------------------------------------------------- -// GetEventTarget -//----------------------------------------------------------------------------------- -// -EventTargetRef TView::GetEventTarget() -{ - return HIObjectGetEventTarget( (HIObjectRef) GetViewRef() ); -} - -//----------------------------------------------------------------------------------- -// AddSubView -//----------------------------------------------------------------------------------- -// -OSStatus TView::AddSubView( - TView* inSubView ) -{ - return HIViewAddSubview( GetViewRef(), inSubView->GetViewRef() );; -} - -//----------------------------------------------------------------------------------- -// RemoveFromSuperView -//----------------------------------------------------------------------------------- -// -OSStatus TView::RemoveFromSuperView() -{ - return HIViewRemoveFromSuperview( GetViewRef() ); -} - -//----------------------------------------------------------------------------------- -// GetHilite -//----------------------------------------------------------------------------------- -// -ControlPartCode TView::GetHilite() -{ - return GetControlHilite( GetViewRef() ); -} - -//----------------------------------------------------------------------------------- -// GetValue -//----------------------------------------------------------------------------------- -// -SInt32 TView::GetValue() -{ - return GetControl32BitValue( GetViewRef() ); -} - -//----------------------------------------------------------------------------------- -// SetValue -//----------------------------------------------------------------------------------- -// -void TView::SetValue( - SInt32 inValue ) -{ - SetControl32BitValue( GetViewRef(), inValue ); -} - -//----------------------------------------------------------------------------------- -// GetMinimum -//----------------------------------------------------------------------------------- -// -SInt32 TView::GetMinimum() -{ - return GetControlMinimum( GetViewRef() ); -} - -//----------------------------------------------------------------------------------- -// SetMinimum -//----------------------------------------------------------------------------------- -// -void TView::SetMinimum( - SInt32 inMinimum ) -{ - SetControlMinimum( GetViewRef(), inMinimum ); -} - -//----------------------------------------------------------------------------------- -// GetMaximum -//----------------------------------------------------------------------------------- -// -SInt32 TView::GetMaximum() -{ - return GetControlMaximum( GetViewRef() ); -} - -//----------------------------------------------------------------------------------- -// SetMaximum -//----------------------------------------------------------------------------------- -// -void TView::SetMaximum( - SInt32 inMaximum ) -{ - SetControlMaximum( GetViewRef(), inMaximum ); -} - -//----------------------------------------------------------------------------------- -// GetOwner -//----------------------------------------------------------------------------------- -// -WindowRef TView::GetOwner() -{ - return GetControlOwner( GetViewRef() ); -} - -//----------------------------------------------------------------------------------- -// Hilite -//----------------------------------------------------------------------------------- -// -void TView::Hilite( - ControlPartCode inPart) -{ - return HiliteControl( GetViewRef(), inPart ); -} - -//----------------------------------------------------------------------------------- -// Invalidate -//----------------------------------------------------------------------------------- -// -OSStatus TView::Invalidate() -{ - return HIViewSetNeedsDisplay( GetViewRef(), true ); -} - -void TView::TimerFired( EventLoopTimerRef inTimer ) -{ -#pragma unused( inTimer ) -} - - -//----------------------------------------------------------------------------------- -// IsVisible -//----------------------------------------------------------------------------------- -// -Boolean TView::IsVisible() -{ - return IsControlVisible( GetViewRef() ); -} - -//----------------------------------------------------------------------------------- -// IsEnabled -//----------------------------------------------------------------------------------- -// -Boolean TView::IsEnabled() -{ - return IsControlEnabled( GetViewRef() ); -} - -//----------------------------------------------------------------------------------- -// IsActive -//----------------------------------------------------------------------------------- -// -Boolean TView::IsActive() -{ - return IsControlActive( GetViewRef() ); -} - -//----------------------------------------------------------------------------------- -// ActiveStateChanged -//----------------------------------------------------------------------------------- -// Default activation method. Subclasses should override as necessary. We do nothing -// here in the base class, so we return eventNotHandledErr. -// -OSStatus TView::ActiveStateChanged() -{ - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// ValueChanged -//----------------------------------------------------------------------------------- -// Default value changed method. Subclasses should override as necessary. We do -// nothing here in the base class, so we return eventNotHandledErr. -// -OSStatus TView::ValueChanged() -{ - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// TitleChanged -//----------------------------------------------------------------------------------- -// Default title changed method. Subclasses should override as necessary. We -// do nothing here in the base class, so we return eventNotHandledErr. -// -OSStatus TView::TitleChanged() -{ - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// EnabledStateChanged -//----------------------------------------------------------------------------------- -// Default enable method. Subclasses should override as necessary. We -// do nothing here in the base class, so we return eventNotHandledErr. -// -OSStatus TView::EnabledStateChanged() -{ - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// TextInput -//----------------------------------------------------------------------------------- -// Default text (Unicode) input method. Subclasses should override as necessary. We -// do nothing here in the base class, so we return eventNotHandledErr. -// -OSStatus TView::TextInput( - TCarbonEvent& inEvent ) -{ -#pragma unused( inEvent ) - - return eventNotHandledErr; -} - -//----------------------------------------------------------------------------------- -// ChangeAutoInvalidateFlags -//----------------------------------------------------------------------------------- -// Change behavior for auto-invalidating views on certain actions. -// -void TView::ChangeAutoInvalidateFlags( - OptionBits inSetThese, - OptionBits inClearThese ) -{ - fAutoInvalidateFlags = ( ( fAutoInvalidateFlags | inSetThese ) & ( ~inClearThese ) ); -} diff --git a/macosx/TView.h b/macosx/TView.h deleted file mode 100644 index 97c8f7b55..000000000 --- a/macosx/TView.h +++ /dev/null @@ -1,286 +0,0 @@ -/* - File: TView.h - - Version: 1.0 - - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Copyright © 2002 Apple Computer, Inc., All Rights Reserved -*/ - -#ifndef TView_H_ -#define TView_H_ - -#include <Carbon/Carbon.h> - -#include "TCarbonEvent.h" -#include "TRect.h" - -#define PURE_VIRTUAL 0 - -class TView -{ -public: - // Bounds and Frame - OSStatus SetFrame( - const HIRect& inBounds ); - HIRect Frame(); - HIRect Bounds(); - - // Visibility - OSStatus Show(); - OSStatus Hide(); - - EventTargetRef GetEventTarget(); - - OSStatus AddSubView( - TView* inSubView ); - OSStatus RemoveFromSuperView(); - - // Accessors - HIViewRef GetViewRef() const - { return fViewRef; } - void Hilite( - ControlPartCode inPart ); - ControlPartCode GetHilite(); - WindowRef GetOwner(); - SInt32 GetValue(); - void SetValue( - SInt32 inValue ); - SInt32 GetMinimum(); - void SetMinimum( - SInt32 inMinimum ); - SInt32 GetMaximum(); - void SetMaximum( - SInt32 inMaximum ); - - // State - Boolean IsVisible(); - Boolean IsEnabled(); - Boolean IsActive(); - - OSStatus Invalidate(); // was SetNeedsDisplay() - - // A "fake" event handler - virtual void TimerFired( EventLoopTimerRef inTimer ); - -protected: - // Autoinvalidation - enum { - kAutoInvalidateOnActivate = (1 << 0), - kAutoInvalidateOnHilite = (1 << 1), - kAutoInvalidateOnEnable = (1 << 2), - kAutoInvalidateOnValueChange = (1 << 3), - kAutoInvalidateOnTitleChange = (1 << 4) - }; - void ChangeAutoInvalidateFlags( - OptionBits inSetFlags, - OptionBits inClearFlags ); - OptionBits GetAutoInvalidateFlags() - { return fAutoInvalidateFlags; } - - // Types - typedef OSStatus (*ConstructProc)( - ControlRef inBaseControl, - TView** outView ); - - // Construction/Destruction - TView( HIViewRef inControl ); - virtual ~TView(); - - virtual ControlKind GetKind() = PURE_VIRTUAL; - virtual UInt32 GetBehaviors(); - - // Handlers - virtual OSStatus ActiveStateChanged(); - virtual OSStatus BoundsChanged( - UInt32 inOptions, - const HIRect& inOriginalBounds, - const HIRect& inCurrentBounds, - RgnHandle inInvalRgn ); - virtual OSStatus ControlHit( - ControlPartCode inPart, - UInt32 inModifiers ); - virtual OSStatus EnabledStateChanged(); - virtual void Draw( - RgnHandle inLimitRgn, - CGContextRef inContext ); - virtual OSStatus GetData( - OSType inTag, - ControlPartCode inPart, - Size inSize, - Size* outSize, - void* inPtr ); - virtual OSStatus GetRegion( - ControlPartCode inPart, - RgnHandle outRgn ); - virtual OSStatus HiliteChanged( - ControlPartCode inOriginalPart, - ControlPartCode inCurrentPart, - RgnHandle inInvalRgn ); - virtual ControlPartCode HitTest( - const HIPoint& inWhere ); - virtual OSStatus Initialize( - TCarbonEvent& inEvent ); - virtual OSStatus SetData( - OSType inTag, - ControlPartCode inPart, - Size inSize, - const void* inPtr ); - virtual OSStatus SetFocusPart( - ControlPartCode inDesiredFocus, - RgnHandle inNnvalidRgn, - Boolean inFocusEverything, - ControlPartCode* outActualFocus ); - virtual OSStatus TextInput( - TCarbonEvent& inEvent ); - virtual OSStatus TitleChanged(); - virtual OSStatus Track( - TCarbonEvent& inEvent, - ControlPartCode* outPartHit ); - virtual OSStatus ValueChanged(); - - // Sizing - virtual OSStatus GetSizeConstraints( - HISize* outMin, - HISize* outMax ); - virtual OSStatus GetOptimalSize( - HISize* outSize, - float* outBaseLine ); - - // Accessors - WindowRef GetWindowRef() - { return GetControlOwner( GetViewRef() ); } - - - // Drag and drop - virtual bool DragEnter( - DragRef inDrag ); - virtual bool DragWithin( - DragRef inDrag ); - virtual bool DragLeave( - DragRef inDrag ); - virtual OSStatus DragReceive( - DragRef inDrag ); - - // Command processing - virtual OSStatus ProcessCommand( - const HICommand& inCommand ); - virtual OSStatus UpdateCommandStatus( - const HICommand& inCommand ); - - // Mouse events - virtual OSStatus MouseDown( - HIPoint& inMouseLocation, - UInt32 inKeyModifiers, - EventMouseButton inMouseButton, - UInt32 inClickCount, - TCarbonEvent& inEvent); - virtual OSStatus MouseUp( - HIPoint& inMouseLocation, - UInt32 inKeyModifiers, - EventMouseButton inMouseButton, - UInt32 inClickCount ); - virtual OSStatus MouseDragged( - HIPoint& inMouseLocation, - UInt32 inKeyModifiers, - EventMouseButton inMouseButton, - UInt32 inClickCount ); - virtual OSStatus MouseEntered( - HIPoint& inMouseLocation, - UInt32 inKeyModifiers, - EventMouseButton inMouseButton, - UInt32 inClickCount ); - virtual OSStatus MouseExited( - HIPoint& inMouseLocation, - UInt32 inKeyModifiers, - EventMouseButton inMouseButton, - UInt32 inClickCount ); - virtual OSStatus MouseWheelMoved( EventMouseWheelAxis inAxis, SInt32 inDelta, UInt32 inKeyModifiers ); - virtual OSStatus ContextualMenuClick( HIPoint& inMouseLocation ); - - // Utility - static OSStatus RegisterSubclass( - CFStringRef inID, - ConstructProc inProc ); - static EventRef CreateInitializationEvent(); - enum Interface { - kDragAndDrop = 1, - kKeyboardFocus, - kMouse, - kMouseTracking - }; - virtual OSStatus ActivateInterface( - Interface inInterface ); - - OSStatus InstallTimer( - EventTimerInterval inFireDelay, - EventLoopTimerRef* outTimer ); - - // Debugging - virtual void PrintDebugInfo(); - Boolean debugPrint; -private: - static pascal OSStatus ObjectEventHandler( - EventHandlerCallRef inCallRef, - EventRef inEvent, - void* inUserData ); - static pascal OSStatus ViewEventHandler( - EventHandlerCallRef inCallRef, - EventRef inEvent, - void* inUserData ); - static pascal OSStatus WindowEventHandler( - EventHandlerCallRef inCallRef, - EventRef inEvent, - void* inUserData ); - static pascal void TimerEventHandler( - EventLoopTimerRef inTimer, - void* inUserData ); - OSStatus HandleEvent( - EventHandlerCallRef inCallRef, - TCarbonEvent& inEvent ); - - HIViewRef fViewRef; - EventHandlerRef fHandler; - - EventHandlerRef mouseEventHandler; - OptionBits fAutoInvalidateFlags; - -}; - -typedef TView* TViewPtr; - -#endif // TView_H_ diff --git a/macosx/deps.mak b/macosx/deps.mak deleted file mode 100644 index 7b8f4125a..000000000 --- a/macosx/deps.mak +++ /dev/null @@ -1,226 +0,0 @@ -ExtInput.o: ExtInput.cxx ScintillaMacOSX.h TView.h TCarbonEvent.h TRect.h \ - ../include/Platform.h ../include/Scintilla.h PlatMacOSX.h \ - QuartzTextLayout.h QuartzTextStyle.h QuartzTextStyleAttribute.h \ - ../include/ScintillaWidget.h ../include/SciLexer.h \ - ../lexlib/PropSetSimple.h ../include/ILexer.h ../lexlib/LexAccessor.h \ - ../lexlib/Accessor.h ../src/SVector.h ../src/SplitVector.h \ - ../src/Partitioning.h ../src/RunStyles.h ../src/ContractionState.h \ - ../src/CellBuffer.h ../src/CallTip.h ../src/KeyMap.h ../src/Indicator.h \ - ../src/XPM.h ../src/LineMarker.h ../src/Style.h ../src/AutoComplete.h \ - ../src/ViewStyle.h ../src/CharClassify.h ../src/Decoration.h \ - ../src/Document.h ../src/Selection.h ../src/PositionCache.h \ - ../src/Editor.h ../src/ScintillaBase.h ScintillaCallTip.h ExtInput.h -PlatMacOSX.o: PlatMacOSX.cxx QuartzTextLayout.h QuartzTextStyle.h \ - QuartzTextStyleAttribute.h TCarbonEvent.h ../include/Platform.h \ - ../include/Scintilla.h PlatMacOSX.h ../src/XPM.h \ - ../include/ScintillaWidget.h -ScintillaCallTip.o: ScintillaCallTip.cxx ScintillaMacOSX.h TView.h \ - TCarbonEvent.h TRect.h ../include/Platform.h ../include/Scintilla.h \ - PlatMacOSX.h QuartzTextLayout.h QuartzTextStyle.h \ - QuartzTextStyleAttribute.h ../include/ScintillaWidget.h \ - ../include/SciLexer.h ../lexlib/PropSetSimple.h ../include/ILexer.h \ - ../lexlib/LexAccessor.h ../lexlib/Accessor.h ../src/SVector.h \ - ../src/SplitVector.h ../src/Partitioning.h ../src/RunStyles.h \ - ../src/ContractionState.h ../src/CellBuffer.h ../src/CallTip.h \ - ../src/KeyMap.h ../src/Indicator.h ../src/XPM.h ../src/LineMarker.h \ - ../src/Style.h ../src/AutoComplete.h ../src/ViewStyle.h \ - ../src/CharClassify.h ../src/Decoration.h ../src/Document.h \ - ../src/Selection.h ../src/PositionCache.h ../src/Editor.h \ - ../src/ScintillaBase.h ScintillaCallTip.h -ScintillaListBox.o: ScintillaListBox.cxx ScintillaMacOSX.h TView.h \ - TCarbonEvent.h TRect.h ../include/Platform.h ../include/Scintilla.h \ - PlatMacOSX.h QuartzTextLayout.h QuartzTextStyle.h \ - QuartzTextStyleAttribute.h ../include/ScintillaWidget.h \ - ../include/SciLexer.h ../lexlib/PropSetSimple.h ../include/ILexer.h \ - ../lexlib/LexAccessor.h ../lexlib/Accessor.h ../src/SVector.h \ - ../src/SplitVector.h ../src/Partitioning.h ../src/RunStyles.h \ - ../src/ContractionState.h ../src/CellBuffer.h ../src/CallTip.h \ - ../src/KeyMap.h ../src/Indicator.h ../src/XPM.h ../src/LineMarker.h \ - ../src/Style.h ../src/AutoComplete.h ../src/ViewStyle.h \ - ../src/CharClassify.h ../src/Decoration.h ../src/Document.h \ - ../src/Selection.h ../src/PositionCache.h ../src/Editor.h \ - ../src/ScintillaBase.h ScintillaCallTip.h ScintillaListBox.h -ScintillaMacOSX.o: ScintillaMacOSX.cxx ScintillaMacOSX.h TView.h \ - TCarbonEvent.h TRect.h ../include/Platform.h ../include/Scintilla.h \ - PlatMacOSX.h QuartzTextLayout.h QuartzTextStyle.h \ - QuartzTextStyleAttribute.h ../include/ScintillaWidget.h \ - ../include/SciLexer.h ../lexlib/PropSetSimple.h ../include/ILexer.h \ - ../lexlib/LexAccessor.h ../lexlib/Accessor.h ../src/SVector.h \ - ../src/SplitVector.h ../src/Partitioning.h ../src/RunStyles.h \ - ../src/ContractionState.h ../src/CellBuffer.h ../src/CallTip.h \ - ../src/KeyMap.h ../src/Indicator.h ../src/XPM.h ../src/LineMarker.h \ - ../src/Style.h ../src/AutoComplete.h ../src/ViewStyle.h \ - ../src/CharClassify.h ../src/Decoration.h ../src/Document.h \ - ../src/Selection.h ../src/PositionCache.h ../src/Editor.h \ - ../src/ScintillaBase.h ScintillaCallTip.h ../src/UniConversion.h -TCarbonEvent.o: TCarbonEvent.cxx TCarbonEvent.h -TView.o: TView.cxx TView.h TCarbonEvent.h TRect.h -AutoComplete.o: ../src/AutoComplete.cxx ../include/Platform.h \ - ../lexlib/CharacterSet.h ../src/AutoComplete.h -CallTip.o: ../src/CallTip.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/CallTip.h -Catalogue.o: ../src/Catalogue.cxx ../include/ILexer.h \ - ../include/Scintilla.h ../include/SciLexer.h ../lexlib/LexerModule.h \ - ../src/Catalogue.h -CellBuffer.o: ../src/CellBuffer.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/CellBuffer.h -CharClassify.o: ../src/CharClassify.cxx ../src/CharClassify.h -ContractionState.o: ../src/ContractionState.cxx ../include/Platform.h \ - ../src/SplitVector.h ../src/Partitioning.h ../src/RunStyles.h \ - ../src/ContractionState.h -Decoration.o: ../src/Decoration.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/RunStyles.h ../src/Decoration.h -Document.o: ../src/Document.cxx ../include/Platform.h ../include/ILexer.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/RunStyles.h ../src/CellBuffer.h ../src/PerLine.h \ - ../src/CharClassify.h ../lexlib/CharacterSet.h ../src/Decoration.h \ - ../src/Document.h ../src/RESearch.h ../src/UniConversion.h -Editor.o: ../src/Editor.cxx ../include/Platform.h ../include/ILexer.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/RunStyles.h ../src/ContractionState.h ../src/CellBuffer.h \ - ../src/KeyMap.h ../src/Indicator.h ../src/XPM.h ../src/LineMarker.h \ - ../src/Style.h ../src/ViewStyle.h ../src/CharClassify.h \ - ../src/Decoration.h ../src/Document.h ../src/Selection.h \ - ../src/PositionCache.h ../src/Editor.h -ExternalLexer.o: ../src/ExternalLexer.cxx ../include/Platform.h \ - ../include/ILexer.h ../include/Scintilla.h ../include/SciLexer.h \ - ../lexlib/LexerModule.h ../src/Catalogue.h ../src/ExternalLexer.h -Indicator.o: ../src/Indicator.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/Indicator.h -KeyMap.o: ../src/KeyMap.cxx ../include/Platform.h ../include/Scintilla.h \ - ../src/KeyMap.h -LineMarker.o: ../src/LineMarker.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/XPM.h ../src/LineMarker.h -PerLine.o: ../src/PerLine.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/CellBuffer.h ../src/PerLine.h -PositionCache.o: ../src/PositionCache.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/RunStyles.h ../src/ContractionState.h ../src/CellBuffer.h \ - ../src/KeyMap.h ../src/Indicator.h ../src/XPM.h ../src/LineMarker.h \ - ../src/Style.h ../src/ViewStyle.h ../src/CharClassify.h \ - ../src/Decoration.h ../include/ILexer.h ../src/Document.h \ - ../src/Selection.h ../src/PositionCache.h -RESearch.o: ../src/RESearch.cxx ../src/CharClassify.h ../src/RESearch.h -RunStyles.o: ../src/RunStyles.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/RunStyles.h -ScintillaBase.o: ../src/ScintillaBase.cxx ../include/Platform.h \ - ../include/ILexer.h ../include/Scintilla.h ../lexlib/PropSetSimple.h \ - ../include/SciLexer.h ../lexlib/LexerModule.h ../src/Catalogue.h \ - ../src/SplitVector.h ../src/Partitioning.h ../src/RunStyles.h \ - ../src/ContractionState.h ../src/CellBuffer.h ../src/CallTip.h \ - ../src/KeyMap.h ../src/Indicator.h ../src/XPM.h ../src/LineMarker.h \ - ../src/Style.h ../src/ViewStyle.h ../src/AutoComplete.h \ - ../src/CharClassify.h ../src/Decoration.h ../src/Document.h \ - ../src/Selection.h ../src/PositionCache.h ../src/Editor.h \ - ../src/ScintillaBase.h -Selection.o: ../src/Selection.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/Selection.h -Style.o: ../src/Style.cxx ../include/Platform.h ../include/Scintilla.h \ - ../src/Style.h -UniConversion.o: ../src/UniConversion.cxx ../src/UniConversion.h -ViewStyle.o: ../src/ViewStyle.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/RunStyles.h ../src/Indicator.h ../src/XPM.h ../src/LineMarker.h \ - ../src/Style.h ../src/ViewStyle.h -XPM.o: ../src/XPM.cxx ../include/Platform.h ../src/XPM.h -Accessor.o: ../lexlib/Accessor.cxx ../include/ILexer.h \ - ../include/Scintilla.h ../include/SciLexer.h ../lexlib/PropSetSimple.h \ - ../lexlib/WordList.h ../lexlib/LexAccessor.h ../lexlib/Accessor.h -CharacterSet.o: ../lexlib/CharacterSet.cxx ../lexlib/CharacterSet.h -LexerBase.o: ../lexlib/LexerBase.cxx ../include/ILexer.h \ - ../include/Scintilla.h ../include/SciLexer.h ../lexlib/PropSetSimple.h \ - ../lexlib/WordList.h ../lexlib/LexAccessor.h ../lexlib/Accessor.h \ - ../lexlib/LexerModule.h ../lexlib/LexerBase.h -LexerModule.o: ../lexlib/LexerModule.cxx ../include/ILexer.h \ - ../include/Scintilla.h ../include/SciLexer.h ../lexlib/PropSetSimple.h \ - ../lexlib/WordList.h ../lexlib/LexAccessor.h ../lexlib/Accessor.h \ - ../lexlib/LexerModule.h ../lexlib/LexerBase.h ../lexlib/LexerSimple.h -LexerNoExceptions.o: ../lexlib/LexerNoExceptions.cxx ../include/ILexer.h \ - ../include/Scintilla.h ../include/SciLexer.h ../lexlib/PropSetSimple.h \ - ../lexlib/WordList.h ../lexlib/LexAccessor.h ../lexlib/Accessor.h \ - ../lexlib/LexerModule.h ../lexlib/LexerBase.h \ - ../lexlib/LexerNoExceptions.h -LexerSimple.o: ../lexlib/LexerSimple.cxx ../include/ILexer.h \ - ../include/Scintilla.h ../include/SciLexer.h ../lexlib/PropSetSimple.h \ - ../lexlib/WordList.h ../lexlib/LexAccessor.h ../lexlib/Accessor.h \ - ../lexlib/LexerModule.h ../lexlib/LexerBase.h ../lexlib/LexerSimple.h -PropSetSimple.o: ../lexlib/PropSetSimple.cxx ../lexlib/PropSetSimple.h -StyleContext.o: ../lexlib/StyleContext.cxx ../include/ILexer.h \ - ../lexlib/LexAccessor.h ../lexlib/Accessor.h ../lexlib/StyleContext.h -WordList.o: ../lexlib/WordList.cxx ../lexlib/WordList.h -AutoComplete.o: ../src/AutoComplete.cxx ../include/Platform.h \ - ../lexlib/CharacterSet.h ../src/AutoComplete.h -CallTip.o: ../src/CallTip.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/CallTip.h -Catalogue.o: ../src/Catalogue.cxx ../include/ILexer.h \ - ../include/Scintilla.h ../include/SciLexer.h ../lexlib/LexerModule.h \ - ../src/Catalogue.h -CellBuffer.o: ../src/CellBuffer.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/CellBuffer.h -CharClassify.o: ../src/CharClassify.cxx ../src/CharClassify.h -ContractionState.o: ../src/ContractionState.cxx ../include/Platform.h \ - ../src/SplitVector.h ../src/Partitioning.h ../src/RunStyles.h \ - ../src/ContractionState.h -Decoration.o: ../src/Decoration.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/RunStyles.h ../src/Decoration.h -Document.o: ../src/Document.cxx ../include/Platform.h ../include/ILexer.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/RunStyles.h ../src/CellBuffer.h ../src/PerLine.h \ - ../src/CharClassify.h ../lexlib/CharacterSet.h ../src/Decoration.h \ - ../src/Document.h ../src/RESearch.h ../src/UniConversion.h -Editor.o: ../src/Editor.cxx ../include/Platform.h ../include/ILexer.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/RunStyles.h ../src/ContractionState.h ../src/CellBuffer.h \ - ../src/KeyMap.h ../src/Indicator.h ../src/XPM.h ../src/LineMarker.h \ - ../src/Style.h ../src/ViewStyle.h ../src/CharClassify.h \ - ../src/Decoration.h ../src/Document.h ../src/Selection.h \ - ../src/PositionCache.h ../src/Editor.h -ExternalLexer.o: ../src/ExternalLexer.cxx ../include/Platform.h \ - ../include/ILexer.h ../include/Scintilla.h ../include/SciLexer.h \ - ../lexlib/LexerModule.h ../src/Catalogue.h ../src/ExternalLexer.h -Indicator.o: ../src/Indicator.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/Indicator.h -KeyMap.o: ../src/KeyMap.cxx ../include/Platform.h ../include/Scintilla.h \ - ../src/KeyMap.h -LineMarker.o: ../src/LineMarker.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/XPM.h ../src/LineMarker.h -PerLine.o: ../src/PerLine.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/CellBuffer.h ../src/PerLine.h -PositionCache.o: ../src/PositionCache.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/RunStyles.h ../src/ContractionState.h ../src/CellBuffer.h \ - ../src/KeyMap.h ../src/Indicator.h ../src/XPM.h ../src/LineMarker.h \ - ../src/Style.h ../src/ViewStyle.h ../src/CharClassify.h \ - ../src/Decoration.h ../include/ILexer.h ../src/Document.h \ - ../src/Selection.h ../src/PositionCache.h -RESearch.o: ../src/RESearch.cxx ../src/CharClassify.h ../src/RESearch.h -RunStyles.o: ../src/RunStyles.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/RunStyles.h -ScintillaBase.o: ../src/ScintillaBase.cxx ../include/Platform.h \ - ../include/ILexer.h ../include/Scintilla.h ../lexlib/PropSetSimple.h \ - ../include/SciLexer.h ../lexlib/LexerModule.h ../src/Catalogue.h \ - ../src/SplitVector.h ../src/Partitioning.h ../src/RunStyles.h \ - ../src/ContractionState.h ../src/CellBuffer.h ../src/CallTip.h \ - ../src/KeyMap.h ../src/Indicator.h ../src/XPM.h ../src/LineMarker.h \ - ../src/Style.h ../src/ViewStyle.h ../src/AutoComplete.h \ - ../src/CharClassify.h ../src/Decoration.h ../src/Document.h \ - ../src/Selection.h ../src/PositionCache.h ../src/Editor.h \ - ../src/ScintillaBase.h -Selection.o: ../src/Selection.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/Selection.h -Style.o: ../src/Style.cxx ../include/Platform.h ../include/Scintilla.h \ - ../src/Style.h -UniConversion.o: ../src/UniConversion.cxx ../src/UniConversion.h -ViewStyle.o: ../src/ViewStyle.cxx ../include/Platform.h \ - ../include/Scintilla.h ../src/SplitVector.h ../src/Partitioning.h \ - ../src/RunStyles.h ../src/Indicator.h ../src/XPM.h ../src/LineMarker.h \ - ../src/Style.h ../src/ViewStyle.h -XPM.o: ../src/XPM.cxx ../include/Platform.h ../src/XPM.h diff --git a/macosx/makefile b/macosx/makefile deleted file mode 100644 index 8f4bdf2a8..000000000 --- a/macosx/makefile +++ /dev/null @@ -1,100 +0,0 @@ -# Make file for Scintilla on Mac OS X -# Copyright 2002 by Evan Jones <ejones@uwaterloo.ca> -# Based on the GTK makefile Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org> -# The License.txt file describes the conditions under which this software may be distributed. -# This makefile assumes that Apple's version of GCC 3.1 is used and changes will be needed to use other compilers. -# GNU make does not like \r\n line endings so should be saved to CVS in binary form. - -.SUFFIXES: .cxx .c .o .h .a -CC = g++ -CCOMP = gcc -LIBTOOL = libtool - -GCC_MAJOR := $(shell $(CC) -v 2>&1 | \ - grep version | cut -d' ' -f3 | cut -d'.' -f1) - -# We call it "libscintilla" so when you add it to a Project Builder project, -# Project Builder will link it correctly. -STATICLIB=../bin/libscintilla.a -DYNAMICLIB=../bin/libscintilla.dylib - -vpath %.h ../src ../include ../lexlib -vpath %.cxx ../src ../lexlib ../lexers - -INCLUDEDIRS=-I ../include -I ../src -I ../lexlib - -ifeq ($(GCC_MAJOR),3) -# 10.4 will have GCC 4 or better, so this should only ever happen -# on a 10.3 or older PPC box -ARCHFLAGS=-arch ppc -faltivec -mcpu=7400 -mtune=7400 -mpowerpc -mpowerpc-gfxopt -else -ifndef NATIVE -ARCH_BASE_FLAGS=/Developer/SDKs/MacOSX10.6.sdk -arch i386 -ARCHFLAGS=-isysroot $(ARCH_BASE_FLAGS) -LINK_FLAGS=-Wl,-syslibroot,$(ARCH_BASE_FLAGS) -DYN_FLAGS=$(LINK_FLAGS) -framework Carbon -bundle -endif -endif - -OPTIONS=-Wall -Wno-missing-braces -Wno-char-subscripts -DSCI_NAMESPACE -DMACOSX -DSCI_LEXER - -#DEBUG = 1 - -ifdef DEBUG -DFLAGS=-DDEBUG -g -else -DFLAGS=-DNDEBUG -Os -endif - -ifdef CONTAINER_HANDLES_EVENTS -CONTAINER=-DCONTAINER_HANDLES_EVENTS=1 -endif - -ifdef EXT_INPUT -EXT_INPUT=-DEXT_INPUT -EXTOBS=ExtInput.o -endif - -.cxx.o: - $(CC) $(CXXFLAGS) $(OPTIONS) $(DFLAGS) $(CONTAINER) $(ARCHFLAGS) $(EXT_INPUT) $(INCLUDEDIRS) -c $< -.c.o: - $(CCOMP) $(CXXFLAGS) $(OPTIONS) $(DFLAGS) $(CONTAINER) $(ARCHFLAGS) $(EXT_INPUT) $(INCLUDEDIRS) -w -c $< - -LEXOBJS:=$(addsuffix .o,$(basename $(notdir $(wildcard ../lexers/Lex*.cxx)))) - -# The LEXOBJS have to be treated specially as the functions in them are not called from external code - -all: $(STATICLIB) $(LEXOBJS) - -shared: $(DYNAMICLIB) $(LEXOBJS) - -clean: - rm -f *.o $(COMPLIB) - -deps: - $(CC) -MM -DSCI_NAMESPACE -DMACOSX -DSCI_LEXER $(CXXFLAGS) $(INCLUDEDIRS) *.cxx ../src/*.cxx ../lexlib/*.cxx ../src/*.cxx >deps.mak - -COMPLIB=Accessor.o CharacterSet.o LexerBase.o LexerModule.o LexerSimple.o StyleContext.o WordList.o \ - CharClassify.o Decoration.o Document.o PerLine.o Catalogue.o CallTip.o \ - ScintillaBase.o ContractionState.o Editor.o ExternalLexer.o PropSetSimple.o PlatMacOSX.o \ - KeyMap.o LineMarker.o PositionCache.o ScintillaMacOSX.o CellBuffer.o ViewStyle.o \ - RESearch.o RunStyles.o Selection.o Style.o Indicator.o AutoComplete.o UniConversion.o XPM.o \ - TCarbonEvent.o TView.o ScintillaCallTip.o $(EXTOBS) \ - $(LEXOBJS) - -$(STATICLIB): $(COMPLIB) - $(LIBTOOL) -static -o $@ $^ - -$(DYNAMICLIB): $(COMPLIB) - $(CC) -dynamic -o $@ $(DYN_FLAGS) $^ - -# Generate header files from Scintilla.iface -../include/Scintilla_gen.h: ../include/HFacer.py ../include/Face.py ../include/Scintilla.iface - cd ../include && python HFacer.py -../include/SciLexer_gen.h: ../include/HFacer.py ../include/Face.py ../include/Scintilla.iface - cd ../include && python HFacer.py -../include/Scintilla.h: ../include/Scintilla_gen.h -../include/SciLexer.h: ../include/SciLexer_gen.h - -# Automatically generate header dependencies with "make deps" -include deps.mak diff --git a/src/Document.cxx b/src/Document.cxx index 5c05aa5e0..4a7546cf1 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -185,6 +185,10 @@ int Document::GetMark(int line) { return static_cast<LineMarkers *>(perLineData[ldMarkers])->MarkValue(line); } +int Document::MarkerNext(int lineStart, int mask) const { + return static_cast<LineMarkers *>(perLineData[ldMarkers])->MarkerNext(lineStart, mask); +} + int Document::AddMark(int line, int markerNum) { if (line >= 0 && line <= LinesTotal()) { int prev = static_cast<LineMarkers *>(perLineData[ldMarkers])-> diff --git a/src/Document.h b/src/Document.h index 00d23a45d..15aecbfe4 100644 --- a/src/Document.h +++ b/src/Document.h @@ -323,6 +323,7 @@ public: cb.GetStyleRange(buffer, position, lengthRetrieve); } int GetMark(int line); + int MarkerNext(int lineStart, int mask) const; int AddMark(int line, int markerNum); void AddMarkSet(int line, int valueSet); void DeleteMark(int line, int markerNum); diff --git a/src/Editor.cxx b/src/Editor.cxx index 9e84132f2..507ae60a1 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -194,6 +194,7 @@ Editor::Editor() { theEdge = 0; paintState = notPainting; + willRedrawAll = false; modEventMask = SC_MODEVENTMASKALL; @@ -1013,6 +1014,8 @@ void Editor::ScrollTo(int line, bool moveThumb) { // Try to optimise small scrolls #ifndef UNDER_CE int linesToMove = topLine - topLineNew; + bool performBlit = (abs(linesToMove) <= 10) && (paintState == notPainting); + willRedrawAll = !performBlit; #endif SetTopLine(topLineNew); // Optimize by styling the view as this will invalidate any needed area @@ -1020,11 +1023,12 @@ void Editor::ScrollTo(int line, bool moveThumb) { StyleToPositionInView(PositionAfterArea(GetClientRectangle())); #ifndef UNDER_CE // Perform redraw rather than scroll if many lines would be redrawn anyway. - if ((abs(linesToMove) <= 10) && (paintState == notPainting)) { + if (performBlit) { ScrollText(linesToMove); } else { Redraw(); } + willRedrawAll = false; #else Redraw(); #endif @@ -4680,7 +4684,7 @@ void Editor::NotifyModified(Document *, DocModification mh, void *) { } if ((mh.modificationType & SC_MOD_CHANGEMARKER) || (mh.modificationType & SC_MOD_CHANGEMARGIN)) { - if ((paintState == notPainting) || !PaintContainsMargin()) { + if ((!willRedrawAll) && ((paintState == notPainting) || !PaintContainsMargin())) { if (mh.modificationType & SC_MOD_CHANGEFOLD) { // Fold changes can affect the drawing of following lines so redraw whole margin RedrawSelMargin(mh.line-1, true); @@ -8074,14 +8078,8 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_MARKERGET: return pdoc->GetMark(wParam); - case SCI_MARKERNEXT: { - int lt = pdoc->LinesTotal(); - for (int iLine = wParam; iLine < lt; iLine++) { - if ((pdoc->GetMark(iLine) & lParam) != 0) - return iLine; - } - } - return -1; + case SCI_MARKERNEXT: + return pdoc->MarkerNext(wParam, lParam); case SCI_MARKERPREVIOUS: { for (int iLine = wParam; iLine >= 0; iLine--) { @@ -8304,6 +8302,9 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_GETLINEVISIBLE: return cs.GetVisible(wParam); + case SCI_GETALLLINESVISIBLE: + return cs.HiddenLines() ? 0 : 1; + case SCI_SETFOLDEXPANDED: if (cs.SetExpanded(wParam, lParam != 0)) { RedrawSelMargin(); diff --git a/src/Editor.h b/src/Editor.h index 7a30fdf3f..06b905961 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -227,6 +227,7 @@ protected: // ScintillaBase subclass needs access to much of Editor enum { notPainting, painting, paintAbandoned } paintState; PRectangle rcPaint; bool paintingAllText; + bool willRedrawAll; StyleNeeded styleNeeded; int modEventMask; diff --git a/src/PerLine.cxx b/src/PerLine.cxx index 7d961a886..c31d4ea9b 100644 --- a/src/PerLine.cxx +++ b/src/PerLine.cxx @@ -182,6 +182,17 @@ int LineMarkers::MarkValue(int line) { return 0; } +int LineMarkers::MarkerNext(int lineStart, int mask) const { + int length = markers.Length(); + for (int iLine = lineStart; iLine < length; iLine++) { + MarkerHandleSet *onLine = markers[iLine]; + if (onLine && ((onLine->MarkValue() & mask) != 0)) + //if ((pdoc->GetMark(iLine) & lParam) != 0) + return iLine; + } + return -1; +} + int LineMarkers::AddMark(int line, int markerNum, int lines) { handleCurrent++; if (!markers.Length()) { diff --git a/src/PerLine.h b/src/PerLine.h index df4728632..b43c52bb8 100644 --- a/src/PerLine.h +++ b/src/PerLine.h @@ -54,6 +54,7 @@ public: virtual void RemoveLine(int line); int MarkValue(int line); + int MarkerNext(int lineStart, int mask) const; int AddMark(int line, int marker, int lines); void MergeMarkers(int pos); bool DeleteMark(int line, int markerNum, bool all); diff --git a/test/simpleTests.py b/test/simpleTests.py index a6345d3f4..71dab4389 100644 --- a/test/simpleTests.py +++ b/test/simpleTests.py @@ -674,6 +674,7 @@ class TestMarkers(unittest.TestCase): self.ed.MarkerDeleteAll(-1) def testMarkerNext(self): + self.assertEquals(self.ed.MarkerNext(0, 2), -1) h1 = self.ed.MarkerAdd(0,1) h2 = self.ed.MarkerAdd(2,1) self.assertEquals(self.ed.MarkerNext(0, 2), 0) diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 00e0bf576..3317dc0d3 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -2949,7 +2949,7 @@ LRESULT ListBoxX::WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam return ::DefWindowProc(hWnd, iMessage, wParam, lParam); case WM_MOUSEWHEEL: - wheelDelta -= GET_WHEEL_DELTA_WPARAM(wParam); + wheelDelta -= static_cast<short>(HIWORD(wParam)); if (abs(wheelDelta) >= WHEEL_DELTA) { int nRows = GetVisibleRows(); int linesToScroll = 1; |