/*
 * This file contains routines to draw and update the screen.
 *
 * Copyright 1990 by the Massachusetts Institute of Technology.
 *
 * For copying and distribution information, please see the file
 * <mit-copyright.h>.
 *
 * Tom Coppeto
 * MIT Network Services
 * 8 August 1990
 *
 *    $Source: /afs/net.mit.edu/tools/src/xport/RCS/xstuff.c,v $
 *    $Author: tom $
 *    $Locker: tom $
 *    $Log:     xstuff.c,v $
 * Revision 1.2  90/08/19  16:19:18  tom
 * *** empty log message ***
 *
 * Revision 1.1  90/08/15  01:13:17  tom
 * Initial revision
 *
 */

#ifndef lint
static char *rcsid = "$Header: /afs/net.mit.edu/tools/src/xport/RCS/xstuff.c,v 1.2 90/08/19 16:19:18 tom Exp Locker: tom $";
#endif

#include <X11/Xatom.h>
#include <X11/IntrinsicP.h>
#include <X11/CompositeP.h>
#include <X11/StringDefs.h>
#include <X11/Shell.h>
#include <X11/Xaw/Paned.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Command.h>
#include <X11/Xaw/Toggle.h>
#include <X11/Xaw/Box.h>
#include <X11/Xaw/Viewport.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/StripChart.h>
#include <X11/Xaw/Cardinals.h>
#include <X11/Xaw/AsciiText.h>
#include <X11/cursorfont.h>
#include <X11/Xaw/Dialog.h>
#include <X11/cursorfont.h>
#include <X11/Xaw/MenuButton.h>
#include <X11/Xaw/SimpleMenu.h>
#include <X11/Xaw/Sme.h>
#include <X11/Xaw/SmeBSB.h>
#include <X11/Xaw/Repeater.h>
#include <X11/Xaw/ScrollbarP.h>
#include <X11/Xaw/Viewport.h>

#include <X11/Xtw/Frame.h>
#include <X11/Xtw/Rolo.h>
#include <rope.h>

#include "xrmonwatch.h"

extern XtAppContext app_con;
extern Widget toplevel;
static Widget IPpopup = (Widget) NULL;
static Widget ATpopup = (Widget) NULL;

static void create_row();
static void create_commands();
static Widget create_box();
static Widget create_form();

