/************************************************************************/
/* Copyright 1998 MBARI							*/
/************************************************************************/
#ifndef _VSPPAGE_H
#define _VSPPAGE_H

#include <Vk/VkOptionMenu.h>
/* Have to undef OK (which is #define'd by VxWorks stuff), since
VkGenericDialog.h has an enum symbol called "OK" */
#undef OK
#include <Vk/VkGenericDialog.h>

#include "DmGuiObject.h"
#include "VehicleComponent.h"
#include "array.h"
#include "MnemonicValue.h"

class VspPage;

/*
CLASS 
VspEntry

DESCRIPTION
Displays parameters of a Virtual Serial Port

AUTHOR
Tom O'Reilly
*/
class VspEntry : public DmGuiObject
{
  public:

  VspEntry(const char *name, Widget parent, const char *dmPrefix,
	   VspPage *vspPage);

  ~VspEntry();
  
  virtual const char *className()
  {
    return "VspEntry";
  } 

  virtual void updateGui(DM_Item handle = NULL);
  
  DmNat16Object *dmPort;
  DmNat16Object *dmBaud;
  DmNat16Object *dmDataBits;
  DmNat16Object *dmStopBits;
  DmNat16Object *dmParity;
  DmNat16Object *dmProtocol;
  DmNat16Object *dmBreak;
  DmBooleanObject *dmHandshake;
  

  protected:
  
  const char *_dmPrefix;

  Widget _port;
  Widget _baud;
  Widget _dataBitsStopBitsParity;
  Widget _handshake;
  Widget _protocol;
  Widget _breakButton;
  Pixel _armColor, _background, _lightEdgeColor, _darkEdgeColor;
  
  Boolean _breakArmed;

  VspPage *_vspPage;
  
  void breakControl(MBool sendBreak);


  private:
  
  static void breakCallback(Widget w, 
			    XtPointer clientData, 
			    XtPointer callData);

  static void editCallback(Widget w, 
			   XtPointer clientData, 
			   XtPointer callData);
};



/*
CLASS 
VspConfiguration

DESCRIPTION
GUI to set parameters of a Virtual Serial Port

AUTHOR
Tom O'Reilly
*/
class VspConfiguration : public VkComponent
{
  public:

  VspConfiguration(const char *name, Widget parent, const VspEntry *vspEntry);
  ~VspConfiguration();
  
  virtual const char *className()
  {
    return "VspConfiguration";
  }
  
  // Save configuration to data manager 
  int save();
  
  protected:

  VkOptionMenu *_baud;
  VkOptionMenu *_dataBits;
  VkOptionMenu *_stopBits;
  VkOptionMenu *_parity;
  VkOptionMenu *_protocol;
  VkOptionMenu *_handshake;
  
  const VspEntry *_vspEntry;
  

  VkOptionMenu *createMenu(const char *name, Widget parent, 
			   MnemonicValue *mnemonicValue);
  
};


/*
CLASS 
VspConfigDialog

DESCRIPTION
Dialog which contains VspConfiguration object

AUTHOR
Tom O'Reilly
*/
class VspConfigDialog : public VkGenericDialog
{
  public:

  VspConfigDialog(const char *name, const VspEntry *vspEntry);
  ~VspConfigDialog();
  
  static void okCallback(Widget w,
			 XtPointer clientData,
			 XtPointer callData);

  static void okayCallback(Widget w,
			   XtPointer clientData,
			   XtPointer callData);
  
  protected:

  virtual Widget createDialog(Widget parent);
  VspConfiguration *_configuration;
  const VspEntry *_vspEntry;
};



/*
CLASS 
VspPage

DESCRIPTION
Displays and manages VspEntry objects

AUTHOR
Tom O'Reilly
*/
class VspPage : public VkComponent
{
  public:
  
  VspPage(const char *name, Widget parent);
  ~VspPage();

  const char *className()
  {
    return "VspPage";
  }
  
  void createConfigDialog(const VspEntry *vspEntry);
  
  virtual void show();
  virtual void hide();
  
  static MnemonicValue baudMnemonicValue[];
  static MnemonicValue dataBitsMnemonicValue[];
  static MnemonicValue stopBitsMnemonicValue[];
  static MnemonicValue parityMnemonicValue[];
  static MnemonicValue protocolMnemonicValue[];
  static MnemonicValue handshakeMnemonicValue[];

  static int valueToIndex(MnemonicValue *mnemonicValue, int value);
  

  protected:

  XtIntervalId _timer;
  
  Widget _scrolledWindow;
  Widget _table;
  
  int checkForNewEntries();
  const char *getEntryName(const char *dmPrefix, VehicleComponent *parent);
  
  void startTimer();
  void stopTimer();
  
  DynArray<VspEntry *> _entries;

  VspConfigDialog *_configDialog;
  

  private:
  
  static void timerCallback(XtPointer clientData, XtIntervalId *id);

  static void saveCallback(Widget w,
			   XtPointer clientData,
			   XtPointer callData);
};


#endif
