#include "ml.h"

Menu log_menu[] = {
  { NULL, "dismiss", NUL_TERM,
      lwin_dismiss, NULL, 0, NULL, NULL, BTN_ON },
  { NULL, "clear", NUL_TERM,
      lwin_clear, NULL, 0, NULL, NULL, BTN_ON },
};


#ifdef __STDC__
void create_log_window(LogWindow *lwin)
#else
void create_log_window(lwin)
     LogWindow *lwin;
#endif
{
  Arg args[ARGLISTSIZE];
  int n = 0;
  Widget form, menubar;
  XtTranslations translations;
  lwin->destroyed = FALSE;
  XtSetArg (args[n], XmNdeleteResponse, XmDO_NOTHING); n++;           
  lwin->shell = XtCreatePopupShell("log", 
				   topLevelShellWidgetClass,
				   session->shell, 
				   args,n);
  n = 0;
  AddDestroyCallback (lwin->shell);
  setup_editres(lwin->shell);

  if(note_icon != (Pixmap) None)
    XtVaSetValues(lwin->shell,
		  XmNiconPixmap,
		  note_icon,
		  NULL);

  form = XmCreateForm(lwin->shell, "form", args, n);            n = 0;
  XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM);           n ++;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);          n ++;
  XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);         n ++;
  menubar = XmCreateMenuBar(form,"menubar", args, n);           n = 0;
  XtManageChild(menubar);

  create_buttons(NULL, menubar, log_menu, XtNumber(log_menu), 
		 BTN_ON, (XtPointer) lwin, ROOTMENULEVEL);


  XtSetArg(args[n], XmNeditable, FALSE);                        n ++;
  XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT);            n ++;
  XtSetArg(args[n], XmNscrollVertical, TRUE);                   n ++; 
  XtSetArg(args[n], XmNscrollHorizontal, TRUE );                n ++;

  lwin->text =
    XmCreateScrolledText(form, "text", args, n);        n = 0;
  
  translations = XtParseTranslationTable(GLOBAL_text_translations);
  XtOverrideTranslations(lwin->text, translations);

  translations = XtParseTranslationTable(GLOBAL_messages_pop_translations);
  XtOverrideTranslations(lwin->text, translations);


  XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);         n ++;
  XtSetArg(args[n], XmNtopWidget, menubar);                     n ++;
  XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM);        n ++;
  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);          n ++;
  XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);         n ++;
  XtSetValues(XtParent(lwin->text), args, n);        n = 0;
  XtManageChild(lwin->text);

  XtAddCallback(lwin->shell, XmNdestroyCallback, 
		(XtCallbackProc) lwin_destroy, lwin);

  XtAddCallback(lwin->shell, XmNpopdownCallback, 
		(XtCallbackProc) lwin_popdown, lwin);


  XtManageChild(form);
  XtManageChild(lwin->shell);
  XtPopup(lwin->shell, XtGrabNone);
  lwin->is_realized = TRUE;

  return;
}

#ifdef __STDC__
void lwin_popdown(Widget w, LogWindow *lwin, XtPointer xp)
#else
void lwin_popdown(w, lwin, xp)
     Widget w;
     LogWindow *lwin;
     XtPointer xp;
#endif
{
  lwin->is_realized = FALSE;
  return;
}


#ifdef __STDC__
void lwin_dismiss(Widget w, LogWindow *lwin, XtPointer xp)
#else
void lwin_dismiss(w, lwin, xp)
     Widget w;
     LogWindow *lwin;
     XtPointer xp;
#endif
{
  XtPopdown(lwin->shell);
  lwin->is_realized = FALSE;
  return;
}

#ifdef __STDC__
void messages_pop(Widget w, LogWindow *lwin, XtPointer xp)
#else
void messages_pop(w, lwin, xp)
     Widget w;
     LogWindow *lwin;
     XtPointer xp;
#endif
{
  lwin_dismiss(w,session->lwin,NULL);
  return;
}



#ifdef __STDC__
void lwin_destroy(Widget w, LogWindow *lwin, XtPointer xp)
#else
void lwin_destroy(w, lwin, xp)
     Widget w;
     LogWindow *lwin;
     XtPointer xp;
#endif
{
  lwin->is_realized = FALSE;
  lwin->destroyed = TRUE;
  return;
}


#ifdef __STDC__
void lwin_popup(Widget w, LogWindow *lwin, XtPointer xp)
#else
void lwin_popup(w, lwin, xp)
     Widget w;
     LogWindow *lwin;
     XtPointer xp;
#endif
{
  if(lwin->is_realized == TRUE)
    de_iconify(lwin->shell);
  else {
    if(lwin->destroyed == TRUE)
      create_log_window(lwin);
    else {
      XtPopup(lwin->shell, XtGrabNone);
      lwin->is_realized = TRUE;
    }
  }
  return;
}

#ifdef __STDC__
void lwin_clear(Widget w, LogWindow *lwin, XtPointer xp)
#else
void lwin_clear(w, lwin, xp)
     Widget w;
     LogWindow *lwin;
     XtPointer xp;
#endif
{
  XmTextSetString(lwin->text, EMPTYSTR);
}

#ifdef __STDC__
void log_error(char *message, long warn)
#else
void log_error(message,warn)
     char *message;
     long warn;
#endif
{
  switch(warn) {
  case NIL:
  case BYE:
  case PARSE:
    break;
  default:
    XBell(display, 1000);
    lwin_popup(session->shell, session->lwin, NULL);
    XmUpdateDisplay(session->lwin->shell);
    break;
  }
  if(session->lwin->destroyed == TRUE)
    return;
  AppendText(session->lwin->text,message);
  XmUpdateDisplay(session->lwin->shell);
  return;
}




syntax highlighted by Code2HTML, v. 0.9.1