Mercurial > ~dholland > hg > ag > index.cgi
diff anagram/vaclgui/multiline.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/multiline.cpp Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,124 @@ +/* + * AnaGram, A System for Syntax Directed Programming + * Copyright 1997-2002 Parsifal Software. All Rights Reserved. + * See the file COPYING for license and usage terms. + * + * multiline.cpp + */ + +#include <icoordsy.hpp> +#include <ifont.hpp> +//#include <istring.hpp> +#include <windows.h> + +#include "multiline.hpp" + +//#define INCLUDE_LOGGING +#include "log.h" + + +MultiLineText &MultiLineText::setText(const char *s) { + LOGSECTION("MultiLineText::setText"); + textString = s; + char *p = textString.pointer(); + nLines = 0; + while (p && *p) { + LOGV((int) p); + p = strchr(p, '\n'); + nLines++; + if (p == 0) { + break; + } + p++; + } + LOGV(nLines); + return *this; +} + +Boolean MultiLineText::paintWindow(IPaintEvent &event) { + LOGSECTION("MultiLineText::paintWindow"); + LOGV(event.rect().asString()); + LOGV(event.rect().movedBy(position()).asString()); + IPresSpaceHandle presSpaceHandle = event.presSpaceHandle(); + + font().beginUsingFont(presSpaceHandle); + + int lineWidth = size().width(); + + SetBkMode(presSpaceHandle, TRANSPARENT); + event.clearBackground(event.rect(),IGUIColor::dialogBgnd); + IPoint where(0, margin.height()); + int i; + int leading = font().maxSize().height() + font().externalLeading(); + //LOGV(leading); + char *p = textString.pointer(); + for (i = 0; i < nLines; i++) { + char *q = strchr(p, '\n'); + if (q) { + *q = 0; + } + char *t = p; + if (*t =='\v') { + t++; + } + int margin = (lineWidth - font().textWidth(t))/2; + where.setX(margin); + IPoint actualWhere = where; + if (ICoordinateSystem::isConversionNeeded()) { + actualWhere = ICoordinateSystem::convertToNative(where, size()); + actualWhere.setY(actualWhere.y() - leading); + } + event.drawText(p, actualWhere); + LOGV(p); + if (q) { + *q = '\n'; + } + p = q+1; + if (q) { + LOGV(p); + } + if (q && *p == '\v') { + LOGV(vTab); + where.setY(where.y() + vTab); + p++; + } + where.setY(where.y() + leading); + } + return true; +} + +ISize MultiLineText::calcMinimumSize() const { + LOGSECTION("MultiLineText::calcMinimumSize"); + char *p = textString.pointer(); + int maxWidth = 0; + IPoint where(0, 0); + int leading = font().maxSize().height() + font().externalLeading(); + for (int i = 0; i < nLines; i++) { + char *q = strchr(p, '\n'); + if (q) { + *q = 0; + } + int width = font().textWidth(p); + if (width > maxWidth) { + maxWidth = width; + } + LOGV(width); + LOGV(p); + if (q) { + *q = '\n'; + } + p = q+1; + if (q && *p == '\v') { + where.setY(where.y() + vTab); + p++; + } + where.setY(where.y() + leading); + } + //int enWidth = font().avgCharWidth(); + maxWidth += 2*margin.width(); + + ISize minSize(maxWidth, where.y() + 2*margin.height()); + LOGV(minSize.asString()); + return minSize; +} +