/*****************************************************************************
#   Copyright (C) 1994-2008 by David Gordon.
#   All rights reserved.                           
#                                                                           
#   This software is part of a beta-test version of the Consed/Autofinish
#   package.  It should not be redistributed or
#   used for any commercial purpose, including commercially funded
#   sequencing, without written permission from the author and the
#   University of Washington.
#   
#   This software is provided ``AS IS'' and any express or implied
#   warranties, including, but not limited to, the implied warranties of
#   merchantability and fitness for a particular purpose, are disclaimed.
#   In no event shall the authors or the University of Washington be
#   liable for any direct, indirect, incidental, special, exemplary, or
#   consequential damages (including, but not limited to, procurement of
#   substitute goods or services; loss of use, data, or profits; or
#   business interruption) however caused and on any theory of liability,
#   whether in contract, strict liability, or tort (including negligence
#   or otherwise) arising in any way out of the use of this software, even
#   if advised of the possibility of such damage.
#
#   Building Consed from source is error prone and not simple which is
#   why I provide executables.  Due to time limitations I cannot
#   provide any assistance in building Consed.  Even if you do not
#   modify the source, you may introduce errors due to using a
#   different version of the compiler, a different version of motif,
#   different versions of other libraries than I used, etc.  For this
#   reason, if you discover Consed bugs, I can only offer help with
#   those bugs if you first reproduce those bugs with an executable
#   provided by me--not an executable you have built.
# 
#   Modifying Consed is also difficult.  Although Consed is modular,
#   some modules are used by many other modules.  Thus making a change
#   in one place can have unforeseen effects on many other features.
#   It may takes months for you to notice these other side-effects
#   which may not seen connected at all.  It is not feasable for me to
#   provide help with modifying Consed sources because of the
#   potentially huge amount of time involved.
#
#*****************************************************************************/
#include    <Xm/Form.h>
#include    <Xm/MainW.h>
#include    <Xm/RowColumn.h>
#include    <Xm/TextF.h>
#include    <Xm/Text.h>
#include    <Xm/Label.h>
#include    <Xm/Xm.h>
#include    <Xm/PushB.h>
#include    <Xm/RowColumn.h>
#include    "guiapp.h"
#include    <stdio.h>
#include    <stdlib.h>
#include    "rwcstring.h"
#include    "rwcregexp.h"
#include    "bIsNumericMaybeWithWhitespace.h"
#include    "guiGetCommentForTag.h"
#include    "assert.h"
#include    "guicontigwin.h"
#include    "handleWindowManagerDelete2.h"
#include    <Xm/MwmUtil.h>
#include    "guiGetReferenceRead.h"
#include    "guiMultiContigNavigator.h"
#include    "hp_exception_kludge.h"
#include    "popupErrorMessage.h"



static void cbUserPushedCancel( Widget wid,
                                XtPointer pClientData,
                                XtPointer pCallData ) {

   guiGetReferenceRead* pGuiGetReferenceRead =
      (guiGetReferenceRead*) pClientData;
   
   TRY_CATCH_WRAPPER( delete pGuiGetReferenceRead; );
}


static void cbUserPushedOK( Widget wid,
                            XtPointer pClientData,
                            XtPointer pCallData ) {

   guiGetReferenceRead* pGuiGetReferenceRead =
      (guiGetReferenceRead*) pClientData;

   TRY_CATCH_WRAPPER( pGuiGetReferenceRead->userPushedOK() );

}







