/***************************************************************************** # 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 #include #include #include #include #include #include #include #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; }