view anagram/vaclgui/frame.hpp @ 7:57b2cc9b87f7

Use memcpy instead of strncpy when we know the length anyway. Modern gcc seems to think it knows how to detect misuse of strncpy, but it's wrong (in fact: very, very wrong) and the path of least resistance is to not try to fight with it.
author David A. Holland
date Mon, 30 May 2022 23:47:52 -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.
 *
 * frame.hpp
 */

#ifndef FRAME_HPP
#define FRAME_HPP

#include <iaccel.hpp>
//#include <icanvas.hpp>
#include <iclipbrd.hpp>
#include <icmdevt.hpp>
#include <icmdhdr.hpp>
#include <iframe.hpp>
#include <iframhdr.hpp>
#include <ikeyevt.hpp>
#include <ikeyhdr.hpp>
#include <imousevt.hpp>
#include <imoushdr.hpp>
//#include <imphdr.hpp>
#include <ipopmenu.hpp>
#include <isizeevt.hpp>
#include <isizehdr.hpp>
//#include <isysmenu.hpp>
#include <ititle.hpp>
//#include <windows.h>

#include "action.h"
#include "agarray.h"
#include "agstring.h"
#include "wdata.h"
#include "windowreg.h"


class AgFrame;

class AgHelpHandler : public IHandler {
public:
  AgHelpHandler &handleEventsFor(IWindow *control) {
    //LOGSECTION("AgHelpHandler::attach");
    //LOGV((int) control);
    IHandler::handleEventsFor(control);
    return *this;
  }
  AgHelpHandler &stopHandlingEventsFor(IWindow *control) {
    //LOGSECTION("AgHelpHandler::detach");
    //LOGV((int) control);
    IHandler::stopHandlingEventsFor(control);
    return *this;
  }
  Boolean dispatchHandlerEvent(IEvent &event);

protected:
  virtual Boolean showHelp(IEvent &event);// { return false; }
};

class AgUserHandler : public IHandler {
public:
  AgUserHandler &handleEventsFor(IWindow *control) {
    IHandler::handleEventsFor(control);
    return *this;
  }
  AgUserHandler &stopHandlingEventsFor(IWindow *control) {
    IHandler::stopHandlingEventsFor(control);
    return *this;
  }
  Boolean dispatchHandlerEvent(IEvent &event);
};

class HelpDemon
 : public AgHelpHandler
 , public IMouseHandler
{
private:
  IWindow *window;
  AgString topic;

public:
  HelpDemon(IWindow *w) : window(w) {}

  HelpDemon(IWindow *w, AgString t);
  ~HelpDemon();
  void setTopic(AgString t);

protected:
  virtual Boolean showHelp(IEvent &event);
  virtual Boolean mouseClicked(IMouseClickEvent &event);
};



class AgFrameHandler : public IFrameHandler {
protected:
  Boolean dispatchHandlerEvent(IEvent &event);

public:
  AgAction deactivateAction;
  AgFrameHandler &setDeactivateAction(AgAction action) {
    deactivateAction = action;
    return *this;
  }
  virtual void onDeactivate() {
    deactivateAction.performDeferred();
  }

  AgAction activateAction;
  AgFrameHandler &setActivateAction(AgAction action) {
    activateAction = action;
    return *this;
  }
  virtual void onActivate() {
    //LOGSECTION("AgFrameHandler::onActivate");
    activateAction.performDeferred();
  }

  Boolean activated(IFrameEvent &event);
  Boolean deactivated(IFrameEvent &event);
  AgFrameHandler()
    : activateAction(actionObject(this, onActivate))
    , deactivateAction(actionObject(this, onDeactivate))
  {}
};


class AgFrame
  : public IFrameWindow
  , public ICommandHandler
  , public IResizeHandler
  , public AgHelpHandler
  , public IKeyboardHandler
{
public:
  AgFrame(int);
  AgFrame();
  AgFrame(Style);
  virtual ~AgFrame();

  virtual AgFrame &show(Boolean showWindow = true);
  virtual AgFrame &setFocus();

  virtual void popUp();
  virtual void disconnect() {}

  virtual void registerTitle(AgString);
  static WindowRegistry windowRegistry;
  static AgArray<AgMenuItem> activeAuxMenu;
  static IPopUpMenu *activePopUpMenu;
  virtual void closeFrame();
  AgAction closeAction;


  AgUserHandler *userHandler;
  AgFrameHandler *frameHandler;
  virtual Boolean showHelp(IEvent &event);

  virtual AgFrame &positionFrame();

  virtual unsigned getLineNumber() { return 0; }
  virtual void     setLineNumber(unsigned) {}
  virtual Boolean  findNext(AgString) { return false; }
  virtual Boolean  findPrev(AgString) { return false; }
  virtual AgString copyTitle()    { return AgString(); }
  virtual AgFrame  &copyTo(IClipboard &) { return *this; }


  static int activeWindowCount;
  static AgFrame *activeWindow;
  static IWindow *frameParent;
  static IWindow *frameOwner;
  static int      menuShowingFlag;

  AgString helpTopic;
  void showHelpTopic();

protected:
  Boolean command(ICommandEvent &event);
  Boolean systemCommand(ICommandEvent &event);
  Boolean windowResize(IResizeEvent &event);
  Boolean characterKeyPress(IKeyboardEvent &event);
  Boolean virtualKeyPress(IKeyboardEvent &event);

public:
  // Child Windows
  ITitle          windowTitle;
  int             activeFlag;
  int             activationFlag;
  int             helpCursorSupported;

  IPoint          initialPosition;

  // Window parameters
  int             windowId;

  int syntaxDependent: 1;
  IFrameWindow    *modalDialog;

  virtual AgFrame &closeModalDialog() {
    if (modalDialog) modalDialog->close();
    return *this;
  }
  AgFrame &close();
  virtual AgFrame &mySetFocus();
  IAccelerator accelerator;
};

class AgDialog
  : public IFrameWindow
  , public ICommandHandler
  , public AgHelpHandler
{
public:
  AgDialog(IWindow *);
  virtual ~AgDialog();

  virtual Boolean showHelp(IEvent &event);
  Boolean systemCommand(ICommandEvent &event);

public:
  // Child Windows
  ITitle          windowTitle;

  // Window parameters
  int             windowId;
};


#endif /* FRAME_HPP */