/************************************************************************/
/* Copyright 1998 MBARI							*/
/************************************************************************/
#ifndef _ALARMLIST_H
#define _ALARMLIST_H
static char AlarmList_h_id[] = "$Header: /u/oreilly/rov/tmacs/RCS/AlarmList.h,v 1.4 1998/12/18 21:07:21 oreilly Exp $";

/*
$Log: AlarmList.h,v $
Revision 1.4  1998/12/18 21:07:21  oreilly
Added documentation

Revision 1.3  1997/10/03 09:24:30  oreilly
Use local SList iterator

 * Revision 1.2  97/05/30  15:43:56  15:43:56  oreilly (Thomas C. O'Reilly)
 * added sort()
 * 
 * Revision 1.1  96/10/28  09:13:13  09:13:13  oreilly (Thomas C. O'Reilly)
 * Initial revision
 * 
*/

#include <malloc.h>
#include <Vk/VkComponent.h>
#include "Alarm.h"
#include "SList.h"

#define EndOfList -1
#define TimeColumn 48

/*
CLASS 
AlarmList

DESCRIPTION
Displays attributes of Alarm objects in scrolling list

AUTHOR
Tom O'Reilly
*/
class AlarmList : public VkComponent
{
  public:
  
  AlarmList(const char *name, Widget parent, Priority priority);
  ~AlarmList()
  {
  }
  
  virtual const char *className()
  {
    return "AlarmList";
  }

  ///////////////////////////////////////////////////////////////////
  // Clear list
  void clear();
  
  ///////////////////////////////////////////////////////////////////
  // Return pointer to currently-selected alarm
  Alarm *selectedItem();

  ///////////////////////////////////////////////////////////////////
  // Return number of items currently in list
  int itemCount();

  ///////////////////////////////////////////////////////////////////
  // Return pointer to nth alarm in list
  Alarm *alarm(int n);

  ///////////////////////////////////////////////////////////////////
  // Append alarm to list
  void append(Alarm *alarm);
  
  ///////////////////////////////////////////////////////////////////
  // Remove specifed alarm from list
  int remove(Alarm *alarm);

  ///////////////////////////////////////////////////////////////////
  // Time-sort alarm list entries by time
  void sort();
  
  protected:
  Widget _listWidget;
  Widget _selectedItem;
  int _visibleItemCount;
  SList<Alarm *>_alarmList;
  Priority _priority;

  ///////////////////////////////////////////////////////////////////
  // Structure used in sorting list
  struct ListEntry
  {
    char *entryString;
    Alarm *alarm;
  };
  
  
  ///////////////////////////////////////////////////////////////////
  // Return position of specified alarm (0-based index)
  int entryPosition(Alarm *alarm);

  ///////////////////////////////////////////////////////////////////
  // Make string from specified alarm to display in list   
  XmString makeListString(Alarm *alarm);

  ///////////////////////////////////////////////////////////////////
  // Display info on item at specified (0-based) position in list
  void displaySelectedItem(int position);

  ///////////////////////////////////////////////////////////////////
  // Interface function for qsort
  static int timeCompare(const void *p1, const void *p2);
  
  private:
  static void listSelectCallback(Widget w, XtPointer clientData, 
				 XtPointer callData);
};


#endif
