/***************************************************************************** # 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 #include #include #include #include #include #include #include #include #include "guiapp.h" #include #include #include "rwcstring.h" #include "rwcregexp.h" #include "bIsNumericMaybeWithWhitespace.h" #include "guiPopupTagInfo.h" #include "assert.h" #include "guicontigwin.h" #include "locatedFragment.h" #include "consed.h" #include "guiteditor.h" #include "handleWindowManagerDelete.h" #include "oligoTag.h" #include "editDeleteReadTag.h" #include "editDeleteConsensusTag.h" #include "hp_exception_kludge.h" #include "userDefinedTagField.h" #include "popupErrorMessage.h" #include "bGuiGetAnswerYesNo.h" #ifdef NO_POUND_POUND_MACROS #define rowColumnField( FieldName, LabelDisplayed ) \ Widget wid ## FieldName ## Form = XtVaCreateManagedWidget( "form", \ xmFormWidgetClass, \ widRowCol, \ XmNshadowThickness, 0, \ NULL ); \ \ Widget wid ## FieldName ## Label = XtVaCreateManagedWidget( \ LabelDisplayed , \ xmLabelWidgetClass, \ wid ## FieldName ## Form, \ XmNtopAttachment, XmATTACH_FORM, \ XmNbottomAttachment, XmATTACH_FORM, \ XmNrightAttachment, XmATTACH_POSITION, \ XmNrightPosition, 60, \ XmNalignment, XmALIGNMENT_END, \ NULL ); \ \ Widget wid ## FieldName ## Value = XtVaCreateManagedWidget( \ #FieldName "Value", \ xmTextFieldWidgetClass, \ wid ## FieldName ## Form , \ XmNtopAttachment, XmATTACH_FORM, \ XmNbottomAttachment, XmATTACH_FORM, \ XmNleftAttachment, XmATTACH_POSITION, \ XmNleftPosition, 65, \ XmNrightAttachment, XmATTACH_FORM, \ XmNvalue, (char*) so ## FieldName.data(), \ XmNeditable, False, \ XmNcursorPositionVisible, False, \ XmNtraversalOn, False, \ NULL ); #else #define rowColumnField( FieldName, LabelDisplayed ) \ Widget wid ## FieldName ## Form = XtVaCreateManagedWidget( "form", \ xmFormWidgetClass, \ widRowCol, \ XmNshadowThickness, 0, \ NULL ); \ \ Widget wid ## FieldName ## Label = XtVaCreateManagedWidget( \ LabelDisplayed , \ xmLabelWidgetClass, \ wid ## FieldName ## Form, \ XmNtopAttachment, XmATTACH_FORM, \ XmNbottomAttachment, XmATTACH_FORM, \ XmNrightAttachment, XmATTACH_POSITION, \ XmNrightPosition, 60, \ XmNalignment, XmALIGNMENT_END, \ NULL ); \ \ Widget wid ## FieldName ## Value = XtVaCreateManagedWidget( \ #FieldName "Value", \ xmTextFieldWidgetClass, \ wid ## FieldName ## Form , \ XmNtopAttachment, XmATTACH_FORM, \ XmNbottomAttachment, XmATTACH_FORM, \ XmNleftAttachment, XmATTACH_POSITION, \ XmNleftPosition, 65, \ XmNrightAttachment, XmATTACH_FORM, \ XmNvalue, (char*) so ## FieldName ## .data(), \ XmNeditable, False, \ XmNcursorPositionVisible, False, \ XmNtraversalOn, False, \ NULL ); #endif static void cbGuiPopupTagInfoAddID( Widget wid, XtPointer pClientData, XtPointer pCallData ) { guiPopupTagInfo* pGuiPopupTagInfo = (guiPopupTagInfo*) pClientData; pGuiPopupTagInfo->addTagID(); } static void cbGuiPopupTagInfoRemoveID( Widget wid, XtPointer pClientData, XtPointer pCallData ) { guiPopupTagInfo* pGuiPopupTagInfo = (guiPopupTagInfo*) pClientData; pGuiPopupTagInfo->removeTagID(); } guiPopupTagInfo :: guiPopupTagInfo( void* pGuiContigWinOrGuiTeditor, const bool bIsGuiContigWin, const int nNumberOfTagsAlreadyPoppedUp, tag* pTag ) : pTag_( pTag ) { RWCString soTagType; RWCString soTagSource; int nConsPosStart; int nConsPosEnd; RWCString soTagDate; soTagType = pTag_->soType_; soTagSource = pTag_->soSource_; soTagDate = pTag_->soDate_; nConsPosStart = pTag_->nPaddedConsPosStart_; nConsPosEnd = pTag_->nPaddedConsPosEnd_; RWCString soID; if ( pTag_->lID_ == nUndefinedTagID ) soID = "(none)"; else soID = RWCString( pTag_->lID_ ); int nStartUnpaddedConsPos = pTag_->pContig_->nUnpaddedIndex( nConsPosStart ); int nEndUnpaddedConsPos = pTag_->pContig_->nUnpaddedIndex( nConsPosEnd ); int nArgs; Arg aArg[50]; Widget widWindowAbove; if (bIsGuiContigWin) { GuiContigWin* pGuiContigWin = (GuiContigWin*) pGuiContigWinOrGuiTeditor; widWindowAbove = pGuiContigWin->widGetGuiContigWinTopLevel(); } else { GuiTeditor* pGuiTeditor = (GuiTeditor*) pGuiContigWinOrGuiTeditor; widWindowAbove = pGuiTeditor->widGetGuiTeditorShell(); } Position nWindowAboveTop; Position nWindowAboveLeft; Dimension nWindowAboveWidth; Dimension nWindowAboveHeight; XtVaGetValues( widWindowAbove, XmNheight, &nWindowAboveHeight, XmNwidth, &nWindowAboveWidth, XmNy, &nWindowAboveTop, XmNx, &nWindowAboveLeft, NULL ); const int nYOffsetPerTag = 50; const int nXOffsetPerTag = 50; Position nX = nWindowAboveLeft + ( nNumberOfTagsAlreadyPoppedUp * nXOffsetPerTag ); Position nY = nWindowAboveTop + nWindowAboveHeight + ( nNumberOfTagsAlreadyPoppedUp * nYOffsetPerTag ); widPopupShell_ = XtVaCreatePopupShell("Tag", topLevelShellWidgetClass, GuiApp::pGetGuiApp()->widGetTopLevel(), XmNtitle, (char*) soTagType.data(), XmNnoResize, False, XmNautoUnmanage, False, XmNtransient, False, XmNy, nY, XmNx, nX, XmNdeleteResponse, XmDO_NOTHING, NULL ); handleWindowManagerDelete( widPopupShell_ ); // the immediate child of the application shell is a // main window Widget widMainWin = XtVaCreateManagedWidget("mainwin", xmMainWindowWidgetClass, widPopupShell_, XmNancestorSensitive, True, NULL ); // // create the form widget // nArgs = 0; XtSetArg(aArg[nArgs],XmNshadowThickness,0); nArgs++; XtSetArg(aArg[nArgs],XmNborderWidth,0); nArgs++; XtSetArg(aArg[nArgs],XmNwidth, 65 * GuiApp::nGetFontWidth() ); nArgs++; Widget widForm = XmCreateForm(widMainWin, "form", aArg, nArgs); XtManageChild(widForm); Widget widRowCol = XtVaCreateManagedWidget( "rowcol", xmRowColumnWidgetClass, widForm, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNorientation, XmVERTICAL, XmNnumColumns, 1, XmNpacking, XmPACK_COLUMN, NULL ); Widget widTagTypeForm = XtVaCreateManagedWidget( "form", xmFormWidgetClass, widRowCol, XmNshadowThickness, 0, NULL ); Widget widTagTypeLabel = XtVaCreateManagedWidget( "Tag Type", xmLabelWidgetClass, widTagTypeForm, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 60, XmNalignment, XmALIGNMENT_END, NULL ); Widget widTagTypeValue = XtVaCreateManagedWidget( "tag type value", xmTextFieldWidgetClass, widTagTypeForm, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 65, XmNrightAttachment, XmATTACH_FORM, XmNvalue, (char*) soTagType.data(), XmNeditable, False, XmNcursorPositionVisible, False, XmNtraversalOn, False, NULL ); Widget widTagSourceForm = XtVaCreateManagedWidget( "form", xmFormWidgetClass, widRowCol, XmNshadowThickness, 0, NULL ); Widget widTagSourceLabel = XtVaCreateManagedWidget( "Tag Source", xmLabelWidgetClass, widTagSourceForm, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 60, XmNalignment, XmALIGNMENT_END, NULL ); Widget widTagSourceValue = XtVaCreateManagedWidget( "tag source value", xmTextFieldWidgetClass, widTagSourceForm, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 65, XmNrightAttachment, XmATTACH_FORM, XmNvalue, (char*) soTagSource.data(), XmNeditable, False, XmNcursorPositionVisible, False, XmNtraversalOn, False, NULL ); Widget widStartUnpaddedConsPosForm = XtVaCreateManagedWidget( "form", xmFormWidgetClass, widRowCol, XmNshadowThickness, 0, NULL ); Widget widStartUnpaddedConsPosLabel = XtVaCreateManagedWidget( "Start Unpadded Consensus Position", xmLabelWidgetClass, widStartUnpaddedConsPosForm, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 60, XmNalignment, XmALIGNMENT_END, NULL ); char szStartUnpaddedConsPos[200]; sprintf( szStartUnpaddedConsPos, "%d", nStartUnpaddedConsPos ); widStartUnpaddedConsPosValue_ = XtVaCreateManagedWidget( "start unpadded cons pos value", xmTextFieldWidgetClass, widStartUnpaddedConsPosForm, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 65, XmNrightAttachment, XmATTACH_FORM, XmNvalue, szStartUnpaddedConsPos, XmNeditable, True, XmNcursorPositionVisible, True, XmNtraversalOn, True, NULL ); Widget widEndUnpaddedConsPosForm = XtVaCreateManagedWidget( "form", xmFormWidgetClass, widRowCol, XmNshadowThickness, 0, NULL ); Widget widEndUnpaddedConsPosLabel = XtVaCreateManagedWidget( "End Unpadded Consensus Position", xmLabelWidgetClass, widEndUnpaddedConsPosForm, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 60, XmNalignment, XmALIGNMENT_END, NULL ); char szEndUnpaddedConsPos[200]; sprintf( szEndUnpaddedConsPos, "%d", nEndUnpaddedConsPos ); widEndUnpaddedConsPosValue_ = XtVaCreateManagedWidget( "end unpadded cons pos value", xmTextFieldWidgetClass, widEndUnpaddedConsPosForm, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 65, XmNrightAttachment, XmATTACH_FORM, XmNvalue, szEndUnpaddedConsPos, XmNeditable, True, XmNcursorPositionVisible, True, XmNtraversalOn, True, NULL ); // date rowColumnField( TagDate, "Tag Date" ); // Widget widDateForm = XtVaCreateManagedWidget( "form", // xmFormWidgetClass, // widRowCol, // XmNshadowThickness, 0, // NULL ); // Widget widDateLabel = XtVaCreateManagedWidget( // "Date", // xmLabelWidgetClass, // widDateForm, // XmNtopAttachment, XmATTACH_FORM, // XmNbottomAttachment, XmATTACH_FORM, // XmNleftAttachment, XmATTACH_FORM, // XmNrightAttachment, XmATTACH_POSITION, // XmNrightPosition, 60, // XmNalignment, XmALIGNMENT_END, // NULL ); // Widget widDateValue = XtVaCreateManagedWidget( // "date value", // xmTextFieldWidgetClass, // widDateForm, // XmNtopAttachment, XmATTACH_FORM, // XmNbottomAttachment, XmATTACH_FORM, // XmNleftAttachment, XmATTACH_POSITION, // XmNleftPosition, 65, // XmNrightAttachment, XmATTACH_FORM, // XmNvalue, (char*) soTagDate.data(), // XmNeditable, False, // XmNcursorPositionVisible, False, // XmNtraversalOn, False, // NULL ); // id rowColumnField( ID, "ID" ); widID_ = widIDValue; // add a button to assign a tag id Widget widAddIDButton = XtVaCreateManagedWidget( "Add ID", xmPushButtonWidgetClass, widIDForm, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, NULL ); XtAddCallback( widAddIDButton, XmNactivateCallback, cbGuiPopupTagInfoAddID, this ); Widget widRemoveIDButton = XtVaCreateManagedWidget( "Remove ID", xmPushButtonWidgetClass, widIDForm, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, widAddIDButton, XmNleftOffset, 20, NULL ); XtAddCallback( widRemoveIDButton, XmNactivateCallback, cbGuiPopupTagInfoRemoveID, this ); Widget widAbove = widRowCol; widDeleteButton_ = XtVaCreateManagedWidget( "Delete Tag", xmPushButtonWidgetClass, widForm, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, 10, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 10, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 30, XmNtraversalOn, False, NULL ); XtAddCallback(widDeleteButton_, XmNactivateCallback, (XtCallbackProc )cbGuiPopupTagInfoDeleteButton, this); widOKButton_ = XtVaCreateManagedWidget( "Save Changes", xmPushButtonWidgetClass, widForm, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, 10, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 40, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 60, NULL ); XtAddCallback(widOKButton_, XmNactivateCallback, (XtCallbackProc )cbGuiPopupTagInfoOKButton, this); widCancelButton_ = XtVaCreateManagedWidget( "Dismiss", xmPushButtonWidgetClass, widForm, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, 10, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 70, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 90, XmNtraversalOn, False, NULL ); XtAddCallback(widCancelButton_, XmNactivateCallback, (XtCallbackProc )cbGuiPopupTagInfoCancelButton, this); XmString xmsWarning = XmStringCreateLtoR( "modifying a tag is not\nsaved in .wrk file--save assembly frequently", XmFONTLIST_DEFAULT_TAG ); Widget widWarningLabel = XtVaCreateManagedWidget( "warning", xmLabelWidgetClass, widForm, XmNlabelString, xmsWarning, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, widDeleteButton_, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL ); XmStringFree( xmsWarning ); Widget widBelow = widWarningLabel; // stack up the optional boxes from the bottom up if ( !pTag_->soMiscData_.isNull() ) { nArgs = 0; XtSetArg( aArg[nArgs], XmNbottomAttachment, XmATTACH_WIDGET ); ++nArgs; XtSetArg( aArg[nArgs], XmNbottomWidget, widBelow ); ++nArgs; // XtSetArg( aArg[nArgs], XmNtopAttachment, XmATTACH_WIDGET ); ++nArgs; // XtSetArg( aArg[nArgs], XmNtopWidget, widRowCol ); ++nArgs; XtSetArg( aArg[nArgs], XmNleftAttachment, XmATTACH_FORM ); ++nArgs; XtSetArg( aArg[nArgs], XmNrightAttachment, XmATTACH_FORM ); ++nArgs; XtSetArg( aArg[nArgs], XmNrows, 9 ); ++nArgs; XtSetArg( aArg[nArgs], XmNvalue, (char*) pTag_->soMiscData_.data() ); ++nArgs; XtSetArg( aArg[nArgs], XmNeditMode, XmMULTI_LINE_EDIT ); ++nArgs; XtSetArg( aArg[nArgs], XmNeditable, False ); ++nArgs; XtSetArg( aArg[nArgs], XmNcursorPositionVisible, False ); ++nArgs; XtSetArg( aArg[nArgs], XmNtraversalOn, False ); ++nArgs; widMiscData_ = XmCreateScrolledText( widForm, "miscData", aArg, nArgs ); XtManageChild( widMiscData_ ); widBelow = widMiscData_; } bool bExtraStuffDisplayed; Widget widBottomOfExtraStuff; pTag_->guiDisplayExtraInformation( widForm, widRowCol, widBelow, bExtraStuffDisplayed, widBottomOfExtraStuff ); if ( bExtraStuffDisplayed ) widAbove = widBottomOfExtraStuff; Widget widCommentLabel = XtVaCreateManagedWidget( "comment:", xmLabelWidgetClass, widForm, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, widAbove, XmNleftAttachment, XmATTACH_FORM, NULL ); nArgs = 0; XtSetArg( aArg[nArgs], XmNbottomAttachment, XmATTACH_WIDGET ); ++nArgs; XtSetArg( aArg[nArgs], XmNbottomWidget, widBelow ); ++nArgs; XtSetArg( aArg[nArgs], XmNtopAttachment, XmATTACH_WIDGET ); ++nArgs; XtSetArg( aArg[nArgs], XmNtopWidget, widCommentLabel ); ++nArgs; XtSetArg( aArg[nArgs], XmNleftAttachment, XmATTACH_FORM ); ++nArgs; XtSetArg( aArg[nArgs], XmNrightAttachment, XmATTACH_FORM ); ++nArgs; XtSetArg( aArg[nArgs], XmNrows, 3 ); ++nArgs; XtSetArg( aArg[nArgs], XmNvalue, (char*) pTag_->soComment_.data() ); ++nArgs; XtSetArg( aArg[nArgs], XmNeditMode, XmMULTI_LINE_EDIT ); ++nArgs; XtSetArg( aArg[nArgs], XmNeditable, True ); ++nArgs; XtSetArg( aArg[nArgs], XmNcursorPositionVisible, True ); ++nArgs; // note: if XmNtraversalOn is set to false, then the field is not // editable XtSetArg( aArg[nArgs], XmNtraversalOn, True ); ++nArgs; widComment_ = XmCreateScrolledText( widForm, "comment", aArg, nArgs ); XtManageChild( widComment_ ); XtPopup( widPopupShell_, XtGrabNone ); XmProcessTraversal( widCancelButton_, XmTRAVERSE_CURRENT ); } void cbGuiPopupTagInfoDeleteButton(Widget wid, XtPointer clientData, XmAnyCallbackStruct* cbs) { guiPopupTagInfo* pGuiPopupTagInfo = (guiPopupTagInfo* )clientData; TRY_CATCH_WRAPPER( assert( wid == pGuiPopupTagInfo->widDeleteButton_ ); pGuiPopupTagInfo->deleteTag(); ); } void cbGuiPopupTagInfoOKButton(Widget wid, XtPointer clientData, XmAnyCallbackStruct* cbs) { guiPopupTagInfo* pGuiPopupTagInfo = (guiPopupTagInfo* )clientData; TRY_CATCH_WRAPPER( assert( wid == pGuiPopupTagInfo->widOKButton_ ); pGuiPopupTagInfo->userPushedOK(); ); } void cbGuiPopupTagInfoCancelButton(Widget wid, XtPointer clientData, XmAnyCallbackStruct* cbs) { guiPopupTagInfo* pGuiPopupTagInfo = (guiPopupTagInfo* )clientData; assert( wid == pGuiPopupTagInfo->widCancelButton_ ); TRY_CATCH_WRAPPER( delete pGuiPopupTagInfo; ); } guiPopupTagInfo :: ~guiPopupTagInfo() { XtPopdown( widPopupShell_ ); XtDestroyWidget( widPopupShell_ ); // mark as popped down so it can be popped up again pTag_->pGuiPopupTagInfo_ = NULL; } void guiPopupTagInfo :: deleteTag() { if (pTag_->soType_ == "edit" ) { GuiApp::popupErrorMessage( "you can't delete or modify edit tags" ); return; } EditAction* pEditAction = NULL; if ( pTag_->bReadTagNotConsensusTag_ ) { pEditAction = new editDeleteReadTag( pTag_ ); } else { pEditAction = new editDeleteConsensusTag( pTag_ ); } ConsEd::pGetConsEd()->doEditAction( pEditAction, true ); // write to edit history file // pop down this popup delete this; } void guiPopupTagInfo :: userPushedOK() { char* szValue = XmTextFieldGetString( widStartUnpaddedConsPosValue_ ); RWCString soValue( szValue ); XtFree( szValue ); int nPerhapsStartUnpaddedConsPos; if (!bIsNumericMaybeWithWhitespace( soValue, nPerhapsStartUnpaddedConsPos ) ) { GuiApp::popupErrorMessage( "Start Unpadded Consensus Position must be numeric" ); return; } szValue = XmTextFieldGetString( widEndUnpaddedConsPosValue_ ); soValue = szValue; XtFree( szValue ); int nPerhapsEndUnpaddedConsPos; if (!bIsNumericMaybeWithWhitespace( soValue, nPerhapsEndUnpaddedConsPos )) { GuiApp::popupErrorMessage( "End Unpadded Consensus Position must be numeric" ); return; } bool bOKToPopDown = false; checkValues( nPerhapsStartUnpaddedConsPos, nPerhapsEndUnpaddedConsPos, bOKToPopDown ); szValue = XmTextGetString( widComment_ ); pTag_->changeTagComment( szValue ); XtFree( szValue ); ConsEd::pGetConsEd()->refreshAllContigWinsAndAllTeditors(); if (bOKToPopDown) delete this; } void guiPopupTagInfo :: checkValues( const int nPerhapsStartTagUnpaddedConsPos, const int nPerhapsEndTagUnpaddedConsPos, bool& bOKToPopDown ) { bOKToPopDown = false; bool bOK = pTag_->bCheckTag( nPerhapsStartTagUnpaddedConsPos, nPerhapsEndTagUnpaddedConsPos ); if (!bOK) return; bOK = pTag_->bCheckTagExtraInformation(); if (!bOK) return; // if reached here, all checks passed. So change values pTag_->changeTag( nPerhapsStartTagUnpaddedConsPos, nPerhapsEndTagUnpaddedConsPos ); pTag_->changeTagExtraInformation(); bOKToPopDown = true; } void guiPopupTagInfo :: raiseWindow() { XtMapWidget( widPopupShell_ ); XRaiseWindow( XtDisplay( widPopupShell_ ), XtWindow( widPopupShell_ ) ); } void guiPopupTagInfo :: addTagID() { if ( pTag_->lID_ != nUndefinedTagID ) { popupErrorMessage( "tag ID is already set (%d)", pTag_->lID_ ); return; } Assembly* pAssembly = ConsEd::pGetAssembly(); ++pAssembly->lLastUsedTagID_; pTag_->lID_ = pAssembly->lLastUsedTagID_; if ( pTag_->bReadTagNotConsensusTag_ ) { pTag_->pLocFrag_->setChanged(); } else { pTag_->pGetContig()->setChanged(); } updateTagIDOnScreen(); } void guiPopupTagInfo :: removeTagID() { if ( pTag_->lID_ == nUndefinedTagID ) { popupErrorMessage( "tag id is currently not set" ); return; } Assembly* pAssembly = ConsEd::pGetAssembly(); // first check if any other tag is referencing this tag // Must check all consensus tags and all read tags. RWCString soMessage; int nTag; for( int nContig = 0; nContig < pAssembly->nNumContigs(); ++nContig ) { Contig* pContig = pAssembly->pGetContig( nContig ); // look through consensus tags for( nTag = 0; nTag < pContig->nGetNumberOfTags(); ++nTag ) { tag* pTag = pContig->pGetTag( nTag ); if ( pTag->pArrayOfUserDefinedTagFields_ ) { for( int nUserDefinedTagField = 0; nUserDefinedTagField < pTag->pArrayOfUserDefinedTagFields_->length(); ++nUserDefinedTagField ) { userDefinedTagField* pUserDefinedTagField = (*pTag->pArrayOfUserDefinedTagFields_)[ nUserDefinedTagField ]; if ( pUserDefinedTagField->bIsPointerTypeWithThisID( pTag_->lID_ ) ) { soMessage += "consensus tag type "; soMessage += pTag->soType_; soMessage += " in "; soMessage += pTag->pGetContig()->soGetName(); soMessage += " from "; soMessage += RWCString( (long) pContig->nUnpaddedIndex( pTag->nPaddedConsPosStart_ ) ); soMessage += " to "; soMessage += RWCString( (long) pContig->nUnpaddedIndex( pTag->nPaddedConsPosEnd_ ) ); soMessage += " "; } } // for( int nUserDefinedTagField = 0; } // if ( pTag->pArrayOfUserDefinedTagFields_ ) { } // for( nTag = 0; ... // look through read tags for( int nRead = 0; nRead < pContig->nGetNumberOfFragsInContig(); ++nRead ) { LocatedFragment* pLocFrag = pContig->pLocatedFragmentGet( nRead ); for( nTag = 0; nTag < pLocFrag->nGetNumberOfTags(); ++nTag ) { tag* pTag = pLocFrag->pGetTag( nTag ); if ( pTag->pArrayOfUserDefinedTagFields_ ) { for( int nUserDefinedTagField = 0; nUserDefinedTagField < pTag->pArrayOfUserDefinedTagFields_->length(); ++nUserDefinedTagField ) { userDefinedTagField* pUserDefinedTagField = (*pTag->pArrayOfUserDefinedTagFields_)[ nUserDefinedTagField ]; if ( pUserDefinedTagField->bIsPointerTypeWithThisID( pTag_->lID_ ) ) { soMessage += "consensus tag type "; soMessage += pTag->soType_; soMessage += " in "; soMessage += pTag->pGetContig()->soGetName(); soMessage += " from "; soMessage += RWCString( (long) pContig->nUnpaddedIndex( pTag->nPaddedConsPosStart_ ) ); soMessage += " to "; soMessage += RWCString( (long) pContig->nUnpaddedIndex( pTag->nPaddedConsPosEnd_ ) ); soMessage += " "; } } // for( int nUserDefinedTagField = 0; } // if ( pTag->pArrayofuserDefinedTagFields_ ) { } // for( nTag = 0; } // for( int nRead = 0; } // for( int nContig ... if ( !soMessage.isNull() ) { RWCString soMessage2 = "This tag is referenced by several other tags: "; soMessage2 += soMessage; soMessage2 += "\n\nIf you remove this tag's id and leave the other tags, this database may become unusable. Are you sure you want to remove this tag's id? (Y/N)"; if ( !bGuiGetAnswerYesNo( soMessage2 ) ) return; } // if reached here, ok to remove tag's id pTag_->lID_ = nUndefinedTagID; updateTagIDOnScreen(); if ( pTag_->bReadTagNotConsensusTag_ ) { pTag_->pLocFrag_->setChanged(); } else { pTag_->pGetContig()->setChanged(); } } void guiPopupTagInfo :: updateTagIDOnScreen() { RWCString soID; if ( pTag_->lID_ == nUndefinedTagID ) soID = "(none)"; else soID = RWCString( pTag_->lID_ ); XmTextFieldSetString( widID_, soID.data() ); }