void justify(QStringList& text, int textWidth) { for (int i = 0; i < text.length(); ++i) { int length = text[i].length(); // Разбить строку. if (length > textWidth) { QString after; breakLine(text[i], after, textWidth); // Если строка не последняя, вставить часть после переноса в // начало следующей строки. if (i != text.length() - 1) { text[i + 1] = after + ' ' + text[i + 1]; } else { text << after; } } // Удлинить только не первую и не последнюю строку. else if (text.length() != 1 && (text.length() == 1 || i != text.length() - 1)) { fillSpaces(text[i], textWidth); } } }
//------------------------------------------------------------------------------ // queryRunwayByIdent() -- find runway record by its identifier (airport_id + // runway end identifier). Therefore, each runway records will respond to two // identifiers: airport_id + high_end_id and airport_id + low_end_id. //------------------------------------------------------------------------------ int AirportLoader::queryRunwayByIdent(const char* id) { // Use queryByKey() find the airport queryByKey(id); // keep a pointer to the airport AirportKey* apk = 0; if (nql == 1) apk = static_cast<AirportKey*>(ql[0]); // find the runway that matches the identifier nql = 0; if (apk != 0) { char rwId[RW_XE_IDENT_LEN+1]; lcStrncpy(rwId,RW_XE_IDENT_LEN+1,&id[AP_KEY_LEN],RW_XE_IDENT_LEN); rwId[RW_XE_IDENT_LEN] = '\0'; fillSpaces(rwId,RW_XE_IDENT_LEN); char rwId2[RW_XE_IDENT_LEN+1]; lcStrncpy(rwId2,RW_XE_IDENT_LEN+1,&id[AP_KEY_LEN],RW_XE_IDENT_LEN); rwId2[RW_XE_IDENT_LEN] = '\0'; stripSpaces(rwId2,RW_XE_IDENT_LEN); for (RunwayKey* rwk = apk->runways; rwk != 0; rwk = rwk->next) { if ( (strncmp( &rwk->key[AP_KEY_LEN], rwId, RW_XE_IDENT_LEN ) == 0) || (strncmp( &rwk->key[AP_KEY_LEN+RW_XE_IDENT_LEN], rwId2, RW_XE_IDENT_LEN ) == 0) ) { ql[nql++] = rwk; } } } // limit number of result records if (qlimit > 0 && nql > qlimit) nql = qlimit; return nql; }
void breakLine(QString& str, QString& after, int textWidth) { if (str.length() <= textWidth) { return; } // Найти слово, которое находится на границе textWidth. int beginWordPosition = str.lastIndexOf(' ', textWidth - 1) + 1; int endWordPosition = str.indexOf(' ', textWidth - 1) - 1; // Граничное слово находится в конце строки. if (endWordPosition == -2) { endWordPosition = str.length() - 1; } // Слово состоит из одной буквы. if (beginWordPosition == endWordPosition + 2) { endWordPosition = beginWordPosition; } int wordLength = endWordPosition - beginWordPosition + 1; QString word = str.mid(beginWordPosition, wordLength); // Слово начинается на границе ширины текста. if (beginWordPosition == textWidth - 1 && wordLength != 1) { QString temp = str.left(textWidth - 1); after = str.right(str.length() - temp.length()); temp = temp.trimmed(); if (temp.length() < textWidth) { fillSpaces(temp, textWidth); } str = temp.trimmed(); return; } // Расставить в слове мягкие переносы. placeHyphens(word, word); // В слове нельзя сделать перенос. if (word.count('\1') == 0) { // Слово целиком умещается в ширину текста. if (beginWordPosition + wordLength <= textWidth) { after = str.right(str.length() - textWidth).trimmed(); str.chop(str.length() - textWidth); str = str.trimmed(); if (str.length() < textWidth) { fillSpaces(str, textWidth); } str = str.trimmed(); return; } else { QString temp = str.left(textWidth); after = str.right(str.length() - temp.length()); str = temp.trimmed(); if (str.length() < textWidth) { fillSpaces(str, textWidth); } str = str.trimmed(); return; } } // Вычислить максимальную длину слова до переноса, как разницу индексов // максимально допустимого символа, умещающегося в ширину текста, и начала // слова (символ переноса не входит в эту длину). int maxWordLengthBeforeBreak = (textWidth - 1) - beginWordPosition; // Так как в слове появились мягкие переносы, то нужно увеличить // максимальную длину слова до переноса на количество символов, // встретившихся перед прежней длиной. for (int i = 0; i < maxWordLengthBeforeBreak; ++i) { if (word[i] == '\1') { ++maxWordLengthBeforeBreak; } } if (word[maxWordLengthBeforeBreak] == '\1') { ++maxWordLengthBeforeBreak; } // Индекс переноса. int breakIndex = word.lastIndexOf('\1', maxWordLengthBeforeBreak - 1); // В слове можно сделать перенос с учетом ограничения на длину. if (breakIndex != -1) { // Заменить мягкий перенос на '\2' в позиции, не превышающей // максимальную длину слова до переноса. Замена производится именно на // '\2', а не на знак дефиса, т. к. в строке уже может быть знак дефиса. // Иначе не получится легко определить индекс, где нужно разделить // строки на две. word[breakIndex] = '\2'; // Удалить все мягкие переносы. word.replace('\1', ""); // Вставить слово с переносом в строку. str.remove(beginWordPosition, wordLength); str.insert(beginWordPosition, word); // Разделить строку на две. QStringList strings = str.split('\2'); str = strings[0] + "-"; if (str.length() < textWidth) { fillSpaces(str, textWidth); } after = strings[1]; str = str.trimmed(); } // В слове нельзя сделать перенос с учетом ограничения на длину. // Разделяем строку по границе начала граничного слова. else { after = str.right(str.length() - beginWordPosition); str.chop(str.length() - beginWordPosition); if (str.length() < textWidth) { fillSpaces(str, textWidth); } str = str.trimmed(); } }
const char* AirportLoader::createIlsRecord(const Key* key) { IlsKey* ilsk = (IlsKey*) key; // --- // first record (format == 5) // --- // format code dsGetString(&irec[FORMAT_CODE_POS-1], "05", FORMAT_CODE_LEN ); // transaction code fillSpaces(irec,TRANSACTION_CODE_POS-1); dsGetString(&irec[TRANSACTION_CODE_POS-1], "1", TRANSACTION_CODE_LEN); // key -- Airport id + runway id + component type fillSpaces(irec, ILS_KEY_POS-1); dsGetString(&irec[ILS_KEY_POS-1], ilsk->key, ILS_KEY_LEN); // Name fillSpaces(irec, ILS_NAME_POS-1); dsGetString(&irec[ILS_NAME_POS-1], ilsk->name, ILS_NAME_LEN); // Frequency fillSpaces(irec, ILS_FREQUENCY_POS-1); int ifreq = int( ilsk->freq * 1000.0f + 0.5f ); std::sprintf( &irec[ILS_FREQUENCY_POS-1], "%7dM", ifreq ); // Channel fillSpaces(irec, ILS_CHANNEL_POS-1); std::sprintf( &irec[ILS_CHANNEL_POS-1], "%3dX", ilsk->chan ); // Glide slope fillSpaces(irec, ILS_GSA_POS-1); int igs = int( ilsk->gs * 100.0f + 0.5f ); std::sprintf( &irec[ILS_GSA_POS-1], "%3d", igs ); // Location of localizer or glide slope fillSpaces(irec, ILS_LOC_POS-1); if ( ilsk->type == Ils::glideSlope ) { irec[ILS_LOC_POS-1] = ' '; } else { irec[ILS_LOC_POS-1] = '+'; } std::sprintf( &irec[ILS_LOC_POS], "%05d", ilsk->loc ); // Elevation fillSpaces(irec, ILS_ELEVATION-1); std::sprintf( &irec[ILS_ELEVATION-1], "%5d", ilsk->elev ); // Latitude fillSpaces(irec, ILS_LATITUDE-1); printLatitude( &irec[ILS_LATITUDE-1], ilsk->lat ); // Longitude fillSpaces(irec, ILS_LONGITUDE-1); printLongitude( &irec[ILS_LONGITUDE-1], ilsk->lon ); // --- // second record (format == 6) // --- // format code fillSpaces(irec,FORMAT_CODE_POS+142-1); dsGetString(&irec[FORMAT_CODE_POS+142-1], "06", FORMAT_CODE_LEN ); // transaction code fillSpaces(irec,TRANSACTION_CODE_POS+142-1); dsGetString(&irec[TRANSACTION_CODE_POS+142-1], "1", TRANSACTION_CODE_LEN); // key -- Airport id + runway id + component type fillSpaces(irec, ILS_KEY_POS+142-1); dsGetString(&irec[ILS_KEY_POS+142-1], ilsk->key, ILS_KEY_LEN); // identifier fillSpaces(irec, ILS_IDENT_POS-1); dsGetString(&irec[ILS_IDENT_POS-1], ilsk->id, ILS_IDENT_LEN); // Mag Var fillSpaces(irec, ILS_MAGVAR-1); printMagvar( &irec[ILS_MAGVAR-1], ilsk->magvar ); // all finished fillSpaces(irec,ILS_RECORD_LEN); return irec; }