view anagram/vaclgui/dspar.hpp @ 21:1c9dac05d040

Add lint-style FALLTHROUGH annotations to fallthrough cases. (in the parse engine and thus the output code) Document this, because the old output causes warnings with gcc10.
author David A. Holland
date Mon, 13 Jun 2022 00:04:38 -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.
 *
 * dspar.hpp
 */

#ifndef DSPAR_HPP
#define DSPAR_HPP

#include <icolor.hpp>
#include <iedithdr.hpp>
#include <ifont.hpp>
//#include <ifonthdr.hpp>
#include <imcelcv.hpp>
//#include <ipainevt.hpp>
#include <ipainhdr.hpp>
#include <ipushbut.hpp>
#include <isetcv.hpp>
#include <ispinhdr.hpp>
#include <ispinnum.hpp>
#include <istattxt.hpp>
//#include <iwindow.hpp>

class AgCharStack; // from agcstack.h
class AgString; // from agstring.h
struct cint; // from cint.h
#include "action.h"
#include "agnotify.h"
#include "agstack.h"
#include "frame.hpp"
#include "base.h"

struct ColorPair {
  IColor fg;
  IColor bg;
  ColorPair() : fg(0, 0, 0), bg(255, 255, 255) {}
  ColorPair(IColor fg_, IColor bg_) : fg(fg_), bg(bg_) {}
  AgString string();
  void setValue(char *s);
};

struct ColorSpec : public AgNotifier<ColorPair> {
  ColorPair defaultValue;
  ColorSpec(IColor fg, IColor bg)
    : AgNotifier<ColorPair>(ColorPair(fg, bg))
    , defaultValue(fg, bg)
  {}
  ColorSpec(const ColorSpec &s)
    : AgNotifier<ColorPair>(s.contents)
    , defaultValue(s.defaultValue)
  {}

  void set(ColorPair &p) { contents = p; }
  ColorPair &operator = (const ColorPair &p) {
    contents = p;
    notify();
    return contents;
  }

  AgString string() { return contents.string(); }

  IColor &fg() { return contents.fg; }
  IColor &bg() { return contents.bg; }
  int reset();


  static ColorSpec defaultSetting;
  static ColorSpec dialogBackground;


  static ColorSpec syntaxFile;
  static ColorSpec traceFileHilite;
  static ColorSpec traceFileScanned;
  static ColorSpec traceFileUnscanned;

  static ColorSpec columnHead;

  static ColorSpec activeTitle;
  static ColorSpec inactiveTitle;
  static ColorSpec data;

  static ColorSpec activeCursor;
  static ColorSpec inactiveCursor;

  static ColorSpec helpText;
  static ColorSpec helpLink;
  static ColorSpec helpUsedLink;
};

//typedef AgNotifier<IFont> AgNotifierFont;

struct FontSpec : public AgNotifier<IFont> {
private:
  IFont defaultFont;
  void initItalic() {
    contents.setItalic();
    defaultFont.setItalic();
  }

public:
  enum Style {
    normal = 0, italic = 1,
    bold = 2, boldItalic = 3,
    underscore = 4, strikeout = 8
  };

  void setStyle(Style style) {
    if (style & italic) {
     	contents.setItalic();
     	defaultFont.setItalic();
    }
    if (style & bold) {
     	contents.setBold();
     	defaultFont.setBold();
    }
    if (style & underscore) {
     	contents.setUnderscore();
     	defaultFont.setUnderscore();
    }
    if (style & strikeout) {
     	contents.setStrikeout();
     	defaultFont.setStrikeout();
    }
  }

  FontSpec(char *name, int size, Style style = normal)
    : AgNotifier<IFont>(IFont(name, size))
    , defaultFont(contents)
  {
    setStyle(style);
  }
  FontSpec(const FontSpec &f)
    : AgNotifier<IFont>(f)
    , defaultFont(f.defaultFont)
  {}
  FontSpec(Style style = normal)
    : AgNotifier<IFont>((IWindow *) 0)
  {
    setStyle(style);
  }
  operator IFont &() { return contents; }