void guiGetReferenceRead :: userPushedOK() {


   char* szReadName = XmTextFieldGetString( widReadName_ );

   RWCString soReadName( szReadName );

   XtFree( szReadName ); 

   pLocFragRef_ = pContig_->pLocFragGetByName( soReadName );

   if ( !pLocFragRef_ ) {
      popupErrorMessage( "could not find read %s",
                         soReadName.data() );
      return;
   }

   // found the reference
   
   gotoList* pGotoList = new gotoList();

   pContig_->searchForHighQualityDiscrepanciesWithReference( pLocFragRef_,
                                                             pGotoList );


   // display the discrepancies

   RWCString soTitle = "Discrepancies with ";
   soTitle += pLocFragRef_->soGetName();

   pContigWin_->pGuiMultiContigNav_ =
      new guiMultiContigNavigator( soTitle,
                                "", // soColumnHeadings1
                                "", // soColumnHeadings2
                                50,
                                "",
                                NULL,
                                NULL,
                                widParent_,
                                pGotoList );
}

   

   

       

void guiGetReferenceRead :: createWindow() {

   int nArgs;
   Arg aArg[50];

   widPopupShell_ = XtVaCreatePopupShell(
       "reference",
       topLevelShellWidgetClass,
       widParent_,
       XmNtitle, (char*) "Enter Name of Reference Read",
       XmNnoResize, False,
       XmNautoUnmanage, False,
       XmNtransient, False,
       XmNdeleteResponse, XmDO_NOTHING,
       NULL );


   handleWindowManagerDelete2( widPopupShell_,
                               cbUserPushedCancel,
                               this );

   // form widget

   Widget widForm = XtVaCreateManagedWidget(
        "form",
        xmFormWidgetClass,
        widPopupShell_,
        XmNshadowThickness, 0,
        XmNborderWidth, 0,
        NULL );

   Widget widExplanation = XtVaCreateManagedWidget(
        "Enter Name of Reference Read",
        xmLabelWidgetClass,
        widForm,
        XmNtopAttachment, XmATTACH_FORM,
        XmNleftAttachment, XmATTACH_FORM,
        XmNrightAttachment, XmATTACH_FORM,
        NULL );

   Widget widWidgetOnTop = widExplanation;


   Widget widOKButton = XtVaCreateManagedWidget(
        "OK",
        xmPushButtonWidgetClass,
        widForm,
        XmNbottomAttachment, XmATTACH_FORM,
        XmNleftAttachment, XmATTACH_POSITION,
        XmNleftPosition, 35,
        XmNrightAttachment, XmATTACH_POSITION,
        XmNrightPosition, 45,
        NULL );

   XtAddCallback( widOKButton,
                  XmNactivateCallback,
                  cbUserPushedOK,
                  this );

   Widget widWidgetOnBottom = widOKButton;

   Widget widCancelButton = XtVaCreateManagedWidget(
        "Cancel",
        xmPushButtonWidgetClass,
        widForm,
        XmNbottomAttachment, XmATTACH_FORM,
        XmNleftAttachment, XmATTACH_POSITION,
        XmNleftPosition, 55,
        XmNrightAttachment, XmATTACH_POSITION,
        XmNrightPosition, 65,
        NULL );

   XtAddCallback( widCancelButton,
                  XmNactivateCallback,
                  cbUserPushedCancel,
                  this );

   widReadName_ = XtVaCreateManagedWidget(
        "Reference Read",
        xmTextFieldWidgetClass,
        widForm,
        XmNtopAttachment, XmATTACH_WIDGET,
        XmNtopWidget, widWidgetOnTop,
        XmNtopOffset, 10,
        XmNleftAttachment, XmATTACH_FORM,
        XmNbottomAttachment, XmATTACH_WIDGET,
        XmNbottomWidget, widWidgetOnBottom,
        XmNbottomOffset, 10,
        XmNcolumns, 50,
        NULL );

   XtPopup( widPopupShell_, XtGrabNone );

   bWindowCreated_ = true;

   XmProcessTraversal( widReadName_, XmTRAVERSE_CURRENT );

}


guiGetReferenceRead :: ~guiGetReferenceRead() {

   if ( bWindowCreated_ ) {
      XtPopdown( widPopupShell_ );

      XtDestroyWidget( widPopupShell_ );
   }
}