view anagram/vaclgui/agview.hpp @ 15:f5acaf0c8a29

Don't cast through "volatile int". Causes a gcc warning nowadays. XXX: should put something else back here to frighten the optimizer
author David A. Holland
date Tue, 31 May 2022 01:00:55 -0400
parents 13d2b8934445
children
line wrap: on
line source

/*
 * AnaGram, A System for Syntax Directed Programming
 * Copyright 1997-2002 Parsifal Software. All Rights Reserved.
 * See the file COPYING for license and usage terms.
 *
 * agview.hpp
 */

#ifndef AGVIEW_HPP
#define AGVIEW_HPP

#include <icanvas.hpp>
//#include <ictlevt.hpp>
//#include <iexcbase.hpp>
//#include <ifocshdr.hpp>
#include <ifont.hpp>
#include <ikeyevt.hpp>
#include <ikeyhdr.hpp>
#include <imousevt.hpp>
#include <imoushdr.hpp>
#include <imphdr.hpp>
#include <ipainevt.hpp>
#include <ipainhdr.hpp>
//#include <irefcnt.hpp>
#include <iscrlevt.hpp>
#include <iscrlhdr.hpp>
#include <iscroll.hpp>
//#include <isizeevt.hpp>
#include <isizehdr.hpp>
#include <istattxt.hpp>
#include <itimer.hpp>
//#include <ititle.hpp>
//#include <windows.h>

#include "agnotify.h"
#include "cint.h"
#include "frame.hpp"
#include "base.h"


class ColorSpec;

class AgFocusHandler : public IHandler {
  virtual Boolean gotFocus(IEvent &) { return false; }
  virtual Boolean lostFocus(IEvent &) { return false; }
  virtual Boolean dispatchHandlerEvent(IEvent &);
};

class AgStaticText
  : public IStaticText
{
public:
  AgStaticText(IWindow *owner)
    : IStaticText(nextChildId(), owner, owner, IRectangle(), 
		  classDefaultStyle | tabStop)
  {}
  AgStaticText(int id, IWindow *a, IWindow *b)
    : IStaticText(id, a, b, IRectangle(), 
		  classDefaultStyle | tabStop)
  {}
  AgStaticText &scrollWindow(IPoint distance);
};

class AgColumnHead
  : public IStaticText
  , public IPaintHandler
{
private:
  int nCols;
  int *tabs;
  int margin;
  //int yBias;

public:
  AgString title;

  AgColumnHead(int id, IWindow *parent);
  ~AgColumnHead();
  void setTitles(int, AgString);
  void setMargin(int);
  void setPos(int);
  void setTabs(int *);
  Boolean paintWindow(IPaintEvent &event);
  int xPos;
  ColorSpec *color;
  AgNotificationAction<AgColumnHead> dataColorChange;
  void onColorChange() {refresh();}
};

