/************************************************************************/
/* Copyright 1998 MBARI							*/
/************************************************************************/
#ifndef _PANASONICWVSETUP_H
#define _PANASONICWVSETUP_H
#include <Vk/VkApp.h>
#include <Vk/VkSimpleWindow.h>
#include <Vk/VkRadioBox.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 "CameraSetupDialog.h"
#include "DmGuiObject.h"
#include "DynamicLabel.h"


/*
CLASS 
PanasonicWVSetup

DESCRIPTION
GUI for Panasonic WV camera setup 

AUTHOR
Tom O'Reilly
*/
class PanasonicWVSetup : public DmGuiObject
{
  public:

  PanasonicWVSetup(const char *name, Widget parent, const char *dmPrefix);
  ~PanasonicWVSetup();
  
  virtual const char *className()
  {
    return "PanasonicWVSetup";
  }
  
  virtual void updateGui(DM_Item handle = 0);

  void writeColorBars();
  void writeIrisMode();
  void writeGainMode();
  void writeGain();
  void writeDetailMode();
  void writeShutter();
  void writeScene();
  void writeBalanceMode(Widget w);
  void writeBalance(Widget w, Int16 value);
  void writeAutoBalance(Widget w);
  void writeMenuMode(MBool set);
  void writeMenuCmd(Widget w, MBool set);
  
  static const int LowGain;
  static const int MedGain;
  static const int HighGain;
  static const int AutoIris;
  static const int ManualIris;
  static const int ColorBarsOn;
  static const int ColorBarsOff;
  
  protected:
  Widget _autoIris;
  Widget _colorBars;
  Widget _manualGainMode;
  Widget _manualBalanceMgr;
  Widget _autoBalanceMgr;
  Widget _redGain;
  Widget _blueGain;
  Widget _redPedestal;
  Widget _bluePedestal;
  Widget _totalPedestal;
  Widget _autoWhite;
  Widget _autoBlack;
  Widget _manualBalanceMode;
  Widget _menuMode;
  Widget _menuPage;
  Widget _menuItem;
  Widget _menuUp;
  Widget _menuDown;
  Widget _menuMgr;

  DynamicLabel *_redGainValue;
  DynamicLabel *_blueGainValue;
  DynamicLabel *_redPedestalValue;
  DynamicLabel *_bluePedestalValue;
  DynamicLabel *_totalPedestalValue;
  
  VkRadioBox *_gainMode;
  VkRadioBox *_gain;
  VkRadioBox *_sharpness;
  VkRadioBox *_balanceMode;
  VkOptionMenu *_shutter;
  VkOptionMenu *_scene;
  
  static VkMenuDesc _shutterMenuDesc[];
  static VkMenuDesc _sceneMenuDesc[];


  DmEnumObject *_dmGain;
  DmEnumObject *_dmGainMode;
  DmEnumObject *_dmSharpness;
  DmEnumObject *_dmShutter;
  DmEnumObject *_dmScene;
  DmEnumObject *_dmBalanceMode;
  DmEnumObject *_dmAutoBalance;
  DmBooleanObject *_dmColorBars;
  DmBooleanObject *_dmIrisMode;
  DmInt16Object *_dmRedPedestal;
  DmInt16Object *_dmBluePedestal;
  DmInt16Object *_dmTotalPedestal;
  DmInt16Object *_dmRedGain;
  DmInt16Object *_dmBlueGain;

  // On-screen menu control items
  DmBooleanObject *_dmMenuMode;
  DmBooleanObject *_dmMenuPage;
  DmBooleanObject *_dmMenuItem;
  DmBooleanObject *_dmMenuUp;
  DmBooleanObject *_dmMenuDown;
  
  Boolean _externalChange;
  
  
  private:

  static void gainModeCallback(Widget w, 
			       void *clientData, void *callData);

  static void gainSelectCallback(Widget w, 
				 void *clientData, void *callData);
  
  static void irisModeCallback(Widget w, 
			       XtPointer clientData, 
			       XtPointer callData);

  static void colorBarsCallback(Widget w, 
				XtPointer clientData, 
				XtPointer callData);

  static void sharpSelectCallback(Widget w, 
				  void *clientData, void *callData);

  static void balanceModeSelectCallback(Widget w, 
					void *clientData, void *callData);

  static void autoBalanceCallback(Widget w, 
				  void *clientData, void *callData);

  static void holdBalanceCallback(Widget w, 
				  void *clientData, void *callData);

  static void balanceAdjustCallback(Widget w, 
				    void *clientData, void *callData);

  static void shutterCallback(Widget w, 
			      void *clientData, void *callData);

  static void sceneCallback(Widget w, 
			    void *clientData, void *callData);

  static void menuModeCallback(Widget w, 
			       void *clientData, void *callData);

  static void menuCmdArmCallback(Widget w, 
				 void *clientData, void *callData);

  static void menuCmdDisarmCallback(Widget w, 
				    void *clientData, void *callData);

};


/*
CLASS 
PanasonicWVDialog

DESCRIPTION
Dialog which contains PanasonicWVSetup

AUTHOR
Tom O'Reilly
*/
class PanasonicWVDialog : public CameraSetupDialog
{
  public:
  PanasonicWVDialog(const char *name, const char *dmPrefix)
    : CameraSetupDialog(name, dmPrefix)
  {
  }
  
  ~PanasonicWVDialog()
  {
  }

  virtual void update();

  protected:

  virtual Widget createDialog(Widget parent);
  PanasonicWVSetup *_setup;
};

#endif
