Mercurial > ~dholland > hg > ag > index.cgi
diff anagram/vaclgui/digset.hpp @ 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.hpp Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,136 @@ +/* + * 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.hpp + */ + +#ifndef DIGSET_HPP +#define DIGSET_HPP + +#include <icolor.hpp> +#include <ifont.hpp> +#include <ipainevt.hpp> +//#include <ipoint.hpp> +#include <irect.hpp> + +#include "cint.h" +#include "dspar.hpp" + + +class DigSetter +{ +public: + struct Style { + FontSpec &font; + ColorSpec &color; + Style() + : color(ColorSpec::defaultSetting) + , font(FontSpec::defaultSetting) + {} + Style(FontSpec &f, ColorSpec &color_) + : font(f) + , color(color_) + {} + int enWidth() { + IFont &f = font; + return f.avgCharWidth(); + } + int height() { + IFont &f = font; + return f.maxSize().height(); + } + int topToBaseline() { + IFont &f = font; + return f.maxAscender(); + } + int descender() { + IFont &f = font; + return f.maxDescender(); + } + }; + + struct Dig { + char *text; + int textLength; + cint where; + int width; + int styleIndex; + Dig() {} + Dig(char *text_, const int length, const cint where_, const int index) + : text(text_) + , textLength(length) + , where(where_) + , styleIndex(index) + , width(0) + {} + Dig(const Dig &dig) + : text(dig.text) + , textLength(dig.textLength) + , where(dig.where) + , styleIndex(dig.styleIndex) + , width(dig.width) + {} + int operator < (const Dig &d) const { return where < d.where; } + }; + + struct Hole { + cint where; + cint size; + int styleIndex; + Hole() {} + Hole(cint where_, cint size_, int index) + : where(where_) + , size(size_) + , styleIndex(index) + {} + Hole(IRectangle r, int index = 0) + : where(r.minX(), r.minY()) + , size(r.size().width(), r.size().height()) + , styleIndex(index) + {} + int operator < (const Hole &d) const { return where < d.where; } + }; + +protected: + IWindow *window; + IPaintEvent *event; + Style *style; + int currentStyleIndex; + int windowHeight; + IPresSpaceHandle presSpaceHandle; + +public: + DigSetter(IWindow *window_, Style *style_, int index = -1) + : event(0) + , window(window_) + , style(style_) + , currentStyleIndex(index) + , windowHeight(0) + {} + + DigSetter &setEvent(IPaintEvent &e); + DigSetter &closeEvent(); + + int top(Dig d) { + return d.where.y - style[d.styleIndex].topToBaseline(); + } + int bottom(Dig d) { + return d.where.y + style[d.styleIndex].descender(); + } + + DigSetter &measureDig(Dig &dig); + DigSetter &setDig(const Dig &dig, int reverseVideo = 0); + DigSetter &clear(const Hole &hole); + DigSetter &reverse(const Hole &hole); + DigSetter &clear(const IRectangle &r); + + DigSetter &refresh(const Hole &hole); + DigSetter &refresh(const Dig &dig); + + Hole makeHole(const Dig &dig); +}; + + +#endif /* DIGSET_HPP */