void CFlatHeaderCtrl::AutoSizeItemsImpl(INT iItem) { ASSERT(iItem >= -1); INT i, iItems = GetItemCount(), iTemp; INT iOrder = -1; if(iItems <= 0) return; HDITEM hditem; HDITEMEX hditemex; if(iItem >= 0) { hditem.mask = HDI_ORDER; GetItem(iItem, &hditem); iOrder = hditem.iOrder; if(iOrder == iItems-1) { iItem = -1; iOrder = -1; } } CArray<FHAUTOSIZE, FHAUTOSIZE&> arrayItems; arrayItems.SetSize(iItems); INT iWidth = 0; INT iMinWidth = 0; INT iMaxWidth = 0; for(i=iOrder+1; i<iItems; i++) { INT iIndex = OrderToIndex(i); hditem.mask = HDI_WIDTH; VERIFY(GetItem(iIndex, &hditem)); VERIFY(GetItemEx(iIndex, &hditemex)); FHAUTOSIZE fhas; fhas.iIndex = iIndex; fhas.iWidth = hditem.cxy; fhas.iMinWidth = hditemex.iMinWidth; fhas.iMaxWidth = hditemex.iMaxWidth; arrayItems[i] = fhas; iWidth += fhas.iWidth; iMinWidth += fhas.iMinWidth; iMaxWidth += MAXWIDTH(fhas.iMaxWidth); } ASSERT(GetParent() != NULL); CRect rectClient; GetParent()->GetClientRect(rectClient); if(rectClient.Width() <= 0) return; INT iClientWidth = max(rectClient.Width(), iMinWidth); if(iItem >= 0) { CRect rectItem; GetItemRect(iItem, rectItem); iClientWidth -= rectItem.right; } if(iOrder >= 0) { FHAUTOSIZE& fhas = arrayItems[iOrder]; iTemp = min(fhas.iWidth, iClientWidth - iMinWidth); iTemp = max(fhas.iMinWidth, iTemp); iTemp = min(MAXWIDTH(fhas.iMaxWidth), iTemp); arrayItems[iOrder].iWidth = iTemp; iWidth -= iTemp; iClientWidth -= iTemp; } iWidth = max(1, iWidth); INT iResult = 0; for(i=iOrder+1; i<iItems; i++) { FHAUTOSIZE& fhas = arrayItems[i]; iTemp = max(fhas.iMinWidth, (fhas.iWidth * iClientWidth)/iWidth); iTemp = min(MAXWIDTH(fhas.iMaxWidth), iTemp); arrayItems[i].iWidth = iTemp; iResult += iTemp; } if(iResult != iClientWidth) { INT iLast = -1; i = iOrder+1; while(iResult != iClientWidth && iResult != iLast) { FHAUTOSIZE& fhas = arrayItems[i]; iTemp = fhas.iWidth; if(iResult < iClientWidth && iTemp < MAXWIDTH(fhas.iMaxWidth)) { iTemp = min(iTemp+1, MAXWIDTH(fhas.iMaxWidth)); iResult += iTemp - fhas.iWidth; } else if(iResult > iClientWidth && iTemp > fhas.iMinWidth) { iTemp = max(iTemp-1, fhas.iMinWidth); iResult -= fhas.iWidth - iTemp; } iLast = iResult; arrayItems[i].iWidth = iTemp; i = i+1 < iItems ? i+1:iOrder+1; } } m_bAutoSizing = TRUE; for(i=iOrder+1; i<iItems; i++) { hditem.mask = HDI_WIDTH; hditem.cxy = arrayItems[i].iWidth; VERIFY(SetItem(arrayItems[i].iIndex, &hditem)); } m_bAutoSizing = FALSE; }
static void xa_unar_parse_output (gchar *line, XArchive *archive) { XEntry *entry; gpointer item[6]; gchar *index, *flags, *filename; gboolean dir, encrypted, link; guint shift; USE_PARSER; if (last_line) return; if (strncmp(line, " ", 5) == 0) { data_line = TRUE; return; } if (!data_line) { if (strstr(line, ": Tar in ")) { XArchiveType type = archive->type; xa_get_compressed_tar_type(&type); archiver[type].program[0] = g_strdup(archiver[archive->type].program[0]); archiver[type].program[1] = g_strdup(archiver[archive->type].program[1]); archive->type = type; archive->can_test = FALSE; } return; } if (*line == '(') { last_line = TRUE; return; } /* index (may exceed column width) */ NEXT_ITEM(index); shift = MAXWIDTH(index, 4); /* flags */ NEXT_ITEM(flags); dir = (flags[0] == 'D'); link = (flags[2] == 'L'); encrypted = (flags[3] == 'E'); if (encrypted) archive->has_password = TRUE; /* file size */ NEXT_ITEM(item[1]); /* ratio (may exceed column width) */ NEXT_ITEM(item[2]); shift += MAXWIDTH(item[2], 6); /* mode */ NEXT_ITEM(item[5]); /* date */ NEXT_ITEM(item[3]); /* time */ if (strcmp(item[3], "----------------") == 0) { char *item3 = (char *) item[3]; item3[10] = 0; item[4] = item3 + 11; } else NEXT_ITEM(item[4]); /* name */ LAST_ITEM(filename); filename += shift; item[0] = NULL; if (link) { char *l = strstr(filename, " -> "); if (l) { item[0] = l + 4; *l = 0; } } entry = xa_set_archive_entries_for_each_row(archive, filename, item); if (entry) { if (dir) entry->is_dir = TRUE; entry->is_encrypted = encrypted; if (!entry->is_dir) archive->files++; archive->files_size += g_ascii_strtoull(item[1], NULL, 0); } }