/***************************************************************************** # 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 "guiTopWindow.h" #include #include #include #include #include #include #include #include #include #include #include "guiapp.h" #include #include "consed.h" #include "choose_contig.h" #include "guiSetGeneralPreferences.h" #include "guiSetPrimerPickingPreferences.h" #include "customNavigation.h" #include "guiUndoEdit.h" #include "assemblyView.h" #include "popupErrorMessage.h" #include "addNewReads.h" #include "hideSomeTagTypes.h" #include "hp_exception_kludge.h" #include "textbox.h" #include "consedResources.h" #include "navigateByTagsInAllContigs.h" #include "guiPopupDocumentation.h" #include "dErrorRateFromQuality.h" #include "dGetErrorsFixedAtBase.h" #include #include "please_wait.h" #include "guiChoiceOfReadsForAlignedReads.h" #include "rwcregexp.h" #include "guiFindRestrictionEnzymeSites.h" #include "guiEditResources.h" #include "guiRemoveReads.h" #include "miniassembly.h" #include "contigwin.h" #include "guiSearchForOligoTags.h" #include "guiSearchForTagsByComment.h" #include "guiNavigateByReadDepth.h" #include "soAddCommas.h" #include "bGuiGetAnswerYesNo.h" #include "guiNavigateByHighlyDiscrepantPositions.h" static void cbCloseAllWindows( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetConsEd()->closeAllWindows() ); } static void cbMiniassembly( Widget wid, XtPointer pClientData, XtPointer pCallData ) { guiTopWindow* pGuiTopWindow = (guiTopWindow*) pClientData; TRY_CATCH_WRAPPER( pGuiTopWindow->createMiniassemblyWindow() ); } static void cbSearchForOligoTagsByName( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( guiSearchForOligoTags* pGuiSearchForOligoTags = new guiSearchForOligoTags(); pGuiSearchForOligoTags->createWindow(); ); } static void cbSearchForTagsByComment( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( guiSearchForTagsByComment* pGuiSearchForTagsByComment = new guiSearchForTagsByComment(); pGuiSearchForTagsByComment->createWindow(); ); } static void cbMultipleHighQualityDiscrepancies( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->navigateByMultipleHighQualityDiscrepancies() ); } static void cbHighQualityDiscrepanciesInAllReads( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->navigateByHighQualityDiscrepanciesInAllReads( false ) ); // bExcludeSpuriousPads } static void cbHighQualityDiscrepanciesInAllReadsOmittingMostPads( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->navigateByHighQualityDiscrepanciesInAllReads( true ) ); // bExcludeSpuriousPads } static void cbSearchForHighDepthOfCoverageRegions( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( guiNavigateByReadDepth* pGuiNav = new guiNavigateByReadDepth(); pGuiNav->createWindow(); ); } static void cbNavigateByHighlyDiscrepantPositions( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( guiNavigateByHighlyDiscrepantPositions* pGuiNav = new guiNavigateByHighlyDiscrepantPositions(); pGuiNav->createWindow(); ); } static void cbEditConsedResources( Widget wid, XtPointer pClientData, XtPointer pCallData ) { guiTopWindow* pGuiTopWindow = (guiTopWindow*) pClientData; TRY_CATCH_WRAPPER( pGuiTopWindow->editConsedResources() ); } static void cbRecalculateConsensusValues( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->navigateByDifferenceBetweenRecalculatedAndOriginalConsensus() ); } static void cbPrintButton( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( GAPP->printWindow() ); } static void cbShowScaffoldsOfContigs( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->showScaffoldsOfContigs() ); } static void cbShowEditableLowConsensusQualityRegions( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->showEditableLowConsensusQualityRegions(); ); } static void cbShowRestrictionSites( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( guiFindRestrictionEnzymeSites* pRestriction = new guiFindRestrictionEnzymeSites(); pRestriction->getUsersAnswers(); ); } static void cbRemoveReads( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( guiRemoveReads* pRemove = new guiRemoveReads(); pRemove->createWindow(); ); } static void cbShowStopsCausingLCQs( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->showStopsCausingLCQs(); ); } static void cbShowRunsAndStopsCausingLCQs( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->showRunsAndStopsCausingLCQs(); ); } static void cbShowRunsCausingLCQs( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->showRunsCausingLCQs(); ); } static void cbUnalignedReads( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->navigateToUnalignedReads() ); } static void cbUnalignedBaseSegments( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->navigateToUnalignedBaseSegments() ); } static void cbShowDinucleotideRichRegions( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->showDinucleotideRichRegions(); ); } static void cbShowMononucleotideRichRegions( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->showMononucleotideRichRegions(); ); } static void cbShowMicrosatellites( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->showMicrosatellites(); ); } static void cbShowLibraryInfo( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->showLibraryInfo(); ); } static void cbShowVectorInsertJunctions( Widget wid, XtPointer pClientData, XtPointer pCallData ) { guiTopWindow* pGuiTopWindow = (guiTopWindow*) pClientData; TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->showTemplateInsertLocations() ); } static void cbShowAutofinishErrorsFixedFormula( Widget wid, XtPointer pClientData, XtPointer pCallData ) { guiTopWindow* pGuiTopWindow = (guiTopWindow*) pClientData; TRY_CATCH_WRAPPER( pGuiTopWindow->showAutoFinishErrorsFixedFormula() ); } static void cbShowAutofinishGoodModelRead( Widget wid, XtPointer pClientData, XtPointer pCallData ) { guiTopWindow* pGuiTopWindow = (guiTopWindow*) pClientData; TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->showAutofinishGoodModelRead(); ); } static void cbClearIncrementalSearchForRead( Widget wid, XtPointer pClientData, XtPointer pCallData ) { guiTopWindow* pGuiTopWindow = (guiTopWindow*) pClientData; XmTextSetString( pGuiTopWindow->widIncrementalSearchForRead_, "" ); XmTextSetString( pGuiTopWindow->widReadWithAsterisks_, "" ); } static void cbGuiShowDocumentation( Widget w, XtPointer client_data, XtPointer call_data) { TRY_CATCH_WRAPPER( new guiPopupDocumentation() ); } static void cbTestExceptionHandling( Widget wid, XtPointer pClientData, XtPointer pCallData ) { guiTopWindow* pGuiTopWindow = (guiTopWindow*) pClientData; TRY_CATCH_WRAPPER( pGuiTopWindow->testExceptionHandling() ); } static void cbAddNewReads( Widget wid, XtPointer pClientData, XtPointer pCallData ); static void cbWriteAllContigsToFastaFile( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->writeConsensusOfAllContigsToFastaFile() ); } static void cbHideSomeTagTypes( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( new hideSomeTagTypes( GuiApp::pGetGuiApp()->widGetTopLevel() ) ); } static void cbShowConsedResources( Widget wid, XtPointer pClientData, XtPointer pCallData ) { guiTopWindow* pGuiTopWindow = (guiTopWindow*) pClientData; TRY_CATCH_WRAPPER( pGuiTopWindow->showConsedResources(); ); } static void cbShowReadChemistries( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->showReadChemistries( ); ); } static void cbShowReadInfo( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->showReadInfo(); ); } static void cbShowTemplateQualityInfo( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->showTemplateQualityInfo(); ); } static void cbTagsInAllContigs( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( navigateByTagsInAllContigs(); ); } static void cbUserPressedReturnInReadWithAsterisks( Widget wid, XtPointer client_data, XtPointer call_data ) { guiTopWindow* pGuiTopWindow = (guiTopWindow *) client_data; TRY_CATCH_WRAPPER( pGuiTopWindow->userPressedReturnInReadWithAsterisks() ); } static void cbUserPressedReturnInEnterContigName( Widget wid, XtPointer pClientData, XtPointer pCallData ) { guiTopWindow* pGuiTopWindow = (guiTopWindow *) pClientData; TRY_CATCH_WRAPPER( pGuiTopWindow->userPressedReturnInEnterContigName() ); } static void cbReorderContigs( Widget wid, XtPointer pClientData, XtPointer pCallData ) { guiTopWindow* pGuiTopWindow = (guiTopWindow *) pClientData; TRY_CATCH_WRAPPER( pGuiTopWindow->userPressedReorderContigs() ); } static void cbNavigateByQuestionableConsensusBases( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd::pGetAssembly()->navigateByQuestionableConsensusBases() ); } guiTopWindow :: guiTopWindow() : bUserSingleClicked_(0) { // the immediate child of the application shell is a // main window widMainWin_ = XtVaCreateManagedWidget("mainwin", xmMainWindowWidgetClass, GuiApp::pGetGuiApp()->widGetTopLevel(), XmNancestorSensitive, True, NULL ); Arg aArg[50]; int nArgs; // create the main menu bar // // individual pulldown menus and pushbuttons are added later // using the addMenuItem() member function nArgs = 0; widMenuBar_ = XmCreateMenuBar(widMainWin_, "menubar", aArg, nArgs); XtManageChild(widMenuBar_); nArgs = 0; Widget widFileMenu = XmCreatePulldownMenu(widMenuBar_, "File", aArg, nArgs); // create the cascade button Widget widFileMenuCascadeButton = XtVaCreateManagedWidget("File", xmCascadeButtonWidgetClass, widMenuBar_, XmNsubMenuId, widFileMenu, NULL ); // Widget widOpenAssembly = XtVaCreateManagedWidget( "Open assembly...", // xmPushButtonWidgetClass, // widFileMenu, // NULL ); // // add a callback // XtAddCallback(widOpenAssembly, // XmNactivateCallback, // openAssemblyMenuItemCb, // NULL); // save a copy of the current edit Widget widSaveAssembly = XtVaCreateManagedWidget( "Save assembly", xmPushButtonWidgetClass, widFileMenu, NULL ); // add a callback XtAddCallback(widSaveAssembly, XmNactivateCallback, saveAssemblyMenuItemCb, NULL); Widget widExportAllContigsAsFasta = XtVaCreateManagedWidget( "Write all contigs to fasta file", xmPushButtonWidgetClass, widFileMenu, NULL ); XtAddCallback( widExportAllContigsAsFasta, XmNactivateCallback, cbWriteAllContigsToFastaFile, NULL ); // exit the application Widget widQuitConsed = XtVaCreateManagedWidget( "Quit Consed", xmPushButtonWidgetClass, widFileMenu, NULL ); XtAddCallback( widQuitConsed, XmNactivateCallback, quitConsedMenuItemCb, NULL ); nArgs = 0; Widget widNavigateMenu = XmCreatePulldownMenu(widMenuBar_, "Navigate", aArg, nArgs); // create the cascade button Widget widNavigateMenuCascadeButton = XtVaCreateManagedWidget("Navigate", xmCascadeButtonWidgetClass, widMenuBar_, XmNsubMenuId, widNavigateMenu, NULL ); Widget widCustomNavigation = XtVaCreateManagedWidget( "Custom Navigation", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widCustomNavigation, XmNactivateCallback, cbCustomNavigation, NULL ); Widget widTags = XtVaCreateManagedWidget( "Tags in All Contigs", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widTags, XmNactivateCallback, cbTagsInAllContigs, NULL ); // Widget widMicrosatellites = XtVaCreateManagedWidget( // "Microsatellites", // xmPushButtonWidgetClass, // widNavigateMenu, // NULL ); // XtAddCallback( widMicrosatellites, // XmNactivateCallback, // cbShowMicrosatellites, // NULL ); // Widget widShowMononucleotideRichRegions = // XtVaCreateManagedWidget( // "Mononucleotide-rich Regions", // xmPushButtonWidgetClass, // widNavigateMenu, // NULL ); // XtAddCallback( widShowMononucleotideRichRegions, // XmNactivateCallback, // cbShowMononucleotideRichRegions, // NULL ); // Widget widShowDinucleotideRichRegions = // XtVaCreateManagedWidget( "Low Complexity Regions", // xmPushButtonWidgetClass, // widNavigateMenu, // NULL ); // XtAddCallback( widShowDinucleotideRichRegions, // XmNactivateCallback, // cbShowDinucleotideRichRegions, // NULL ); // Widget widStopsCausingLCQs = XtVaCreateManagedWidget( // "Stops Causing LCQs", // xmPushButtonWidgetClass, // widNavigateMenu, // NULL ); // XtAddCallback( widStopsCausingLCQs, // XmNactivateCallback, // cbShowStopsCausingLCQs, // NULL ); // Widget widShowRunsCausingLCQs = // XtVaCreateManagedWidget( // "Runs and Microsatellites Causing LCQs", // xmPushButtonWidgetClass, // widNavigateMenu, // NULL ); // XtAddCallback( widShowRunsCausingLCQs, // XmNactivateCallback, // cbShowRunsCausingLCQs, // NULL ); Widget widRunsAndStopsCausingLCQs = XtVaCreateManagedWidget( "Runs, Microsatellites, and Stops Causing LCQs", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widRunsAndStopsCausingLCQs, XmNactivateCallback, cbShowRunsAndStopsCausingLCQs, NULL ); Widget widEditableLowConsensusQualityRegions = XtVaCreateManagedWidget( "Editable Low Consensus Quality Regions", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widEditableLowConsensusQualityRegions, XmNactivateCallback, cbShowEditableLowConsensusQualityRegions, NULL ); Widget widRecalculateConsensusValues = XtVaCreateManagedWidget( "Check Consensus and Quality Values", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widRecalculateConsensusValues, XmNactivateCallback, cbRecalculateConsensusValues, NULL ); Widget widUnalignedReads = XtVaCreateManagedWidget( "Unaligned Reads", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widUnalignedReads, XmNactivateCallback, cbUnalignedReads, NULL ); Widget widUnalignedBaseSegments = XtVaCreateManagedWidget( "Golden Path in Unaligned Part of Read", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widUnalignedBaseSegments, XmNactivateCallback, cbUnalignedBaseSegments, NULL ); Widget widHighQualityDiscrepanciesInAllReads = XtVaCreateManagedWidget( "High Quality Discrepancies in All Reads", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widHighQualityDiscrepanciesInAllReads, XmNactivateCallback, cbHighQualityDiscrepanciesInAllReads, NULL ); Widget widHighQualityDiscrepanciesInAllReadsOmittingMostPads = XtVaCreateManagedWidget( "High Quality Discrepancies but Omitting Most Pads", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widHighQualityDiscrepanciesInAllReadsOmittingMostPads, XmNactivateCallback, cbHighQualityDiscrepanciesInAllReadsOmittingMostPads, NULL ); Widget widMultipleHighQualityDiscrepancies = XtVaCreateManagedWidget( "Multiple High Quality Discrepancies", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widMultipleHighQualityDiscrepancies, XmNactivateCallback, cbMultipleHighQualityDiscrepancies, NULL ); Widget widSearchForTags = XtVaCreateManagedWidget( "Search for Oligo Tags By Name", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widSearchForTags, XmNactivateCallback, cbSearchForOligoTagsByName, NULL ); Widget widSearchForTagsByComment = XtVaCreateManagedWidget( "Search for Tags/Find String in Comment", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widSearchForTagsByComment, XmNactivateCallback, cbSearchForTagsByComment, NULL ); Widget widHighDepthOfCoverageRegions = XtVaCreateManagedWidget( "Search for High Depth of Coverage Regions", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widHighDepthOfCoverageRegions, XmNactivateCallback, cbSearchForHighDepthOfCoverageRegions, this ); Widget widHighlyDiscrepantPositions = XtVaCreateManagedWidget( "Search for Highly Discrepant Positions", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widHighlyDiscrepantPositions, XmNactivateCallback, cbNavigateByHighlyDiscrepantPositions, this ); Widget widConsensusQuestionable = XtVaCreateManagedWidget( "Search for Questionable Consensus Bases", xmPushButtonWidgetClass, widNavigateMenu, NULL ); XtAddCallback( widConsensusQuestionable, XmNactivateCallback, cbNavigateByQuestionableConsensusBases, this ); nArgs = 0; Widget widInfoMenu = XmCreatePulldownMenu(widMenuBar_, "Info", aArg, nArgs); // create the cascade button Widget widInfoMenuCascadeButton = XtVaCreateManagedWidget("Info", xmCascadeButtonWidgetClass, widMenuBar_, XmNsubMenuId, widInfoMenu, NULL ); Widget widShowConsedResources = XtVaCreateManagedWidget( "Show Current Consed Parameters", xmPushButtonWidgetClass, widInfoMenu, NULL ); XtAddCallback( widShowConsedResources, XmNactivateCallback, cbShowConsedResources, this ); Widget widShowXResources = XtVaCreateManagedWidget( "Show Default X Resources (may not be current)", xmPushButtonWidgetClass, widInfoMenu, NULL ); XtAddCallback( widShowXResources, XmNactivateCallback, showXResourcesMenuItemCb, NULL ); Widget widShowConsedVersion = XtVaCreateManagedWidget( "Show Consed Version", xmPushButtonWidgetClass, widInfoMenu, NULL ); XtAddCallback( widShowConsedVersion, XmNactivateCallback, showConsedVersionMenuItemCb, NULL ); Widget widShowWholeAssemblyItems = XtVaCreateManagedWidget( "Show Whole Assembly Items", xmPushButtonWidgetClass, widInfoMenu, NULL ); XtAddCallback( widShowWholeAssemblyItems, XmNactivateCallback, cbShowWholeAssemblyItems, NULL ); Widget widShowReadChemistries = XtVaCreateManagedWidget( "Show Chemistries of Reads", xmPushButtonWidgetClass, widInfoMenu, NULL ); XtAddCallback( widShowReadChemistries, XmNactivateCallback, cbShowReadChemistries, NULL ); Widget widShowReadInfo = XtVaCreateManagedWidget( "Show Info for Each Read", xmPushButtonWidgetClass, widInfoMenu, NULL ); XtAddCallback( widShowReadInfo, XmNactivateCallback, cbShowReadInfo, NULL ); Widget widShowTemplateQualityInfo = XtVaCreateManagedWidget( "Show Template Quality Info", xmPushButtonWidgetClass, widInfoMenu, NULL ); XtAddCallback( widShowTemplateQualityInfo, XmNactivateCallback, cbShowTemplateQualityInfo, NULL ); Widget widShowAutofinishGoodModelRead = XtVaCreateManagedWidget( "Show Autofinish Model Read", xmPushButtonWidgetClass, widInfoMenu, NULL ); XtAddCallback( widShowAutofinishGoodModelRead, XmNactivateCallback, cbShowAutofinishGoodModelRead, this ); Widget widShowAutofinishErrorsFixedFormula = XtVaCreateManagedWidget( "Show Autofinish Errors Fixed Formula", xmPushButtonWidgetClass, widInfoMenu, NULL ); XtAddCallback( widShowAutofinishErrorsFixedFormula, XmNactivateCallback, cbShowAutofinishErrorsFixedFormula, this ); Widget widShowTemplateInsertLocations = XtVaCreateManagedWidget( "Show Template Insert Locations", xmPushButtonWidgetClass, widInfoMenu, NULL ); XtAddCallback( widShowTemplateInsertLocations, XmNactivateCallback, cbShowVectorInsertJunctions, this ); Widget widShowLibraryInfo = XtVaCreateManagedWidget( "Show Library Info", xmPushButtonWidgetClass, widInfoMenu, NULL ); XtAddCallback( widShowLibraryInfo, XmNactivateCallback, cbShowLibraryInfo, this ); Widget widShowScaffoldsOfContigs = XtVaCreateManagedWidget( "Show Map of Contigs In Scaffolds", xmPushButtonWidgetClass, widInfoMenu, NULL ); XtAddCallback( widShowScaffoldsOfContigs, XmNactivateCallback, cbShowScaffoldsOfContigs, this ); nArgs = 0; Widget widOptionsMenu = XmCreatePulldownMenu(widMenuBar_, "Options", aArg, nArgs); // create the cascade button Widget widOptionsMenuCascadeButton = XtVaCreateManagedWidget("Options", xmCascadeButtonWidgetClass, widMenuBar_, XmNsubMenuId, widOptionsMenu, NULL ); Widget widGeneralPreferences = XtVaCreateManagedWidget( "General Preferences", xmPushButtonWidgetClass, widOptionsMenu, NULL ); XtAddCallback( widGeneralPreferences, XmNactivateCallback, generalPreferencesMenuItemCb, NULL ); Widget widPrimerPickingPreferences = XtVaCreateManagedWidget( "Primer Picking Preferences", xmPushButtonWidgetClass, widOptionsMenu, NULL ); XtAddCallback( widPrimerPickingPreferences, XmNactivateCallback, cbSetPrimerPickingPreferences, NULL ); Widget widHideSomeTagTypes = XtVaCreateManagedWidget( "Hide Some Tag Types", xmPushButtonWidgetClass, widOptionsMenu, NULL ); XtAddCallback( widHideSomeTagTypes, XmNactivateCallback, cbHideSomeTagTypes, this ); Widget widEditResources = XtVaCreateManagedWidget( "Edit Consed/Autofinish Parameters", xmPushButtonWidgetClass, widOptionsMenu, NULL ); XtAddCallback( widEditResources, XmNactivateCallback, cbEditConsedResources, this ); // create help menu button nArgs = 0; Widget widHelpMenu = XmCreatePulldownMenu( widMenuBar_, "Help", aArg, nArgs ); nArgs = 0; XtSetArg(aArg[nArgs], XmNsubMenuId, widHelpMenu); nArgs++; Widget widHelpCascade = XmCreateCascadeButton(widMenuBar_, "Help", aArg, nArgs); XtManageChild(widHelpCascade ); XtVaSetValues( widMenuBar_, XmNmenuHelpWidget, widHelpCascade, NULL ); Widget widShowConsedVersion2 = XtVaCreateManagedWidget( "Show Consed Version", xmPushButtonWidgetClass, widHelpMenu, NULL ); XtAddCallback( widShowConsedVersion2, XmNactivateCallback, showConsedVersionMenuItemCb, this ); Widget widShowDocumentation = XtVaCreateManagedWidget( "Show Complete Documentation", xmPushButtonWidgetClass, widHelpMenu, NULL ); XtAddCallback( widShowDocumentation, XmNactivateCallback, cbGuiShowDocumentation, this ); Widget widTestExceptionHandling = XtVaCreateManagedWidget( "Test Exception Handling", xmPushButtonWidgetClass, widHelpMenu, NULL ); XtAddCallback( widTestExceptionHandling, XmNactivateCallback, cbTestExceptionHandling, this ); // // create the form widget // nArgs = 0; XtSetArg(aArg[nArgs],XmNshadowThickness,0); nArgs++; XtSetArg(aArg[nArgs],XmNborderWidth,0); nArgs++; widForm_ = XmCreateForm(widMainWin_, "form", aArg, nArgs); XtManageChild(widForm_); widAssemblyName_ = XtVaCreateManagedWidget( "(no assembly)", xmTextWidgetClass, widForm_, XmNtopAttachment, XmATTACH_FORM, XmNeditable, false, XmNcursorPositionVisible, false, XmNtraversalOn, false, XmNcolumns, 50, XmNvalue, "(no assembly)", NULL ); widSearchForStringButton_ = XtVaCreateManagedWidget( "Search for String", xmPushButtonWidgetClass, widForm_, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, widAssemblyName_, XmNleftAttachment, XmATTACH_FORM, XmNalignment, XmALIGNMENT_BEGINNING, XmNtraversalOn, False, NULL ); XtAddCallback(widSearchForStringButton_, XmNactivateCallback, (XtCallbackProc )searchForStringButtonCb, this); widUndoEditButton_ = XtVaCreateManagedWidget( "Undo Edit...", xmPushButtonWidgetClass, widForm_, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, widAssemblyName_, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, widSearchForStringButton_, XmNalignment, XmALIGNMENT_BEGINNING, XmNtraversalOn, False, NULL ); XtAddCallback( widUndoEditButton_, XmNactivateCallback, (XtCallbackProc )cbUndoEditButton, this ); widPrintButton_ = XtVaCreateManagedWidget( "Print", xmPushButtonWidgetClass, widForm_, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, widAssemblyName_, XmNleftAttachment , XmATTACH_WIDGET, XmNleftWidget, widUndoEditButton_, XmNtraversalOn, False, NULL ); XtAddCallback( widPrintButton_, XmNactivateCallback, cbPrintButton, this ); widQuitButton_ = XtVaCreateManagedWidget( "Quit Consed", xmPushButtonWidgetClass, widForm_, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, widAssemblyName_, XmNrightAttachment, XmATTACH_FORM, XmNrightOffset, 8, XmNalignment, XmALIGNMENT_BEGINNING, XmNtraversalOn, False, NULL ); XtAddCallback(widQuitButton_, XmNactivateCallback, (XtCallbackProc )quitConsedButtonCb, this); widAssemblyViewButton_ = XtVaCreateManagedWidget( "Assembly View", xmPushButtonWidgetClass, widForm_, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, widSearchForStringButton_, XmNleftAttachment, XmATTACH_FORM, XmNalignment, XmALIGNMENT_BEGINNING, XmNtraversalOn, False, XmNsensitive, True, NULL ); XtAddCallback( widAssemblyViewButton_, XmNactivateCallback, (XtCallbackProc ) cbCreateAssemblyView, this ); widAddNewReadsButton_ = XtVaCreateManagedWidget( "Add New Reads", xmPushButtonWidgetClass, widForm_, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, widSearchForStringButton_, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, widAssemblyViewButton_, XmNalignment, XmALIGNMENT_BEGINNING, XmNtraversalOn, False, NULL ); XtAddCallback( widAddNewReadsButton_, XmNactivateCallback, (XtCallbackProc ) cbAddNewReads, this ); Widget widRestrictionSites = XtVaCreateManagedWidget( "Digests", xmPushButtonWidgetClass, widForm_, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, widSearchForStringButton_, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, widAddNewReadsButton_, XmNtraversalOn, False, NULL ); XtAddCallback( widRestrictionSites, XmNactivateCallback, cbShowRestrictionSites, NULL ); Widget widRemoveReads = XtVaCreateManagedWidget( "Remove Reads", xmPushButtonWidgetClass, widForm_, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, widSearchForStringButton_, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, widRestrictionSites, XmNtraversalOn, False, NULL ); XtAddCallback( widRemoveReads, XmNactivateCallback, cbRemoveReads, this ); Widget widMiniassembly = XtVaCreateManagedWidget( "Miniassembly", xmPushButtonWidgetClass, widForm_, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, widSearchForStringButton_, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, widRemoveReads, XmNtraversalOn, False, NULL ); XtAddCallback( widMiniassembly, XmNactivateCallback, cbMiniassembly, this ); XmString xmsInstructions = XmStringCreateLtoR( "Single Click and then Click OK or \nDouble Click to Select Contig", XmFONTLIST_DEFAULT_TAG ); Widget widLabelDoubleClick = XtVaCreateManagedWidget("Single Click and then Click OK or \nDouble Click to Select Contig", xmLabelWidgetClass, widForm_, XmNlabelString, xmsInstructions, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, widAssemblyViewButton_, XmNtopOffset, 20, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 20, NULL ); XmStringFree( xmsInstructions ); Widget widLabelContigList = XtVaCreateManagedWidget("Contig List", xmLabelWidgetClass, widForm_, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, widLabelDoubleClick, XmNtopOffset, 20, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 20, NULL ); widReorderContigsButton_ = XtVaCreateManagedWidget( "Reorder By # of Reads", xmPushButtonWidgetClass, widForm_, XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET, XmNbottomWidget, widLabelContigList, XmNrightAttachment, XmATTACH_FORM, XmNrightOffset, 20, NULL ); XtAddCallback( widReorderContigsButton_, XmNactivateCallback, cbReorderContigs, this ); nArgs = 0; XtSetArg( aArg[ nArgs ], XmNleftAttachment, XmATTACH_FORM ); ++nArgs; XtSetArg( aArg[ nArgs ], XmNrightAttachment, XmATTACH_FORM); ++nArgs; XtSetArg( aArg[ nArgs ], XmNleftOffset, 20); ++nArgs; XtSetArg( aArg[ nArgs ], XmNrightOffset, 20); ++nArgs; XtSetArg( aArg[ nArgs ], XmNtopAttachment, XmATTACH_WIDGET); ++nArgs; XtSetArg( aArg[ nArgs ], XmNtopWidget, widLabelContigList ); ++nArgs; XtSetArg( aArg[ nArgs ], XmNselectionPolicy, XmSINGLE_SELECT ); ++nArgs; XtSetArg( aArg[ nArgs ], XmNvisibleItemCount, 8 ); ++nArgs; widContigList_ = XmCreateScrolledList( widForm_, "ContigList", aArg, nArgs ); XtManageChild( widContigList_ ); XtAddCallback( widContigList_, XmNdefaultActionCallback, cbChooseContig, this ); XtAddCallback( widContigList_, XmNsingleSelectionCallback, cbChooseContigSingleClick, this ); Widget widEnterContigNameLabel = XtVaCreateManagedWidget( "You may type full contig name:", xmLabelWidgetClass, widForm_, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 20, NULL ); widEnterContigName_ = XtVaCreateManagedWidget( "contigName", xmTextWidgetClass, widForm_, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, widContigList_, XmNeditable, True, XmNcursorPositionVisible, True, XmNtraversalOn, True, XmNeditMode, XmSINGLE_LINE_EDIT, NULL ); XtAddCallback( widEnterContigName_, XmNactivateCallback, cbUserPressedReturnInEnterContigName, this ); // fancy trick to place the two widgets. First, connect // the label to the vertical placement of the textfield. Then // figure out the width of the label and set the horizontal // position of the textfield with respect to the label. XtVaSetValues( widEnterContigNameLabel, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopWidget, widEnterContigName_, XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET, XmNbottomWidget, widEnterContigName_, NULL ); Widget widAbove = widEnterContigName_; // now build up from bottom. I think the idea is so that the // read list is the last widget placed, and thus when the // window is enlarged, it is the read list that expands. (Jan 2004) widShowContigButton_ = XtVaCreateManagedWidget( "Show Contig", xmPushButtonWidgetClass, widForm_, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 40, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 60, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, 10, XmNtraversalOn, True, NULL ); XtAddCallback( widShowContigButton_, XmNactivateCallback, cbChooseContig, this ); widCloseAllWindows_ = XtVaCreateManagedWidget( "Close All Windows", xmPushButtonWidgetClass, widForm_, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 62, XmNrightPosition, 98, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, 10, XmNtraversalOn, False, NULL ); XtAddCallback( widCloseAllWindows_, XmNactivateCallback, cbCloseAllWindows, this ); Widget widIncrementalSearchForReadLabel = XtVaCreateManagedWidget( "Find 1st read above starting with: ", xmLabelWidgetClass, widForm_, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 20, NULL ); widIncrementalSearchForRead_ = XtVaCreateManagedWidget( "incremental search for read", xmTextWidgetClass, widForm_, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, widShowContigButton_, XmNbottomOffset, 20, XmNeditable, True, XmNcursorPositionVisible, True, XmNtraversalOn, True, XmNeditMode, XmSINGLE_LINE_EDIT, NULL ); XtVaSetValues( widIncrementalSearchForReadLabel, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopWidget, widIncrementalSearchForRead_, XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET, XmNbottomWidget, widIncrementalSearchForRead_, NULL ); XtAddCallback( widIncrementalSearchForRead_, XmNvalueChangedCallback, cbIncrementalSearchForRead, this ); XtAddCallback( widIncrementalSearchForRead_, XmNactivateCallback, cbUserPressedReturnInIncrementalSearchForRead, this ); Widget widReadWithAsterisksLabel = XtVaCreateManagedWidget( "Find reads containing (*'s allowed):", xmLabelWidgetClass, widForm_, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 20, NULL ); widReadWithAsterisks_ = XtVaCreateManagedWidget( "read with asterisks", xmTextWidgetClass, widForm_, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, widIncrementalSearchForRead_, XmNbottomOffset, 20, XmNeditable, True, XmNcursorPositionVisible, True, XmNtraversalOn, True, XmNeditMode, XmSINGLE_LINE_EDIT, NULL ); Dimension nWidth; XtVaGetValues( widReadWithAsterisksLabel, XmNwidth, &nWidth, NULL ); XtVaSetValues( widReadWithAsterisksLabel, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopWidget, widReadWithAsterisks_, XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET, XmNbottomWidget, widReadWithAsterisks_, NULL ); XtVaSetValues( widReadWithAsterisks_, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 20 + nWidth, NULL ); XtAddCallback( widReadWithAsterisks_, XmNactivateCallback, cbUserPressedReturnInReadWithAsterisks, this ); XtVaSetValues( widIncrementalSearchForRead_, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 20 + nWidth, //XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET, //XmNleftWidget, widReadWithAsterisks_, NULL ); XtVaSetValues( widEnterContigName_, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 20 + nWidth, NULL ); Widget widClear = XtVaCreateManagedWidget( "Clear", xmPushButtonWidgetClass, widForm_, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopWidget, widReadWithAsterisks_, XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET, XmNbottomWidget, widReadWithAsterisks_, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, widReadWithAsterisks_, XmNleftOffset, 20, XmNtraversalOn, False, XmNalignment, XmALIGNMENT_BEGINNING, NULL ); XtAddCallback( widClear, XmNactivateCallback, (XtCallbackProc) cbClearIncrementalSearchForRead, this ); // now create the fragment list box widNumberOfReads_ = XtVaCreateManagedWidget( "numberOfReads", xmTextFieldWidgetClass, widForm_, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, widAbove, XmNtopOffset, 20, XmNcolumns, 30, XmNeditable, False, XmNcursorPositionVisible, False, XmNtraversalOn, False, NULL ); Widget widLabelFragmentList = XtVaCreateManagedWidget( "# of Reads:", xmLabelWidgetClass, widForm_, XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET, XmNtopWidget, widNumberOfReads_, XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET, XmNbottomWidget, widNumberOfReads_, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 20, NULL ); Dimension dimWidth; XtVaGetValues( widLabelFragmentList, XmNwidth, &dimWidth, NULL ); XtVaSetValues( widNumberOfReads_, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, dimWidth + 10 + 20, XmNrightAttachment, XmATTACH_FORM, XmNrightOffset, 20, NULL ); widAbove = widNumberOfReads_; nArgs = 0; XtSetArg( aArg[ nArgs ], XmNleftAttachment, XmATTACH_FORM ); ++nArgs; XtSetArg( aArg[ nArgs ], XmNrightAttachment, XmATTACH_FORM); ++nArgs; XtSetArg( aArg[ nArgs ], XmNleftOffset, 20); ++nArgs; XtSetArg( aArg[ nArgs ], XmNrightOffset, 20); ++nArgs; XtSetArg( aArg[ nArgs ], XmNtopAttachment, XmATTACH_WIDGET ); ++nArgs; XtSetArg( aArg[ nArgs ], XmNtopWidget, widAbove ); ++nArgs; XtSetArg( aArg[ nArgs ], XmNbottomAttachment, XmATTACH_WIDGET); ++nArgs; XtSetArg( aArg[ nArgs ], XmNbottomWidget, widReadWithAsterisks_ ); ++nArgs; XtSetArg( aArg[ nArgs ], XmNbottomOffset, 20 ); ++nArgs; XtSetArg( aArg[ nArgs ], XmNselectionPolicy, XmSINGLE_SELECT ); ++nArgs; XtSetArg( aArg[ nArgs ], XmNvisibleItemCount, 8 ); ++nArgs; widReadList_ = XmCreateScrolledList( widForm_, "FragmentList", aArg, nArgs ); XtManageChild( widReadList_ ); XtAddCallback( widReadList_, XmNdefaultActionCallback, cbChooseContig, this ); XtAddCallback( widReadList_, XmNsingleSelectionCallback, cbChooseContigSingleClick, this ); } void quitConsedButtonCb(Widget wid, guiTopWindow* pGuiTopWindow, XmPushButtonCallbackStruct* pCbStruct) { TRY_CATCH_WRAPPER( ConsEd::pGetConsEd()->quitConsed() ); } void cbUndoEditButton( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( new guiUndoEdit() ); } void openAssemblyMenuItemCb(Widget w, XtPointer client_data, XtPointer call_data) { TRY_CATCH_WRAPPER( ConsEd :: pGetConsEd() ->askUserForFileToOpen() ); } void saveAssemblyMenuItemCb(Widget w, XtPointer client_data, XtPointer call_data) { TRY_CATCH_WRAPPER( Assembly* pAssembly = ConsEd :: pGetConsEd() ->pAssemblyGet(); // just in case the user has not yet loaded an assembly if (! pAssembly) return; bool bUserPushedCancel = false; pAssembly->saveAssembly( bUserPushedCancel, 0 ); ); } void quitConsedMenuItemCb(Widget w, XtPointer client_data, XtPointer call_data) { TRY_CATCH_WRAPPER( ConsEd::pGetConsEd()->quitConsed() ); } void cbCustomNavigation(Widget w, XtPointer client_data, XtPointer call_data) { TRY_CATCH_WRAPPER( askUserForCustomNavigationFileAndPopupWindowAndParseFile() ); } void showXResourcesMenuItemCb(Widget w, XtPointer client_data, XtPointer call_data) { TRY_CATCH_WRAPPER( ConsEd :: pGetConsEd()->showXResources() ); } void showConsedVersionMenuItemCb(Widget w, XtPointer client_data, XtPointer call_data) { TRY_CATCH_WRAPPER( ConsEd :: pGetConsEd()->showConsedVersion() ); } void cbShowWholeAssemblyItems( Widget wid, XtPointer pClientData, XtPointer pCallData ) { TRY_CATCH_WRAPPER( ConsEd :: pGetAssembly()->showWholeAssemblyItems() ); } void generalPreferencesMenuItemCb(Widget w, XtPointer client_data, XtPointer call_data) { TRY_CATCH_WRAPPER( new guiSetGeneralPreferences() ); } void cbSetPrimerPickingPreferences( Widget w, XtPointer client_data, XtPointer call_data) { TRY_CATCH_WRAPPER( new guiSetPrimerPickingPreferences() ); } void guiTopWindow :: setAssemblyName( const RWCString& soAssemblyName ) { Arg aArg[2]; int nArgs = 0; XtSetArg(aArg[nArgs], XmNvalue, (char *)soAssemblyName.data()); nArgs++; XtSetValues(widAssemblyName_, aArg, nArgs); } void searchForStringButtonCb(Widget w, XtPointer client_data, XtPointer call_data) { TRY_CATCH_WRAPPER( ConsEd:: pGetConsEd()->searchForString() ); } void guiTopWindow :: showListOfContigs( ChooseContig* pChooseContig ) { XmStringTable xmStringList; int n; Assembly* pAssembly = ConsEd::pGetAssembly(); xmStringList = (XmStringTable) XtMalloc( pAssembly->nNumContigs() * sizeof (XmString *) ); RWCString soLineToDisplay( (size_t) 100 ); for ( n = 0; n < pAssembly->nNumContigs(); n++ ) { Contig* pContig = pAssembly->pGetContig(n); soLineToDisplay = pContig->soGetFancyName(); int nNumberOfReads = pContig->nGetNumberOfFragsInContig(); if ( nNumberOfReads == 1 ) { soLineToDisplay += ": "; LocatedFragment* pLocFrag = pContig->pLocatedFragmentGet( 0 ); soLineToDisplay += pLocFrag->soGetName(); } else { int nContigLength = pAssembly->pGetContig(n)->nGetUnpaddedSeqLength(); soLineToDisplay.increaseMaxLengthIfNecessary( 100 ); soLineToDisplay.appendFormat( " (%s reads, %s bps)", soAddCommas( nNumberOfReads ).data(), soAddCommas( nContigLength ).data() ); } xmStringList[n] = XmStringCreateSimple( soLineToDisplay.data() ); } const int nVisibleItemCount = 8; int nTopItemPosition = MAX( pAssembly->nNumContigs() - nVisibleItemCount + 1, 1 ); // 1-based XtVaSetValues( widContigList_, XmNitems, xmStringList, XmNitemCount, pAssembly->nNumContigs(), XmNvisibleItemCount, nVisibleItemCount, XmNtopItemPosition, nTopItemPosition, NULL ); // make the last contig the default one // (the one that the user will get just by pushing 'ok') XmString xmStringDefaultChoice = XmStringCopy( xmStringList[ pAssembly->nNumContigs() - 1 ] ); for( n = 0; n < pAssembly->nNumContigs(); n++ ) XmStringFree( xmStringList[n] ); XtFree( (char *)xmStringList ); xmStringList = (XmStringTable) XtMalloc( pChooseContig->nNumberOfFragments() * sizeof (XmString *) ); RWCString soTemp; char szTemp2[200]; for ( n = 0; n < pChooseContig->nNumberOfFragments(); n++ ) { soTemp = pChooseContig->soGetFragmentName(n) + " " + pChooseContig->soGetContigNameForFragment(n); LocatedFragment* pLocFrag = pChooseContig->pGetLocatedFragment(n); Contig* pContig = pLocFrag->pGetContig(); sprintf( szTemp2, " (~%s bps from %s to %s )", soAddCommas( pLocFrag->nGetNumberOfPhredCalledBases() ).data(), soAddCommas( pContig->nUnpaddedIndex( pLocFrag->nGetAlignStart() ) ).data(), soAddCommas( pContig->nUnpaddedIndex( pLocFrag->nGetAlignEnd() ) ).data() ); soTemp += szTemp2; xmStringList[n] = XmStringCreateSimple( (char*) soTemp.data() ); } XtVaSetValues( widReadList_, XmNitems, xmStringList, XmNitemCount, pChooseContig->nNumberOfFragments(), XmNtopItemPosition, 1, XmNvisibleItemCount, 8, NULL ); for( n = 0; n < pChooseContig->nNumberOfFragments(); n++ ) XmStringFree( xmStringList[n] ); XtFree( (char *)xmStringList ); RWCString soMessage; if ( pChooseContig->bHadToTruncateReadList_ ) { soMessage = soAddCommas( pAssembly->nGetNumberOfReadsInAssembly() ) + " (reads present, but too many to show below)"; } else { soMessage = RWCString( (long) pChooseContig->nNumberOfFragments() ); } XtVaSetValues( widNumberOfReads_, XmNvalue, soMessage.data(), NULL ); } void cbChooseContig( Widget widCallback, XtPointer client_data, XtPointer call_data ) { XmListCallbackStruct* pXmListCallbackStruct = (XmListCallbackStruct*) call_data; TRY_CATCH_WRAPPER( GuiApp::pGetGuiApp()->pGetGuiTopWindow()->guiChoseContig( widCallback, pXmListCallbackStruct ) ); } void guiTopWindow :: guiChoseContig( Widget widCallback, XmListCallbackStruct* pXmListCallbackStruct ) { bool bReadListNotContigList; int nIndex; // the purpose of this callback is to set the object (non-automatic) // data bUserPushedCancel_, nIndex_, and bReadListNotContigList_, // and bBlockApplication_ assert( (widCallback == widContigList_) || (widCallback == widReadList_) || (widCallback == widShowContigButton_) ); if ( (widCallback == widContigList_) || (widCallback == widReadList_ ) ) { // case of double click if (widCallback == widContigList_ ) bReadListNotContigList = false; else bReadListNotContigList = true; nIndex = pXmListCallbackStruct->item_position; } else { // if there is anything in the pattern window, use that // Otherwise, use whatever is single-clicked or whatever is // in the incremental search window char* szValue = XmTextGetString( widReadWithAsterisks_ ); RWCString soUserTypedString( szValue ); XtFree( szValue ); if ( !soUserTypedString.isNull() ) { userPressedReturnInReadWithAsterisks(); return; } if (! bUserSingleClicked_ ) { GuiApp::pGetGuiApp()->popupErrorMessage( "you must first single click on a read or contig before clicking ok" ); return; } // case of single click followed by clicking ok bReadListNotContigList = bSingleClickReadListNotContigList_; nIndex = nSingleClickIndex_; } ConsEd :: pGetConsEd()->choseContig( nIndex, bReadListNotContigList ); } void guiTopWindow :: setCallbackInfoForSingleSelection( Widget widCallback, XmListCallbackStruct* pXmListCallbackStruct ) { // the purpose of this callback is to set the object (non-automatic) // data bUserPushedCancel_, nIndex_, and bFragmentListNotContigList_, // and bBlockApplication_ if (pXmListCallbackStruct->reason != XmCR_SINGLE_SELECT ) { assert(False); } bUserSingleClicked_ = true; nSingleClickIndex_ = pXmListCallbackStruct->item_position; if (widCallback == widContigList_ ) bSingleClickReadListNotContigList_ = false; else if (widCallback == widReadList_ ) bSingleClickReadListNotContigList_ = true; else assert( false ); // programming error } void cbChooseContigSingleClick( Widget widCallback, XtPointer client_data, XtPointer call_data ) { XmListCallbackStruct* pXmListCallbackStruct = (XmListCallbackStruct*) call_data; guiTopWindow* pGuiTopWindow = (guiTopWindow *) client_data; TRY_CATCH_WRAPPER( pGuiTopWindow->setCallbackInfoForSingleSelection( widCallback, pXmListCallbackStruct ) ); } void cbIncrementalSearchForRead( Widget wid, XtPointer client_data, XtPointer call_data ) { guiTopWindow* pGuiTopWindow = (guiTopWindow *) client_data; TRY_CATCH_WRAPPER( pGuiTopWindow->incrementalSearchForReadValueChanged() ); } void cbUserPressedReturnInIncrementalSearchForRead( Widget wid, XtPointer client_data, XtPointer call_data ) { guiTopWindow* pGuiTopWindow = (guiTopWindow *) client_data; TRY_CATCH_WRAPPER( pGuiTopWindow->userPressedReturnInIncrementalSearchForRead() ); } void guiTopWindow :: userPressedReturnInIncrementalSearchForRead() { int* pPositionList; int nNumberOfSelectedItems; // should be 1 bool bSomeItemWasSelected = XmListGetSelectedPos( widReadList_, &pPositionList, &nNumberOfSelectedItems ); if (!bSomeItemWasSelected) { popupErrorMessage( "You must first select a read before pushing return" ); return; } assert( nNumberOfSelectedItems == 1 ); int nIndexOfSelectedItem = pPositionList[0]; ConsEd :: pGetConsEd()->choseContig( nIndexOfSelectedItem, true ); } void guiTopWindow :: incrementalSearchForReadValueChanged() { // first check if user is trying to crash consed ChooseContig* pChooseContig = ConsEd::pGetConsEd()->pGetChooseContig(); if ( ! pChooseContig ) { popupErrorMessage( "You must select an assembly before trying to select a read" ); return; } char* szValue = XmTextGetString( widIncrementalSearchForRead_ ); RWCString soUserTypedString( szValue ); XtFree( szValue ); int nIndexInReadList; findFirstMatchingReadForUserTypedString( soUserTypedString, nIndexInReadList ); // cout << "findFirstMatchingReadForUserTypedString = " << nIndexInReadList << // " soUserTypedString = " << soUserTypedString << endl; // Motif XmList start at 1 int nIndexInMotifList = nIndexInReadList + 1; int nTopIndex; int nVisibleItems; XtVaGetValues( widReadList_, XmNtopItemPosition, &nTopIndex, XmNvisibleItemCount, &nVisibleItems, NULL ); if ( nIndexInMotifList < nTopIndex ) XmListSetPos( widReadList_, nIndexInMotifList ); else if (nIndexInMotifList > nTopIndex + nVisibleItems - 1) XmListSetBottomPos( widReadList_, nIndexInMotifList ); XmListSelectPos( widReadList_, nIndexInMotifList, True ); } void guiTopWindow :: findFirstMatchingReadForUserTypedString( const RWCString& soUserTypedString, int& nIndexInReadList ) { // find the first read name that starts with this string ChooseContig* pChooseContig = ConsEd::pGetConsEd()->pGetChooseContig(); RWCString soReadName; bool bStopLooking = false; for ( int n = 0; ( n < pChooseContig->nNumberOfFragments() ) && !bStopLooking; n++ ) { soReadName = pChooseContig->soGetFragmentName(n); if ( soUserTypedString.length() <= soReadName.length() ) { RWCString soFirstPartOfReadName = soReadName(0, soUserTypedString.length() ); if ( soFirstPartOfReadName == soUserTypedString ) { bStopLooking = true; nIndexInReadList = n; } else if (soFirstPartOfReadName < soUserTypedString ) bStopLooking = false; // continue looking else if (soFirstPartOfReadName > soUserTypedString ) { bStopLooking = true; // too far, but the previous didn't match // so stop nIndexInReadList = n; } } else { // this is case in which user's string is longer than // the current read name RWCString soFirstPartOfUserTyped = soUserTypedString(0, soReadName.length() ); if ( soReadName == soFirstPartOfUserTyped ) bStopLooking = false; // continue looking--there may be a // match for the rest of the name later else if (soReadName < soFirstPartOfUserTyped ) bStopLooking = false; // a subsequent read name may match else if ( soReadName > soFirstPartOfUserTyped ) { bStopLooking = true; // gone too far nIndexInReadList = n; } } } // handle case in which user typed string is greater (alphabetical order) // than last item in the list // In this case, return the index of the last item in the list if (!bStopLooking ) { nIndexInReadList = pChooseContig->nNumberOfFragments() - 1; } } void cbCreateAssemblyView( Widget wid, XtPointer pClientData, XtPointer pCallData ) { guiTopWindow* pGuiTopWindow = (guiTopWindow*) pClientData; if ( ! ConsEd::pGetAssembly() ) { popupErrorMessage( "Must first load an assembly before viewing assembly" ); return; } TRY_CATCH_WRAPPER( if ( ConsEd::pGetConsEd()->pAssemblyView_ ) { ConsEd::pGetConsEd()->pAssemblyView_->raiseWindow(); } else { ConsEd::pGetConsEd()->pAssemblyView_ = new assemblyView( ); ConsEd::pGetConsEd()->pAssemblyView_->createWindow( ConsEd::pGetAssembly() ); } ); } static void cbAddNewReads( Widget wid, XtPointer pClientData, XtPointer pCallData ) { guiTopWindow* pGuiTopWindow = (guiTopWindow*) pClientData; if ( ! ConsEd::pGetAssembly() ) { popupErrorMessage( "Must first load an assembly before adding new reads" ); return; } TRY_CATCH_WRAPPER( try { addNewReads* pAddNewReads = new addNewReads(); pAddNewReads->doIt(); } catch( InputDataError ide ) { // cout << "caught exception" << n << endl; } ); } void guiTopWindow :: showConsedResources() { RWCString soConsedResources = consedResources::pCurrentResources_->soGetResources(); const int nNumberOfRowsVisible = 35; TextBox* pTB = new TextBox( "Current Consed Parameters", nNumberOfRowsVisible, soConsedResources ); } void guiTopWindow :: showAutoFinishErrorsFixedFormula() { if ( !ConsEd::pGetAssembly() ) return; ConsEd::pGetAssembly()->showAutoFinishErrorsFixedFormula(); } void guiTopWindow :: userPressedReturnInReadWithAsterisks() { if ( !ConsEd::pGetAssembly() ) { popupErrorMessage( "please select an ace file in the other window" ); return; } char* szValue = XmTextGetString( widReadWithAsterisks_ ); RWCString soOriginalUserTypedString( szValue ); XtFree( szValue ); if ( soOriginalUserTypedString.isNull() ) return; soOriginalUserTypedString = soOriginalUserTypedString.stripWhitespace( RWCString::BOTH ); RWCString soRegExpFormOfUserString = soOriginalUserTypedString; for( int n = soRegExpFormOfUserString.length() - 1; n >= 0; --n ) { if ( soRegExpFormOfUserString[ n ] == '*' ) { soRegExpFormOfUserString.insert( n, "." ); } } ChooseContig* pChooseContig = new ChooseContig( ConsEd::pGetAssembly(), soRegExpFormOfUserString ); int nNumberOfReadsMatchingPattern = pChooseContig->nGetNumberOfReadsMatchingPattern(); if ( nNumberOfReadsMatchingPattern > pCP->nMaximumReadsInReadList_ ) { RWCString soQuestion = "Pattern " + soOriginalUserTypedString + " matches " + RWCString( (long) nNumberOfReadsMatchingPattern ) + " reads. This will take a large amount of time and memory. Do you want to proceed anyway? (Y/N)"; if ( !bGuiGetAnswerYesNo( soQuestion ) ) { delete pChooseContig; return; } } pChooseContig->fillThyself( false ); // do not limit # of reads if ( pChooseContig->nNumberOfFragments() == 0 ) { popupErrorMessage( "Sorry--there are no reads matching pattern %s", soOriginalUserTypedString.data() ); delete pChooseContig; } else if ( pChooseContig->nNumberOfFragments() == 1 ) { LocatedFragment* pLocFrag = pChooseContig->pGetLocatedFragment( 0 ); ConsEd::pGetConsEd()->choseContig2( pLocFrag ); delete pChooseContig; } else { guiChoiceOfReadsForAlignedReads* pChoiceOfReads = new guiChoiceOfReadsForAlignedReads( pChooseContig ); pChoiceOfReads->popup(); } } void guiTopWindow :: editConsedResources() { guiEditResources* pGuiEditResources = new guiEditResources( false ); // stand-alone pGuiEditResources->createWindow(); } void guiTopWindow :: createMiniassemblyWindow() { miniassembly* pMiniassembly = new miniassembly(); pMiniassembly->createWindow(); } void guiTopWindow :: userPressedReturnInEnterContigName() { char* szValue = XmTextGetString( widEnterContigName_ ); RWCString soUserTypedString( szValue ); XtFree( szValue ); if ( soUserTypedString.isNull() ) return; soUserTypedString.stripAllWhitespaceExceptInternal(); soUserTypedString.toLower(); Contig* pFoundContig = NULL; for( int nContig = 0; nContig < ConsEd::pGetAssembly()->nNumContigs() && !pFoundContig; ++nContig ) { Contig* pContig = ConsEd::pGetAssembly()->pGetContig( nContig ); if ( pContig->soGetName().returnToLower() == soUserTypedString ) { pFoundContig = pContig; } } if ( !pFoundContig ) { RWCString soErrorMessage = "could not find contig "; soErrorMessage += soUserTypedString; popupErrorMessage( soErrorMessage ); return; } int nStartConsPos = pFoundContig->nGetFirstDisplayableContigPos(); ConsEd::pGetConsEd()->pPutContigInAContigWin( pFoundContig, nStartConsPos ); } void guiTopWindow :: userPressedReorderContigs() { Assembly* pAssembly = ConsEd::pGetAssembly(); RWCString soNewButtonLabel; if ( pAssembly->cContigsSortedByWhat_ == Assembly::cNUMBER_OF_READS ) { pAssembly->sortContigsByName(); soNewButtonLabel = "Reorder By # of Reads"; } else { pAssembly->sortContigsByNumberOfReads(); soNewButtonLabel = "Reorder By Contig Name"; } XmString xmsLabel = XmStringCreateLtoR( soNewButtonLabel.data(), XmSTRING_DEFAULT_CHARSET ); XtVaSetValues( widReorderContigsButton_, XmNlabelString, xmsLabel, NULL ); ConsEd::pGetConsEd()->updateContigListOnMainConsedWindow(); } void guiTopWindow :: testExceptionHandling() { RWCString soMessage = "if this message appears in a popup window, your exception handling is fine. If consed terminates, then there is a problem with your system's libC shared library for exception handling."; THROW_ERROR( soMessage ); }