  AgString string();

  IFont &operator = (const IFont &f) {
    contents = f;
    notify();
    return contents;
  }

  int reset();
  AgString description();
  static FontSpec defaultSetting;
  static FontSpec syntaxFile;
  static FontSpec traceFile;
  static FontSpec help;
  static FontSpec helpTitle;
  static FontSpec columnHead;
  static FontSpec dataTable;
  static FontSpec markedToken;
};

struct UndoButton : IPushButton {
  UndoButton(long id, IWindow *owner, IPushButton::Style style = visible)
    : IPushButton(id, owner, owner, IRectangle(), style)
  {
    setText("Undo");
    enableTabStop();
  }
};

struct DefaultButton : IPushButton {
  DefaultButton(long id, IWindow *owner, IPushButton::Style style = visible)
    : IPushButton(id, owner, owner, IRectangle(), style)
  {
    setText("Default");
    enableTabStop();
  }
};

struct OKButton : IPushButton {
  OKButton(long id, IWindow *owner, IPushButton::Style style = visible)
    : IPushButton(id, owner, owner, IRectangle(), style)
  {
    setText("OK");
    enableTabStop();
  }
};

struct CancelButton : IPushButton {
  CancelButton(long id, IWindow *owner, IPushButton::Style style = visible)
    : IPushButton(id, owner, owner, IRectangle(), style)
  {
    setText("Close");
    enableTabStop();
  }
};

struct HelpButton : IPushButton {
  HelpButton(long id, IWindow *owner, IPushButton::Style style = visible)
    : IPushButton(id, owner, owner, IRectangle(), style)
  {
    setText("Help");
    enableTabStop();
  }
};

class ColoredButton
  : public IPushButton
{
private:
  IColor fgColor;
  IColor bgColor;

public:
  ColoredButton(long id, IWindow *owner, ColorSpec *colorPair, char *text);
};


struct ButtonCanvas : ISetCanvas {
  ButtonCanvas(IWindow *owner)
    : ISetCanvas(nextChildId(), owner, owner, IRectangle(),
		   ISetCanvas::horizontalDecks
		 | ISetCanvas::packExpanded
		 | ISetCanvas::rightAlign
		 | ISetCanvas::topAlign
		 | IWindow::clipChildren
		 | IWindow::visible)
  {
    setDeckCount(1);
  }
};

class FontDialog
  : public AgFrame
  , public IPaintHandler
{
public:
  enum { nFontSpecs = 7 };

  struct UndoRecord {
    IPushButton *button; FontSpec *pointer; IFont font;
    int operator < (const UndoRecord &x) const { return pointer < x.pointer; }
  };

  struct SpecRecord { FontSpec *pointer; char *title; };

  struct OptionRecord {
    IStaticText *text; IPushButton *button;
    OptionRecord() : text(0), button(0) {}
    OptionRecord(IStaticText *t, IPushButton *b)
      : text(t), button(b)
    {}
    ~OptionRecord() { delete text; delete button; }
  };

  UndoRecord undoRecord;
  OptionRecord optionRecord[nFontSpecs];
  AgStack<UndoRecord> undoStack;

  static SpecRecord specRecord[nFontSpecs];
  static int idField(AgString name);
  static void initFont(int field, int flags, int size, AgString name);


  IMultiCellCanvas canvas;
    ISetCanvas fontChoices;
    ISetCanvas buttons;
      IPushButton undoButton;
      IPushButton defaultButton;
      IPushButton cancelButton;
      IPushButton helpButton;

  enum {
    undoCommand = nFontSpecs+1,
    defaultCommand,
    cancelCommand,
    helpCommand
  };

public:
  IWindowHandle dialogHandle;
  int fontDialogActive;
  FontDialog();
  ~FontDialog();
  Boolean command(ICommandEvent &);
  Boolean paintWindow(IPaintEvent &);
  //Boolean dispatchHandlerEvent(IEvent &e);
  virtual FontDialog &closeModalDialog();
  virtual FontDialog &mySetFocus();
  //IWindow *activeDialog;
  //virtual Boolean gotFocus(IEvent &) { activeDialog.setFocus(); }
  virtual void popUp();
  virtual void closeFrame();
  static void initFont(int flags, int size);
  static void stackSettings(AgCharStack &stack);
};