display_ip_panel(w)
{
  Widget box;
  Widget form;
  Widget rolo;

  if(IPpopup)
    {
      XtMapWidget(IPpopup);
      XRaiseWindow(XtDisplay(IPpopup), XtWindow(IPpopup));
      return;
    }

  IPpopup= XtCreatePopupShell("dpyPopup", 
			      topLevelShellWidgetClass, 
			      toplevel, NULL, 0);

  form = XtCreateManagedWidget("TCPIPFrame", frameWidgetClass, IPpopup, 
			       NULL, 0);
  rolo = create_form(form);

  /*
   * Ethernet box
   */

  box = create_box(rolo,  &parts[R_Ethernet]);
  create_row(box, &parts[R_EthernetType],        &parts[R_EthernetLength]);
  create_row(box, &parts[R_EthernetSrcAddress],  &parts[R_EthernetDstAddress]);
  create_row(box, &parts[R_EthernetSrcVendor],   &parts[R_EthernetDstVendor]);
  create_row(box, &parts[R_EthernetVersion],     &parts[R_EthernetMulticast]);
  
  /*
   * 802.2
   */

  box = create_box(rolo,  &parts[R_LLC]);
  create_row(box, &parts[R_LLCType],             &parts[R_LLCClass]);
  create_row(box, &parts[R_LLCFormat],           &parts[R_LLCCommand]);
  create_row(box, &parts[R_LLCSrcAddress],       &parts[R_LLCDstAddress]);
  create_row(box, &parts[R_LLCSrcAddrDesig],     &parts[R_LLCDstAddrDesig]);
  create_row(box, &parts[R_LLCSendSequence],     &parts[R_LLCRecvSequence]);
  create_row(box, &parts[R_LLCPFBit],            &parts[R_LLCCRIdentifier]);
  create_row(box, &parts[R_LLCSupervisoryBit],   &parts[R_LLCInformation]);

  /*
   * SNAP
   */

  box = create_box(rolo,  &parts[R_SNAP]);
  create_row(box, &parts[R_SNAPAddress],         &parts[R_SNAPNull]);

  /*
   * ARP
   */

  box = create_box(rolo,  &parts[R_ARP]);
  create_row(box, &parts[R_ARPSrcPhysicalAddress], 
	     &parts[R_ARPTargetPhysicalAddress]);
  create_row(box, &parts[R_ARPSrcVendor], 
	     &parts[R_ARPTargetVendor]);
  create_row(box, &parts[R_ARPSrcProtocolAddress],
	     &parts[R_ARPTargetProtocolAddress]);
  create_row(box, &parts[R_ARPSrcName],
	     &parts[R_ARPTargetName]);


  /*
   * IP
   */

  box = create_box(rolo,  &parts[R_IP]);
  create_row(box, &parts[R_IPVersion],           &parts[R_IPHeaderLength]);
  create_row(box, &parts[R_IPType],              &parts[R_IPLength]);
  create_row(box, &parts[R_IPFlags],	         &parts[R_IPFragmentOffset]);
  create_row(box, &parts[R_IPIdentification],    &parts[R_IPTTL]);
  create_row(box, &parts[R_IPProtocol],	         &parts[R_IPChecksum]);
  create_row(box, &parts[R_IPSrcAddress],        &parts[R_IPDstAddress]);
  create_row(box, &parts[R_IPSrcName],           &parts[R_IPDstName]);


  /*
   *  ICMP
   */
  
  box = create_box(rolo,  &parts[R_ICMP]);
  create_row(box, &parts[R_ICMPType],	         &parts[R_ICMPCode]);
  create_row(box, &parts[R_ICMPChecksum],	 &parts[R_ICMPIPHeader]);
  create_row(box, &parts[R_ICMPPointer],         &parts[R_ICMPGateway]);
  create_row(box, &parts[R_ICMPIdentifier],	 &parts[R_ICMPSequence]);
  create_row(box, &parts[R_ICMPOriginateTimestamp],
	     &parts[R_ICMPReceiveTimestamp]);
  create_row(box, &parts[R_ICMPTransmitTimestamp], &parts[R_ICMPData]);


  /*
   *  UDP
   */

  box = create_box(rolo,  &parts[R_UDP]);
  create_row(box, &parts[R_UDPChecksum],         &parts[R_UDPLength]);
  create_row(box, &parts[R_UDPSrcPort],          &parts[R_UDPDstPort]);
  create_row(box, &parts[R_UDPSrcPortName],      &parts[R_UDPDstPortName]);
                        

  /*
   *  Zephyr
   */

#ifdef ZEPHYR
  box = create_box(rolo,  &parts[R_Zephyr]);
  create_row(box, &parts[R_ZPacket],             &parts[R_ZVersion]);
  create_row(box, &parts[R_ZKind],               &parts[R_ZNull]);
  create_row(box, &parts[R_ZSender],             &parts[R_ZRecipient]);
  create_row(box, &parts[R_ZClass],              &parts[R_ZInstance]);
  create_row(box, &parts[R_ZOpcode],             &parts[R_ZNull]);
#endif /* ZEPHYR */
  
  /*
   *  TCP
   */

  box = create_box(rolo,  &parts[R_TCP]);
  create_row(box, &parts[R_TCPChecksum],	 &parts[R_TCPAck]);
  create_row(box, &parts[R_TCPSequence],	 &parts[R_TCPWindow]);
  create_row(box, &parts[R_TCPOffset],	         &parts[R_TCPUrgent]);
  create_row(box, &parts[R_TCPSrcPort],          &parts[R_TCPDstPort]);
  create_row(box, &parts[R_TCPSrcPortName],      &parts[R_TCPDstPortName]);
  create_row(box, &parts[R_TCPFlags],	         &parts[R_TCPNull]);

  create_commands(form, IPpopup);
  XtPopup(IPpopup, XtGrabNone);
  return;
}



