Пример #1
0
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);
        }
    }
}
Пример #2
0
//------------------------------------------------------------------------------
// 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;
}
Пример #3
0
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();
    }
}
Пример #4
0
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;
}