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;
}
Beispiel #2
0
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);
	}
}