display_at_panel(w)
{
  Widget form;
  Widget box;
  Widget rolo;

  if(ATpopup)
    {
      XtMapWidget(ATpopup);
      XRaiseWindow(XtDisplay(ATpopup), XtWindow(ATpopup));
      return;
    }

  ATpopup= XtCreatePopupShell("dpyPopup", 
			      topLevelShellWidgetClass, 
			      toplevel, NULL, 0);
  
  form = XtCreateManagedWidget("ATFrame", frameWidgetClass, ATpopup, NULL, 0);
  rolo = create_form(form);


  /*
   * Ethernet box
   */

  box = create_box(rolo,  &parts[R_Ethernet]);
  create_row(box, &parts[R_EthernetType],        &parts[R_EthernetLength]);
  create_row(box, &parts[R_EthernetSrcAddress],  &parts[R_EthernetDstAddress]);
  create_row(box, &parts[R_EthernetSrcVendor],   &parts[R_EthernetDstVendor]);
  create_row(box, &parts[R_EthernetVersion],     &parts[R_EthernetMulticast]);

  /*
   * 802.2
   */

  box = create_box(rolo,  &parts[R_LLC]);
  create_row(box, &parts[R_LLCType],             &parts[R_LLCClass]);
  create_row(box, &parts[R_LLCFormat],           &parts[R_LLCCommand]);
  create_row(box, &parts[R_LLCSrcAddress],       &parts[R_LLCDstAddress]);
  create_row(box, &parts[R_LLCSrcAddrDesig],     &parts[R_LLCDstAddrDesig]);
  create_row(box, &parts[R_LLCSendSequence],     &parts[R_LLCRecvSequence]);
  create_row(box, &parts[R_LLCPFBit],            &parts[R_LLCCRIdentifier]);
  create_row(box, &parts[R_LLCSupervisoryBit],   &parts[R_LLCInformation]);


  /*
   * SNAP
   */

  box = create_box(rolo,  &parts[R_SNAP]);
  create_row(box, &parts[R_SNAPAddress],         &parts[R_SNAPNull]);

  
  /*
   * AARP
   */

  box = create_box(rolo,  &parts[R_AARP]);
  create_row(box, &parts[R_AARPType],            &parts[R_AARPNull]);
  create_row(box, &parts[R_AARPHardwareType],	 &parts[R_AARPProtocolType]);
  create_row(box, &parts[R_AARPHardwareLength],  &parts[R_AARPProtocolLength]);
  create_row(box, &parts[R_AARPSrcHardwareAddress], 
	     &parts[R_AARPDstHardwareAddress]);
  create_row(box, &parts[R_AARPSrcProtocolAddress], 
	     &parts[R_AARPDstProtocolAddress]);



  /*
   * DDP
   */

  box = create_box(rolo,  &parts[R_DDP]);
  create_row(box, &parts[R_DDPLength],	         &parts[R_DDPHopCount]);
  create_row(box, &parts[R_DDPType],   	         &parts[R_DDPChecksum]);
  create_row(box, &parts[R_DDPSrcNetwork],	 &parts[R_DDPDstNetwork]);
  create_row(box, &parts[R_DDPSrcNode],	         &parts[R_DDPDstNode]);
  create_row(box, &parts[R_DDPSrcSocket],	 &parts[R_DDPDstSocket]);
  create_row(box, &parts[R_DDPSrcName],	         &parts[R_DDPDstName]);
  create_row(box, &parts[R_DDPSrcType],	         &parts[R_DDPDstType]);
  create_row(box, &parts[R_DDPSrcZone],	         &parts[R_DDPDstZone]);


  /*
   *  RTMP
   */

  box = create_box(rolo,  &parts[R_RTMP]);
  create_row(box, &parts[R_RTMPVersion],         &parts[R_RTMPFunction]);
  create_row(box, &parts[R_RTMPSrcNetwork],      &parts[R_RTMPSrcNode]);
  create_row(box, &parts[R_RTMPRangeStart],      &parts[R_RTMPRangeEnd]);
  create_row(box, &parts[R_RTMPDistance],        &parts[R_RTMPHops]);
  create_row(box, &parts[R_RTMPSrcNodeLength],   &parts[R_RTMPNetwork]);

  /*
   *  AEP
   */

  box = create_box(rolo,  &parts[R_AEP]);
  create_row(box, &parts[R_AEPType],	         &parts[R_AEPNull]);


  /*
   *  NBP
   */

  box = create_box(rolo,  &parts[R_NBP]);
  create_row(box, &parts[R_NBPType],	         &parts[R_NBPIdentification]);
  create_row(box, &parts[R_NBPTupleCount],       &parts[R_NBPNetwork]);
  create_row(box, &parts[R_NBPNode],             &parts[R_NBPSocket]);
  create_row(box, &parts[R_NBPObjectLength],     &parts[R_NBPObjectEntity]);
  create_row(box, &parts[R_NBPTypeLength],       &parts[R_NBPTypeEntity]);
  create_row(box, &parts[R_NBPZoneLength],       &parts[R_NBPZoneEntity]);
  create_row(box, &parts[R_NBPEnumerator],       &parts[R_NBPNull]);

  /*
   * ZIP
   */

  box = create_box(rolo,  &parts[R_ZIP]);
  create_row(box, &parts[R_ZIPNetworkCount],     &parts[R_ZIPNetwork]);
  create_row(box, &parts[R_ZIPZoneLength],       &parts[R_ZIPZone]);
  create_row(box, &parts[R_ZIPType],	         &parts[R_ZIPNull]);

  /*
   * ADSP
   */

  box = create_box(rolo,  &parts[R_ADSP]);
  create_row(box, &parts[R_ADSPConnId],          &parts[R_ADSPControlCode]);
  create_row(box, &parts[R_ADSPFirstSeq],        &parts[R_ADSPNextSeq]);
  create_row(box, &parts[R_ADSPWindow],          &parts[R_ADSPDescriptor]);

  create_commands(form, ATpopup);
  XtPopup(ATpopup, XtGrabNone);
  return;
}


