Mercurial > ~dholland > hg > ag > index.cgi
diff anagram/vaclgui/digset.cpp @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/anagram/vaclgui/digset.cpp Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,158 @@ +/* + * AnaGram, A System for Syntax Directed Programming + * Copyright 1997-2002 Parsifal Software. All Rights Reserved. + * See the file COPYING for license and usage terms. + * + * digset.cpp + */ + +//#include <iwindow.hpp> +#include <windows.h> + +#include "digset.hpp" + +//#define INCLUDE_LOGGING +#include "log.h" + + +DigSetter &DigSetter::setEvent(IPaintEvent &e) { + //LOGSECTION("DigSetter::setEvent", Log::off); + LOGSECTION_OFF("DigSetter::setEvent"); + event = &e; + presSpaceHandle = event->presSpaceHandle(); + SetBkMode(presSpaceHandle, TRANSPARENT); + + LOGV((int) event); + windowHeight = window->size().height(); + LOGV(currentStyleIndex); + if (currentStyleIndex == -1) { + return *this; + } + IFont &font = style[currentStyleIndex].font; + font.beginUsingFont(presSpaceHandle); + LOGV(windowHeight); + return *this; +} + + +DigSetter &DigSetter::closeEvent() { + if (currentStyleIndex == -1) { + return *this; + } + IFont &font = style[currentStyleIndex].font; + font.endUsingFont(presSpaceHandle); + return *this; +} + +DigSetter &DigSetter::measureDig(Dig &dig) { + LOGSECTION("DigSetter::measureDig"); + char *p = dig.text; + int length = dig.textLength; + char save = p[length]; + p[length] = 0; + IFont ¤tFont = style[dig.styleIndex].font; + dig.width = currentFont.textWidth(p); + p[length] = save; + int width = 0; + while (length--) { + width += currentFont.charWidth(*p++); + } + LOGV(dig.width) LCV(width); + return *this; +} + +DigSetter &DigSetter::setDig(const Dig &dig, int reverseVideo) { + LOGSECTION("DigSetter::setDig"); + char *p = dig.text; + int length = dig.textLength; + char save = p[length]; + p[length] = 0; + cint where = dig.where; + if (reverseVideo) { + reverse(makeHole(dig)); + } + if (dig.styleIndex != currentStyleIndex) { + if (currentStyleIndex >= 0) { + IFont &oldFont = style[currentStyleIndex].font; + oldFont.endUsingFont(presSpaceHandle); + } + currentStyleIndex = dig.styleIndex; + IFont ¤tFont = style[currentStyleIndex].font; + currentFont.beginUsingFont(presSpaceHandle); + } + IColor color = reverseVideo ? style[currentStyleIndex].color.bg() + : style[currentStyleIndex].color.fg(); + where.y -= style[currentStyleIndex].topToBaseline(); + event->drawText(p, IPoint(where.x, where.y), color); + + p[length] = save; + return *this; +} + +DigSetter::Hole DigSetter::makeHole(const Dig &dig) { + LOGSECTION("DigSetter::makeHole"); + IFont ¤tFont = style[dig.styleIndex].font; + ISize digSize(dig.width, currentFont.maxCharHeight()); + cint where = dig.where; + where.y -= currentFont.maxAscender(); + return Hole(where, digSize, dig.styleIndex); +} + +DigSetter &DigSetter::clear(const Hole &hole) { + //LOGSECTION("DigSetter::clear", Log::off); + LOGSECTION_OFF("DigSetter::clear"); + LOGV(hole.styleIndex); + cint where = hole.where; + cint size = hole.size; + const IRectangle rect(IPoint(where.x, where.y), + ISize(hole.size.x, hole.size.y)); + event->clearBackground(rect, style[hole.styleIndex].color.bg()); + return *this; +} + +DigSetter &DigSetter::reverse(const Hole &hole) { + //LOGSECTION("DigSetter::reverse", Log::off); + LOGSECTION_OFF("DigSetter::reverse"); + LOGV(hole.styleIndex); + cint where = hole.where; + cint size = hole.size; + LOGV(where) LCV(size); + const IRectangle rect(IPoint(where.x, where.y), + ISize(hole.size.x, hole.size.y)); + event->clearBackground(rect, style[hole.styleIndex].color.fg()); + return *this; +} + +DigSetter &DigSetter::clear(const IRectangle &r) { + Hole hole(r); + clear(hole); + return *this; +} + + +DigSetter &DigSetter::refresh(const Hole &hole) { + //LOGSECTION("refresh hole", Log::off); + LOGSECTION_OFF("refresh hole"); + cint where = hole.where; + cint size = hole.size; + LOGV(where) LCV(size); + const IRectangle rect(IPoint(where.x, where.y), + ISize(hole.size.x, hole.size.y)); + LOGV(rect.asString()); + LOGV((int) event) LCV(hole.styleIndex); + window->refresh(rect); + return *this; +} + +DigSetter &DigSetter::refresh(const Dig &dig) { + //LOGSECTION("refresh dig", Log::off); + LOGSECTION_OFF("refresh dig"); + cint where(dig.where.x, top(dig)); + cint size(dig.width, bottom(dig) - where.y); + LOGV(where) LCV(size); + const IRectangle rect(IPoint(where.x, where.y), ISize(size.x, size.y)); + LOGV(rect.asString()); + LOGV((int) event) LCV(dig.styleIndex); + window->refresh(rect); + return *this; +}