class AgView
  : public ICanvas
  , public AgFocusHandler
  , public IKeyboardHandler
  , public IMousePointerHandler
  , public IPaintHandler
  , public IResizeHandler
  , public IScrollHandler
{
public:

  static const int defaultWindowHeight;

  class MouseDragTimer : public ITimerFn {
  private:
    AgView *window;
    int mouseLine;
    int topLine;

  public:
    MouseDragTimer(AgView *, int, int);
    void timerExpired(unsigned long timerId);
  };

  // Constructor
  AgView(IWindow *);

  // Destructor
  ~AgView();

  AgView &enableCursor(int flag = true);
  AgView &enableCursorBar(int flag = true);
  virtual Boolean gotFocus(IEvent &);
  virtual Boolean lostFocus(IEvent &);
  void    mouseDragTimerInterrupt(int &topLine, int mouseLine);

  virtual ISize    suggestSize();
  AgColumnHead       columnHeadTitle;

public:
  // Layout functions
  virtual ICanvas &layout();
  virtual ICanvas &setLayoutDistorted(unsigned long, unsigned long);
  virtual AgView &doLayout();
  virtual Boolean windowResize(IResizeEvent &);
  //virtual AgView &repositionWindow();
  int lineHeight() {
    return font().externalLeading() + font().maxSize().height();
  }
  int maxCharWidth() { return font().maxSize().width(); }
  int avgCharWidth() { return font().avgCharWidth(); }
  int maxDescender() { return font().maxDescender(); }
  AgView &repaintLine(int);
  virtual int findMaxWidth(void);

  // Handler functions

  // Keyboard handler
  Boolean virtualKeyPress(IKeyboardEvent &);

  // Mouse handler
  virtual Boolean mouseClicked(IMouseClickEvent &event);
  virtual Boolean mouseMoved(IMouseEvent &event);
  void    dragMouse(int topLine, int mouseLine);

  Boolean          mouseDown;
  ITimer           mouseTimer;
  int              mouseDownCursorLine;

  // Paint handler
  virtual Boolean paintWindow(IPaintEvent &);

  // Scroll handler
  virtual Boolean lineDown(IScrollEvent &);
  virtual Boolean lineLeft(IScrollEvent &);
  virtual Boolean lineRight(IScrollEvent &);
  virtual Boolean lineUp(IScrollEvent &);
  virtual Boolean pageDown(IScrollEvent &);
  virtual Boolean pageLeft(IScrollEvent &);
  virtual Boolean pageRight(IScrollEvent &);
  virtual Boolean pageUp(IScrollEvent &);
  virtual Boolean scrollBoxTrack(IScrollEvent &);
  virtual Boolean scrollBoxTrackEnd(IScrollEvent &event) {
    return scrollBoxTrack(event);
  }

  // Virtual functions: Access to data
  virtual AgString getLine(unsigned) { return AgString(); }
  virtual unsigned nLines() { return 0; }
  virtual unsigned nColumns() { return 1; }
  virtual AgString headTitle() { return AgString(); }
  virtual AgString columnTitleText() { return AgString(); }
  virtual AgString footTitle() { return AgString(); }

  //virtual const IColor getColor(ColorCode code) = 0;

  //Notification overridables

  AgAction enterAction;
  void setEnterAction(AgAction action) { enterAction = action; }
  virtual void onEnter() { enterAction.performDeferred(); }

  AgAction selectAction;
  void setSelectAction(AgAction action) { selectAction = action; }
  virtual void onSelect() { selectAction.performDeferred(); }

  AgView &AgView::updateCursor(int);
  AgView &AgView::updateCursor();
  AgView &AgView::reposition();
  AgView &AgView::repaintCursor(int line);

  void checkFocus(void);

  cint            cursorLocation;
  cint            pixelCursor;

  AgView &cursorOn();
  AgView &cursorOff();
  virtual AgView &setCursorLocation(cint loc);
  virtual AgView &scrollTo(cint loc);
  virtual cint getCursorLocation() { return cursorLocation; }

  AgView &hideCursor();
  AgView &showCursor();
  AgView &setCursorPos(cint);

  int cursorHideCount;

  int layoutActive;

  virtual Boolean  findNext(AgString) { return false; }
  virtual Boolean  findPrev(AgString) { return false; }

protected:
  // child windows
  ICanvas          dataHole;
  IScrollBar       horizontalScrollBar;
  IScrollBar       verticalScrollBar;

  //ColorUsage dataUsage;
  //ColorUsage activeCursorUsage;
  //ColorUsage inactiveCursorUsage;

  ColorSpec *color;
  ColorSpec *cursorColor;

  AgNotificationAction<AgView> dataColorChange;
  void onColorChange() { refresh(); }

public:
  AgStaticText      dataArea;

  // window parameters
  int windowId;
  IWindow *ownerWindow;
  AgFrame *frameWindow;
  AgView &setFrame(AgFrame *f) { frameWindow = f; return *this; }

  int             *tabArray;

  // layout state
  Boolean         vsbShowing;
  Boolean         hsbShowing;
  int             columnHeadsPresent;
  int             columnHeadWidth;
  int             tableWidth;
  int             tableHeight;

  int             cursorEnabled;
  int             cursorLineHighlight;
  int             retainCursor;
  int             prevHorizontal;
  int             prevVertical;

  // window state
  int             cursorLine;
  int             rightButtonDown;

  AgView &setFocus() {
    dataArea.setFocus();
    return *this;
  }
  virtual int charPosition(int xPos, AgString line);
  virtual int xPosition(int charPos, AgString line);
  int charWidth[256];
};


extern int focusWindowId;


#endif /* AGVIEW_HPP */