Mercurial > ~dholland > hg > ag > index.cgi
diff anagram/vaclgui/helpview.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/helpview.hpp Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,331 @@ +/* + * AnaGram, A System for Syntax Directed Programming + * Copyright 1997-2002 Parsifal Software. All Rights Reserved. + * See the file COPYING for license and usage terms. + * + * helpview.hpp + */ + +#ifndef HELPVIEW_HPP +#define HELPVIEW_HPP + +#include <icanvas.hpp> +#include <iclipbrd.hpp> +#include <icmdevt.hpp> +#include <icmdhdr.hpp> +//#include <icoordsy.hpp> +//#include <idrawcv.hpp> +//#include <iexcbase.hpp> +#include <ifont.hpp> +//#include <igbundle.hpp> +//#include <iglist.hpp> +//#include <igrafctx.hpp> +//#include <igstring.hpp> +#include <ipainhdr.hpp> +#include <ipainevt.hpp> +#include <ikeyhdr.hpp> +#include <ikeyevt.hpp> +#include <imenuevt.hpp> +#include <imenuhdr.hpp> +#include <imoushdr.hpp> +#include <imousevt.hpp> +#include <ipopmenu.hpp> +//#include <irefcnt.hpp> +#include <iscroll.hpp> +#include <iscrlevt.hpp> +#include <iscrlhdr.hpp> +//#include <isizeevt.hpp> +//#include <isizehdr.hpp> +//#include <ititle.hpp> + +class AgString; // from agstring.h +#include "agbaltree.h" +#include "cint.h" +#include "dict.h" +#include "digset.hpp" +#include "frame.hpp" +#include "search.h" + + +#if 0 +struct HelpId { + int index; + HelpId(int x) : index(x) {} + HelpId() : index(0) {} + int operator < (const HelpId id) const { + int flag = stricmp(dict_str(help_dict, index), + dict_str(help_dict, id.index)); + if (flag) { + return flag < 0; + } + return strcmp(dict_str(help_dict, index), + dict_str(help_dict, id.index)) < 0; + + } + operator int () { return index; } +}; +#endif + +class HelpWord : public DigSetter::Dig { +public: + enum Style { textStyle, linkStyle, usedStyle, titleStyle }; + HelpWord() {} + HelpWord(char *, int, cint, Style index = textStyle); + HelpWord(const HelpWord &); + + //int link; + AgString linktopic; + + int indent : 1; + int forceBreak : 1; + int noBreak : 1; + int linkTraversed: 1; + int highlight : 1; + int bullet : 1; + void moveTo(cint where_) { where = where_; } + IRectangle rect(DigSetter::Style *style); + int operator < (const HelpWord &x) const { return this < &x; } +}; + + + +class DrawingArea + : public IStaticText + , public ICommandHandler + , public IMenuHandler + , public IMouseHandler + , public IPaintHandler + , public AgHelpHandler +{ +public: + DrawingArea(IWindow *, AgString); + ~DrawingArea(); + void reset(); + + ISize preferredSize; + int nLines; + int measure; + int spaceRequired; + IPopUpMenu popUpMenu; + + DrawingArea &initPopUp(); + DrawingArea &remeasureText(); + AgFrame *frameWindow; + + static AgBalancedTree<AgString> traversedLinks; + + char *highlightText; + int nHighlight; + DrawingArea &refreshWords(char *p, int n); + DrawingArea ©To(IClipboard &c); + + enum ButtonState { buttonIdle, buttonDown, waitingForClick }; + ButtonState rightButtonState; + +protected: + + Boolean DrawingArea::paintWindow(IPaintEvent &event); + Boolean command(ICommandEvent &event); + ISize calcMinimumSize() const; + + Boolean mouseClicked(IMouseClickEvent &event); + Boolean mouseMoved(IMouseEvent &event); + Boolean makePopUpMenu(IMenuEvent &event); + Boolean showHelp(IEvent &event); + + DrawingArea &measureText(); + AgString getHelpText(const char *topic); + AgArray<AgString> findLinks(AgString msg); + static AgArray<AgString> sortLinks(AgArray<AgString> links); + + virtual IFont font() const { + return FontSpec::help; + } + + int lineHeight() { + IFont &font = FontSpec::help; + return font.externalLeading() + font.maxSize().height(); + } + int maxCharWidth() { + IFont &font = FontSpec::help; + return font.maxSize().width(); + } + int avgCharWidth() { + IFont &font = FontSpec::help; + return font.avgCharWidth(); + } + int maxDescender() { + IFont &font = FontSpec::help; + return font.maxDescender(); + } + + DrawingArea &refreshLinks(); + void refreshAllLinks(); + + AgClassAction<DrawingArea> refreshAction; + +public: + AgString helpText; + AgString topic; + int myTextLength; + + AgStack<HelpWord> word; + int nWords; + static DigSetter::Style displayStyle[4]; + DigSetter setter; + int painting; + +private: + int fingerCursorSet; + IPointerHandle fingerCursor; + + IFont windowFont; + int longestLine; + int margin; + int paraIndent; + int paraLeading; + int helpShowing; + + AgArray<AgString> links; + AgArray<AgString> sortedLinks; + AgArray<int> linkedWords; + //static AgDictionary<DrawingArea *> activeViews; + static AgBalancedTree<DrawingArea *> activeViews; + + int charWidth[256]; +}; + +class AgHelpView + : public ICanvas + , public IKeyboardHandler + , public IResizeHandler + , public IScrollHandler +{ +public: + static const int defaultWindowHeight; + + // Constructor + AgHelpView(IWindow *, AgString); + + // Destructor + ~AgHelpView(); + + ISize suggestSize(); + + AgHelpView &layout(); + AgHelpView &doLayout(); + AgHelpView &repositionWindow(); + + DrawingArea dataArea; + + SearchProcess searchProcess; + + virtual Boolean findNext(AgString); + virtual Boolean findPrev(AgString); + AgHelpView &positionWords(char *p, int n); + AgHelpView ©To(IClipboard &c) { + dataArea.copyTo(c); + return *this; + } + +protected: + + // Layout functions + + int lineHeight() { + IFont &font = FontSpec::help; + return font.externalLeading() + font.maxSize().height(); + } + int maxCharWidth() { + IFont &font = FontSpec::help; + return font.maxSize().width(); + } + int avgCharWidth() { + IFont &font = FontSpec::help; + return font.avgCharWidth(); + } + int maxDescender() { + IFont &font = FontSpec::help; + return font.maxDescender(); + } + + Boolean windowResize(IResizeEvent &event); + ISize calcMinimumSize() const; + + // Handler functions + + + // Keyboard handler + Boolean virtualKeyPress(IKeyboardEvent &); + + // Menu handler + + + // Scroll handler + + Boolean lineDown(IScrollEvent &); + Boolean lineUp(IScrollEvent &); + Boolean pageDown(IScrollEvent &); + Boolean pageUp(IScrollEvent &); + Boolean scrollBoxTrack(IScrollEvent &); + +private: + +public: + // child windows + IScrollBar verticalScrollBar; + + // window parameters + int windowId; + //IWindow *ownerWindow; + int highlightIndex; + + //layout state + Boolean vsbShowing; + int layoutActive; + + AgNotificationAction<AgHelpView> colorChange; + void onColorChange() { refresh(); } + AgNotificationAction<AgHelpView> fontChange; + void onFontChange(); +}; + +class AgHelpWindow + : public AgFrame +{ +public: + AgHelpWindow(AgString); + ~AgHelpWindow(); + + // otherwise the compiler complains this is hidden + virtual int showHelp(IEvent &e) { return AgFrame::showHelp(e); } + + static Boolean AgHelpWindow::showHelp(AgString topic); + static Boolean AgHelpWindow::showHelpCentered(AgString topic); + +//private: + AgString copyTitleText; + + // Child Windows + AgHelpView helpView; + +public: + AgHelpWindow &setFocus() { + helpView.setFocus(); + return *this; + } + virtual Boolean findNext(AgString s) { + return helpView.findNext(s); + } + virtual Boolean findPrev(AgString s) { + return helpView.findPrev(s); + } + AgHelpWindow ©To(IClipboard &c) { + helpView.copyTo(c); + return *this; + } + AgString copyTitle() { return copyTitleText.pointer(); }; +}; + + +#endif /* HELPVIEW_HPP */