function RedetectMainVersionFor(AImage: TImageItem): Boolean;
var
AVDO: TidVersionDetectionObject;
AMainDI, AVersionDI: TidVersionDetectionItem;
ANewMainDI: TidVersionDetectionItem;
AMainVersion, AVersion: TCatalogItem;
AVersions: TCatalogItems;
i: Integer;
begin
result := False;
AMainVersion := TCatalogItem.Create(nil);
AVersions := TCatalogItems.Create(TCatalogItem, '');
AVDO := TidVersionDetectionObject.Create;
AMainDI := TidVersionDetectionItem.Create(nil);
if not PublicCatalog.FindMainVersionForImage(AImage, AMainVersion) then
AMainVersion.PopFromImage(AImage, False);
PublicCatalog.EnumVersionsForItem(AMainVersion, AVersions);
if AVersions.Count > 0 then
begin
AMainDI.ItemGUID := AMainVersion.GUID;
AMainDI.FileName := AMainVersion.FileName;
AMainDI.MediumType := AMainVersion.MediumType;
AMainDI.MediumName := AMainVersion.MediumName;
AMainDI.MediumSerial := AMainVersion.MediumSerial;
AMainDI.ReferenceCatalogItem := AMainVersion;
for i := 0 to AVersions.Count - 1 do
begin
AVersion := AVersions.Items[i];
AVersionDI := AMainDI.Versions.Add;
AVersionDI.ItemGUID := AVersion.GUID;
AVersionDI.FileName := AVersion.FileName;
AVersionDI.MediumType := AVersion.MediumType;
AVersionDI.MediumName := AVersion.MediumName;
AVersionDI.MediumSerial := AVersion.MediumSerial;
AVersionDI.ReferenceCatalogItem := AVersion;
end;
ANewMainDI := AVDO.MatchFor(AMainDI, PublicOptions.VersionMatchSettings.MainVersionMatching, nil);
if Assigned(ANewMainDI) then
begin
if ANewMainDI.ItemGUID = AMainDI.ItemGUID then
begin
// store the new main version
PublicCatalog.UpdateMainVersion(AMainDI.ReferenceCatalogItem, ANewMainDI.ReferenceCatalogItem);
result := True;
end;
end;
end;
AMainDI.Free;
AVDO.Free;
AVersions.Free;
AMainVersion.Free;
end;
var
AProgress: TxomProgress;
i, AHit: Integer;
begin
AProgress := TxomProgress.Create(nil);
AProgress.Caption := 'Redetecting main versions';
AProgress.Max := Selected.Count;
AHit := 0;
for i := 0 to Selected.Count - 1 do
begin
AProgress.Pos := i + 1;
if RedetectMainVersionFor(Selected.Items[i]) then
AHit := AHit + 1;
end;
AProgress.Free;
if AHit > 0 then
Say('Done. ' + IntToStr(AHit) + 'main versions have been updated.')
else
Say('No changes needed.');
end;
|