new_header()
{
  

}




/*
 * for creating widgets
 */

static void
create_row(parent, left, right)
     Widget parent;
     struct PART *left;
     struct PART *right;
{
  Arg carg;
  Widget w;
  Widget t;
  char buf[100];

  sprintf(buf, "%sForm",   left->resource.s);
  w = XtCreateManagedWidget(buf, formWidgetClass, parent, NULL, 0);
  sprintf(buf, "%sLabel",  left->resource.s);
  XtSetArg(carg, XtNlabel, left->label.s);
  XtCreateManagedWidget(buf, labelWidgetClass,  w, &carg, 1);

  XtSetArg(carg, XtNstate, left->state);
  sprintf(buf, "%sToggle", left->resource.s);
  t = XtCreateManagedWidget(buf, toggleWidgetClass, w, &carg, 1);    
  XtAddCallback(t, XtNcallback, cb_chdisplay, &(left->state));

  XtSetArg(carg, XtNstate, right->state);   
  sprintf(buf, "%sToggle", right->resource.s);
  t = XtCreateManagedWidget(buf, toggleWidgetClass, w, &carg, 1);
  XtAddCallback(t, XtNcallback, cb_chdisplay, &(right->state));

  sprintf(buf, "%sLabel",  right->resource.s);
  XtSetArg(carg, XtNlabel, right->label.s);
  XtCreateManagedWidget(buf, labelWidgetClass,  w, &carg, 1);  
}


static Widget
create_box(parent, box)
     Widget parent;
     struct PART *box;
{
  Widget w;
  char buf[100];
  Arg args[2];

  XtSetArg(args[0], XtNlabel, box->label.s);
  w = XtCreateManagedWidget("selectForm", formWidgetClass, parent, args, 1);
  
  sprintf(buf, "%sLabel",  box->resource.s);
  XtSetArg(args[0], XtNlabel, box->label.s);
  XtCreateManagedWidget(buf, labelWidgetClass, w, args, 1);
  return(w);
}


static Widget
create_form(parent)  
     Widget parent;
{
  Widget w;
  Arg arg;

  w = XtCreateManagedWidget("rolo", roloWidgetClass, parent, NULL, 0);
  return(w);
}


static void
create_commands(parent, popup)  
     Widget parent;
     Widget popup;
{
  Widget b;
  Arg arg;

  b = XtwAddFrameCommand("commandClose", commandWidgetClass, parent, NULL, 0);
  XtAddCallback(b, XtNcallback, cb_close_popup, popup);
  return;
}
