/*****************************************************************************
#   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.
#
#*****************************************************************************/
//
// editaction.cpp
//
// implementation for edit actions
// for now contains only defaults and overrides of refresh functions.
//




#include "editaction.h"
#include "contigwin.h"
#include "teditor.h"
#include    "consed.h"
// required for g++ template instanciation or else will give error:
// g++ -DANSI_C -w  -I/usr/local/rogue  -I/usr/X11R6/include -c editaction.cpp
// /usr/local/rogue/rw/tpordvec.cc: In method `unsigned int RWTPtrOrderedVector<TedWin>::index(const class TedWin *) const':
// /usr/local/rogue/rw/tpordvec.cc:93: no match for `TedWin & == const TedWin &'
#include "tedwin.h"
#include "consedParameters.h"




EditAction :: EditAction() : nTypeID_( nEditAction )  {
   if ( ConsEd::pGetAssembly()->bReadOnly_ ) {
      ostrstream ost;
      ost << ConsEd::pGetAssembly()->soErrorMessageWhenTryToEditReadOnlyAssembly_ 
          << ends;
      InputDataError ide( ost.str() );
      throw ide;
   }
}




// called by the ConsEd for all Teditors after the edit has completed.
// override this if derived edit action requires something special.
void EditAction :: refreshContigWin(ContigWin* pContigWin) {
   // the default refresh is to generate a full exposure and redraw
   pContigWin->drawBasesAndConsensus( true ); // erase first
}


// called by the ContigWin for all its child Teditors after the edit 
// has completed.
// override this if derived edit action requires something special.
void EditAction :: refreshTeditor(Teditor* pTeditor) { 
   pTeditor->refreshAllTedWins( false ); 
   // if there is a need to recalculate base positions (such as
   // in case of adding a column of pads), this routine can be
   // overridden
}


void EditAction :: writeUndoEditToEditHistoryFile() {

   ConsEd :: pGetConsEd()->pAssemblyGet()->writeEditToEditHistoryFile( 
            "undo" );
}



void EditAction :: doEdit( const bool bWriteToEditHistoryFile ) {

   if ( pCP->bReadOnly_ && ( nTypeID_ != nEditComplementContig ) ) {
      RWCString soErrorMessage = "This process was started -read_only but now you are trying to edit it.";
      InputDataError ide( soErrorMessage );
      throw ide;
   }

   doEditSpecific();
   setChangedIfNecessary();
   if ( bWriteToEditHistoryFile )
     writeEditToEditHistoryFile();
}