class RGBSelector
  : public ISetCanvas
  , public ISpinHandler
  , public IEditHandler
{
  INumericSpinButton redSpinner;
  INumericSpinButton greenSpinner;
  INumericSpinButton blueSpinner;
  IStaticText redText;
  IStaticText greenText;
  IStaticText blueText;
  AgAction changeAction;

public:
  RGBSelector &setChangeAction(AgAction action) {
    changeAction = action;
    return *this;
  }
  RGBSelector(IWindow *owner, IColor color);
  ~RGBSelector();
  IColor value() {
    return IColor(redSpinner.value(),
		  greenSpinner.value(),
		  blueSpinner.value());
  }
  Boolean spinEnded(IControlEvent &) { changeAction.perform(); return false; }
  //Boolean edit(IControlEvent &) { changeAction.perform(); return true; }
  Boolean edit(IControlEvent &);
};

class ColorDialog;

class ColorSelector
  : public AgDialog
  , public ISpinHandler
  , public IFrameHandler
  , public IPaintHandler
{
  enum { okCommand = 1, cancelCommand };
  ColorPair &colorPair;

  ColorDialog *ownerDialog;

  IMultiCellCanvas canvas;
    ISetCanvas workArea;
    		IStaticText sampleText;
    		ISetCanvas selectorCanvas;
      	 //	IStaticText fgText;
      		RGBSelector foregroundSelector;
      	 //	IStaticText bgText;
      		RGBSelector backgroundSelector;
    ButtonCanvas buttonCanvas;
      OKButton     okButton;
      CancelButton cancelButton;

public:
  //ColorSelector(ColorPair &);
  ColorSelector(ColorDialog *, ColorPair &);
  ~ColorSelector();
  Boolean command(ICommandEvent &event);
  Boolean activated(IFrameEvent &event);
  Boolean paintWindow(IPaintEvent &);
  void changeForeground() {
    sampleText.setForegroundColor(foregroundSelector.value()).refresh();
  }
  void changeBackground() {
    sampleText.setBackgroundColor(backgroundSelector.value()).refresh();
  }
};

class ColorDialog
  : public AgFrame
  , public IPaintHandler
{
public:
  enum { nColorSpecs = 12 };

  struct UndoRecord {
    int buttonNumber;
    ColorSpec *pointer;
    ColorPair colorPair;
    int operator < (const UndoRecord &r) const {
      return buttonNumber < r.buttonNumber;
    }
  };

  struct SpecRecord { ColorSpec *pointer; char *title; };

  UndoRecord undoRecord;
  ColoredButton *buttonList[nColorSpecs];
  AgStack<UndoRecord> undoStack;

  static SpecRecord specRecord[nColorSpecs];

  ISetCanvas canvas;
    ISetCanvas colorChoices;
    ButtonCanvas buttons;
      UndoButton undoButton;
      DefaultButton defaultButton;
      CancelButton cancelButton;
      HelpButton helpButton;

  enum {
    undoCommand = nColorSpecs+1,
    defaultCommand,
    cancelCommand,
    helpCommand
  };

public:
  ColorDialog();
  ~ColorDialog();
  Boolean command(ICommandEvent &);
  Boolean paintWindow(IPaintEvent &);
  static void ColorDialog::setColor(ColorPair p);
  static void ColorDialog::stackSettings(AgCharStack &);
  static void ColorDialog::initColor(AgString name, cint p);
};


#endif /* DSPAR_HPP */