BOOL LLImageWorker::requestDecodedAuxData(LLPointer<LLImageRaw>& raw, S32 channel, S32 discard) { // For most codecs, only mDiscardLevel data is available. // (see LLImageDXT for exception) if (discard >= 0 && discard != mFormattedImage->getDiscardLevel()) { llerrs << "Request for invalid discard level" << llendl; } checkWork(); if (mDecodedType == -2) { return TRUE; // aborted, done } if (mDecodedType != channel) { if (!haveWork()) { addWork(channel, mPriority); } return FALSE; } else { llassert_always(!haveWork()); llassert_always(mDecodedType == channel); raw = mDecodedImage; // smart pointer acquires ownership of data mDecodedImage = NULL; return TRUE; } }
bool complete() { return checkWork(); }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Блок действий с работой/доплатой //------------------------------------------------------------------------------ //===================================================================== // добавление/редактирование работы TWork* TController::addWork() { bool payment = false; // добавляется доплата или работа if(formWork->rgType->ItemIndex == 1) payment = true; //-------------------------------------------------------------------------- /* 1) проверяются, заполнены ли все поля */ if((Trim(formWork->edtNumber->Text) == "") || (Trim(formWork->memoTitle->Text) == "")) { ShowMessage("Не все поля заполнены!"); return NULL; } //-------------------------------------------------------------------------- // если добавляется доплата, смотрим, есть ли такая работа if(payment) { bool flag = false; // есть ли такая работа int wnum = 0; for(int i=0; i<selectedKHR->Works.size(); i++) { if(StrToInt(formWork->edtNumber->Text) == selectedKHR->Works[i]->ulWorkNum) { flag = true; wnum = i; } } if(!flag) { ShowMessage("Нет работы, к которой добавляется доплата."); return NULL; } else if (selectedKHR->Works[wnum]->havePayment && selectedWork == NULL) { ShowMessage("У этой работы уже есть доплата."); return NULL; } } else /* проверка на наличие такой работы */ { for(int i=0; i<selectedKHR->Works.size(); i++) { // собственный номер работы пропускается if((selectedWork != NULL) && (selectedWork->ulWorkNum == selectedKHR->Works[i]->ulWorkNum)) break; else if(StrToInt(formWork->edtNumber->Text) == selectedKHR->Works[i]->ulWorkNum && (!payment)) { ShowMessage("Работа с таким номером существует!"); return NULL; } } } //-------------------------------------------------------------------------- /* проверка правильности ввода дат начала и окончания */ if((int)formWork->dtStartDate->Date > (int)formWork->dtEndDate->Date) { ShowMessage("Работа не может начинаться раньше, чем заканчивается!"); return NULL; } //-------------------------------------------------------------------------- /* заполнение информации о работе */ TWork *newWork = new TWork; newWork->ulWorkNum = StrToInt(formWork->edtNumber->Text); if(payment) newWork->bPayment = true; else newWork->bPayment = false; newWork->szTitle = STR(formWork->memoTitle->Text); for (int i=0; i < formWork->sgWorks->RowCount; i++) { if(formWork->sgWorks->Cells[0][i] != "") { if(StrToInt(formWork->sgWorks->Cells[0][i]) != newWork->ulWorkNum) { if(Model->existWork(selectedKHR, StrToInt(formWork->sgWorks->Cells[0][i]))) { // добавить проверку на наличие такой работы в КХР TDependance *dep=new TDependance; dep->ulWork = StrToInt(formWork->sgWorks->Cells[0][i]); if(formWork->listReq->Items->Item[i]->Checked == true) dep->bNeedToStart = true; else dep->bNeedToStart = false; newWork->WorkDep.push_back(dep); } else { ShowMessage("Нет работы с номером, указанным в зависимости!"); delete newWork; return NULL; } } else { ShowMessage("У работы не может быть связь от самой себя!"); delete newWork; return NULL; } } } newWork->dtStart = StrToDate(DateToStr(formWork->dtStartDate->Date)); newWork->dtEnd = StrToDate(DateToStr(formWork->dtEndDate->Date)); newWork->ulLength = Model->numWorkDays(newWork->dtStart, newWork->dtEnd); newWork->center.x = workCoord.x; newWork->center.y = workCoord.y; /* в случае если происходит редактирование работы, её состояние и координаты должны сохраняться */ if(!formMain->AddOrEdit) newWork->eWorkState = selectedWork->eWorkState; else newWork->eWorkState = E_WS_OPEN; //-------------------------------------------------------------------------- /* 3) проверка на корректность связей: для доплаты проверка не производится */ if (formWork->cbCorrect->Checked == true && !payment) { if(!checkWork(selectedKHR, newWork)) { ShowMessage("Связи некорректны! "); delete newWork; return NULL; } } //-------------------------------------------------------------------------- /* 4) проверка на наличие исполнителей */ for (int i=0; i < formWork->sgVolume->RowCount; i++) { if(formWork->sgVolume->Cells[0][i] != "") //если строчка заполнена { // проверка на наличие исполнителя if(!Model->checkExecutor(selectedKHR, STR(formWork->sgVolume->Cells[0][i]))) { if(MessageDlg("Такого исполнителя: " + formWork->sgVolume->Cells[0][i]+ " - не существует! Добавить в список?", mtInformation, TMsgDlgButtons() << mbNo << mbYes , 7) == 7) { // нажата кнопка "Отмена" delete newWork; return NULL; } else { // добавление нового исполнителя в список Model->addExecutor(selectedKHR, STR(formWork->sgVolume->Cells[0][i])); TWorkVolume *vol = new TWorkVolume; int id = Model->executorByName(selectedKHR, STR(formWork->sgVolume->Cells[0][i])); vol->ulExecutor = id; for(int j=1; j<formWork->sgVolume->ColCount; j++) { if(formWork->sgVolume->Cells[j][i] != "") { if(StrToFloat(Trim(formWork->sgVolume->Cells[j][i])) != 0) { bool k = Model->checkQuart(j, newWork->dtStart, newWork->dtEnd); if(!k) { ShowMessage("Неправильно распределена трудоёмкость по кварталам!"); delete newWork; return NULL; } } vol->ulVolume[j-1] = StrToInt(formWork->sgVolume->Cells[j][i]); } else vol->ulVolume[j-1] = 0; } newWork->WorkVolume.push_back(vol); } } else { // исполнитель существует TWorkVolume *vol = new TWorkVolume; int id = Model->executorByName(selectedKHR, STR(formWork->sgVolume->Cells[0][i])); vol->ulExecutor = id; for(int j=1; j<formWork->sgVolume->ColCount; j++) { if(formWork->sgVolume->Cells[j][i] != "") { if(StrToFloat(Trim(formWork->sgVolume->Cells[j][i])) != 0) { bool k = Model->checkQuart(j, newWork->dtStart, newWork->dtEnd); if(!k) { ShowMessage("Неправильно распределена трудоёмкость по кварталам!"); delete newWork; return NULL; } } vol->ulVolume[j-1] = StrToInt(formWork->sgVolume->Cells[j][i]); } else vol->ulVolume[j-1] = 0; } newWork->WorkVolume.push_back(vol); } } } // установка связи доплаты с работой при редактировании доплаты if(payment) if(!formMain->AddOrEdit) { for(int i = 0;i < selectedKHR->Works.size(); i ++) { if(selectedKHR->Works[i]->ulWorkNum == newWork->ulWorkNum) { selectedKHR->Works[i]->havePayment = true; Model->addPayment(selectedKHR->Works[i], selectedWork); } if(selectedKHR->Works[i]->ulWorkNum == selectedWork->ulWorkNum) { selectedKHR->Works[i]->connectPayment.clear(); selectedKHR->Works[i]->havePayment = false; } } } // Изменение номера редактируемой работы у связанных с ней работ, доплат, вех if(!formMain->AddOrEdit) if(selectedWork->ulWorkNum != newWork->ulWorkNum) { vector <TWork*> workNext = Model->getNext(selectedKHR, selectedWork); vector <TWork*> workPrev; for(int t = 0; t < workNext.size(); t ++) for(int i = 0; i < selectedKHR->Works.size(); i++) if(selectedKHR->Works[i]->ulWorkNum == workNext[t]->ulWorkNum) { for(int j = 0; j < selectedKHR->Works[i]->WorkDep.size(); j++) if(selectedKHR->Works[i]->WorkDep[j]->ulWork == selectedWork->ulWorkNum) selectedKHR->Works[i]->WorkDep[j]->ulWork = newWork->ulWorkNum; } for(int i = 0; i < selectedKHR->Payments.size(); i++) if(selectedKHR->Payments[i]->ulWorkNum == selectedWork->ulWorkNum) selectedKHR->Payments[i]->ulWorkNum = newWork->ulWorkNum; for(int i = 0; i < selectedKHR->Stages.size(); i++) if(selectedKHR->Stages[i]->ulStageNum == selectedWork->ulWorkNum) selectedKHR->Stages[i]->ulStageNum = newWork->ulWorkNum; for(int i =0; i < selectedKHR->Connects.size(); i++) if(selectedKHR->Connects[i]->begin == selectedWork->ulWorkNum) selectedKHR->Connects[i]->begin = newWork->ulWorkNum; } /* проверки пройдены, работа включается в список новая работа => добавление */ if(formMain->AddOrEdit) { selectedWork = newWork; if(formWork->rgType->ItemIndex == 0) { selectedKHR->Works.push_back(newWork); Model->addConnections(selectedKHR, selectedWork); } else { // нужно изменить информацию о работе, к кот. добавляется доплата TWork* pwork = getWorkByNum(selectedKHR, newWork->ulWorkNum); pwork->havePayment = true; Model->addPayment(pwork, newWork); selectedKHR->Payments.push_back(newWork); } } else { newWork->center.x = selectedWork->center.x ; newWork->center.y = selectedWork->center.y ; Model->editWork(selectedWork, newWork); if(!selectedWork->bPayment) Model->addConnections(selectedKHR, selectedWork); coordClear(); delete newWork; } // clearSelected(); // ни работа, ни КХР не выбрана return selectedWork; }