/*****************************************************************************
#   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.
#
#*****************************************************************************/
//
// guiresize.cpp
//
// implementation for GuiContigWin class
//
// gordon 6-March-1995
//




#include <Xm/Xm.h>
#include <Xm/Form.h>
#include <Xm/DrawingA.h>
#include <Xm/ScrolledW.h>
#include <Xm/ScrollBar.h>

#include <iostream.h>
#include <string.h>
#include <stdio.h>

#include "motifutils.h"
#include "guiapp.h"
#include "guicontigwin.h"
#include "mbt_errors.h"
#include "numutil.h"
#include "consed.h"
#include "hp_exception_kludge.h"
#include "contigwin.h"



// catch widgets' resize events.  make sure the window resizes
// to an multiple of the char size, and update GuiContigWin members
void resizeXtCb(Widget widCw,
                GuiContigWin* pGcw,
                XmDrawingAreaCallbackStruct *pCb) {
   TRY_CATCH_WRAPPER(pGcw->guiResizeCallback( pCb ));
}


void GuiContigWin :: guiResizeCallback( XmDrawingAreaCallbackStruct *pCb )
{
 
   // initial callback has null window!
   if (! pCb->window) return;

   // get the window attributes
   XWindowAttributes xWinAttr;
   XGetWindowAttributes(XtDisplay(widContigWin_),
                        pCb->window,
                        &xWinAttr);

   pContigWin_->windowResized();

}


void GuiContigWin::resizeContigWindow(const int nWide,
                                    const int nHigh) {

   // compute new window width in pixels using current font size
   Dimension nPixelsWide = nBasesWideToPixelsWide( nWide );
   Dimension nPixelsHigh = nFragLinesToPixelsHigh( nHigh );

   // now set the resources of the contig win
   Arg aArg[10];
   int nArgs = 0;

   XtSetArg (aArg[nArgs], 
             XtNheight, 
             nPixelsHigh);  nArgs++; 
   XtSetArg (aArg[nArgs],
             XtNwidth,  
             nPixelsWide);  nArgs++;
   XtSetValues( widContigWin_, aArg, nArgs);

}


int GuiContigWin :: nGetContigWindowPixelWidth() const {

   Arg aArg[10];
   Dimension   nPixelsWide;

   int nArgs = 0;
   XtSetArg (aArg[nArgs],
             XtNwidth,  
             &nPixelsWide);    nArgs++;
   XtGetValues( widContigWin_, aArg, nArgs);

   return( (int) nPixelsWide );
}

   

int GuiContigWin :: nGetContigWindowPixelHeight() const {
   Arg aArg[10];
   Dimension   nPixelsHigh;

   int nArgs = 0;
   XtSetArg (aArg[nArgs],
             XtNheight,  
             &nPixelsHigh);    nArgs++;
   XtGetValues( widContigWin_, aArg, nArgs);
    return( (int) nPixelsHigh );
}


int GuiContigWin :: nGetDisplayedBasesWide()
{
   int  nPixelsWide = nGetContigWindowPixelWidth();

   int  nDisplayedBasesPixelsWide = 
     nPixelsWide - nFragmentBasesStartPixelX() + 1;

   int  nRoundUpDisplayedBasesWide = ( nDisplayedBasesPixelsWide +
     GuiApp::pGetGuiApp()->nGetFontWidth() - 1) / 
       GuiApp::pGetGuiApp()->nGetFontWidth();

   return (nRoundUpDisplayedBasesWide );
}



// note that this doesn't give any room for the sequencing direction
// separator

int GuiContigWin :: nGetDisplayedReadsHigh()
{
   int  nPixelsHigh = nGetContigWindowPixelHeight();

   int  nDisplayedReadsPixelsHigh = 
     nPixelsHigh - nForFragLineTopPixelY() + 1;

   // leave room for the direction separator

   nDisplayedReadsPixelsHigh -= nGetDirectionSepLineHeightPixels();

   int  nDisplayedReadsHigh =  nDisplayedReadsPixelsHigh  / 
       GuiApp::pGetGuiApp()->nGetFontHeight();

   return (nDisplayedReadsHigh );
}


// passed a number of forward and reverse lines, returns
// the required height of the drawing area.  note that this
// does not make use of member data describing what _is_
// on the screen.  avoids need to synchronize calls.
// chrisa 8-mar-95

int GuiContigWin :: nFragLinesToPixelsHigh(const int nLines) const {

   int nPix = 0;

   // contig stuff is always there
   nPix += nForFragLineTopPixelY();

   // direction separator line is always there
   nPix += nGetDirectionSepLineHeightPixels();

   // now add for each frag line
   nPix += nLines * GuiApp::pGetGuiApp()->nGetFontHeight();

   return nPix;

}