00001 #include "movealgo.h"
00002 #include "algoparam.h"
00003 #include <iostream>
00004 #include "readdata.h"
00005 #include "generaldata.h"
00006 #include <vector>
00007 #include <cassert>
00008 #include "readsinrect.h"
00009 #include <fstream>
00010
00011 using namespace std;
00012
00013 void MoveAlgo::start()
00014 {
00015 if ( selectedReads.empty() ) {
00016 return;
00017 }
00018
00019 bool allow_overlap(true);
00020
00021 AlgoMoveParam* param = (AlgoMoveParam*)my_param;
00022 assert(param);
00023
00024 int y_delta = param->get_y_delta();
00025 int x_delta = param->get_x_delta();
00026
00027 if ( y_delta == 0 && x_delta == 0) {
00028 return;
00029 }
00030
00031
00032
00033
00034
00035 vector<ReadData> readvec;
00036
00037
00038 for (set< db_recno_t >::iterator it = selectedReads.begin(); it != selectedReads.end(); it++ ){
00039
00040
00041 Database::PrimaryIterator<ReadData>* read_it = new Database::PrimaryIterator<ReadData>(pDoc, "ReadData");
00042
00043 int ret_read = read_it->setFromRecno(*it);
00044 ReadData* r_test = (ret_read != DB_NOTFOUND) ? read_it->answer() : 0;
00045 assert( r_test );
00046 assert( ret_read == 0 );
00047 readvec.push_back( *r_test );
00048
00049
00050
00051
00052 if ( (static_cast<int>(r_test->row()) + y_delta) < 0 ||
00053 (static_cast<int>(r_test->startPos()) + x_delta) < 0 ) {
00054 param->set_y_delta(0);
00055 param->set_x_delta(0);
00056
00057 cerr<<"Read will end up on negative row or col, cancelling move "<<endl;
00058 delete read_it;
00059 return;
00060 }
00061 else {
00062 delete read_it;
00063 }
00064
00065 }
00066
00067
00068
00069 for(size_t i = 0; i < readvec.size(); i++ ) {
00070
00071
00072
00073
00074 ReadsInRect* dest_it = new ReadsInRect(pDoc);
00075 dest_it->setWindowCoord( readvec[i].startPos() + x_delta, readvec[i].row() + y_delta, readvec[i].endPos() - readvec[i].startPos(), 1);
00076
00077 if ( !allow_overlap && dest_it->first() ) {
00078
00079
00080 delete dest_it;
00081 }
00082 else {
00083 delete dest_it;
00084 Database::Creator<ReadData> a_creator(pDoc, "ReadData");
00085
00086 a_creator.data()->setRecno(readvec[i].getRecno());
00087 a_creator.data()->setRow(readvec[i].row() + y_delta);
00088 a_creator.data()->setStartPos(readvec[i].startPos() + x_delta);
00089 a_creator.data()->setEndPos(readvec[i].endPos() + x_delta);
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 a_creator.create(true);
00101 }
00102
00103 }
00104 }
00105