From 669cf750dc57e9a2c2e8d21b812f0afd3ed8d17f Mon Sep 17 00:00:00 2001 From: Mark van Renswoude Date: Mon, 2 Apr 2007 14:45:31 +0000 Subject: [PATCH] Fixed: designtime editor updates properly Fixed: moving images in a graphiclist --- Packages/D7/X2CLGL.dof | 1 + Packages/X2CLGraphicsEditor.pas | 56 +++++++++++----- Source/X2CLGraphicList.pas | 113 +++++++++++++++++++++++++------- 3 files changed, 132 insertions(+), 38 deletions(-) diff --git a/Packages/D7/X2CLGL.dof b/Packages/D7/X2CLGL.dof index 0ba8e21..6d66e47 100644 --- a/Packages/D7/X2CLGL.dof +++ b/Packages/D7/X2CLGL.dof @@ -135,6 +135,7 @@ ProductName= ProductVersion=1.0.0.0 Comments= [Excluded Packages] +P:\Algemeen\components\X2CL\Lib\D7\X2CLGLD.bpl=X²CL GraphicList (Designtime) C:\Program Files\Borland\Indy\D7\dclIndy70.bpl=Internet Direct (Indy) for D7 Property and Component Editors [HistoryLists\hlUnitAliases] Count=1 diff --git a/Packages/X2CLGraphicsEditor.pas b/Packages/X2CLGraphicsEditor.pas index 77fe78c..48817be 100644 --- a/Packages/X2CLGraphicsEditor.pas +++ b/Packages/X2CLGraphicsEditor.pas @@ -73,6 +73,8 @@ type FUpdating: Boolean; procedure InternalExecute(const AComponent: TComponent; const ADesigner: IDesigner); + + procedure LoadGraphic(AIndex: Integer; AGraphic: TX2GraphicContainerItem; const AFileName: string); procedure ItemChanged(AUpdatePreview: Boolean = True); procedure UpdateUI(); @@ -153,6 +155,17 @@ begin end; +procedure TGraphicsEditorForm.LoadGraphic(AIndex: Integer; AGraphic: TX2GraphicContainerItem; const AFileName: string); +begin + AGraphic.Picture.LoadFromFile(AFileName); + if Length(AGraphic.PictureName) = 0 then + begin + AGraphic.PictureName := ChangeFileExt(ExtractFileName(AFileName), ''); + lstGraphics.Items[AIndex] := AGraphic.PictureName; + end; +end; + + procedure TGraphicsEditorForm.ItemChanged(AUpdatePreview: Boolean); begin if Assigned(FComponentDesigner) then @@ -200,7 +213,12 @@ begin if Active(index, graphic) then begin imgPreview.Picture.Assign(graphic.Picture); - txtName.Text := graphic.PictureName; + txtName.Text := graphic.PictureName; + lstGraphics.Items[index] := graphic.PictureName; + end else + begin + imgPreview.Picture.Assign(nil); + txtName.Text := ''; end; finally FUpdating := False; @@ -251,24 +269,33 @@ procedure TGraphicsEditorForm.actAddExecute(Sender: TObject); var index: Integer; graphic: TX2GraphicContainerItem; + fileIndex: Integer; begin if Assigned(FComponentDesigner) then begin - graphic := TX2GraphicContainerItem(FComponentDesigner.CreateComponent(TX2GraphicContainerItem, nil, 0, 0, 0, 0)); + dlgOpen.Filter := GraphicFilter(TGraphic); + dlgOpen.Options := dlgOpen.Options + [ofAllowMultiSelect]; - if Assigned(graphic) then + if dlgOpen.Execute() then begin - graphic.Container := FComponent; - index := lstGraphics.Items.AddObject(graphic.PictureName, - graphic); + for fileIndex := 0 to Pred(dlgOpen.Files.Count) do + begin + graphic := TX2GraphicContainerItem(FComponentDesigner.CreateComponent(TX2GraphicContainerItem, nil, 0, 0, 0, 0)); + + if Assigned(graphic) then + begin + graphic.Container := FComponent; + index := lstGraphics.Items.AddObject('', graphic); + lstGraphics.ItemIndex := index; + + LoadGraphic(index, graphic, dlgOpen.Files[fileIndex]); + end else + raise Exception.Create('Failed to create TX2GraphicContainerItem!'); + end; - lstGraphics.ItemIndex := index; ItemChanged(); - - actOpen.Execute(); - end else - raise Exception.Create('Failed to create TX2GraphicContainerItem!'); + end; end else raise Exception.Create('Designer not found!'); end; @@ -343,12 +370,11 @@ begin if Active(index, graphic) then begin dlgOpen.Filter := GraphicFilter(TGraphic); + dlgOpen.Options := dlgOpen.Options - [ofAllowMultiSelect]; + if dlgOpen.Execute() then begin - graphic.Picture.LoadFromFile(dlgOpen.FileName); - if Length(graphic.PictureName) = 0 then - graphic.PictureName := ChangeFileExt(ExtractFileName(dlgOpen.FileName), ''); - + LoadGraphic(index, graphic, dlgOpen.FileName); ItemChanged(); end; end; diff --git a/Source/X2CLGraphicList.pas b/Source/X2CLGraphicList.pas index fb5bbc7..00d4b33 100644 --- a/Source/X2CLGraphicList.pas +++ b/Source/X2CLGraphicList.pas @@ -101,6 +101,7 @@ type procedure AddGraphic(const AGraphic: TX2GraphicContainerItem); virtual; procedure RemoveGraphic(const AGraphic: TX2GraphicContainerItem); virtual; procedure UpdateGraphic(const AGraphic: TX2GraphicContainerItem); virtual; + procedure MoveGraphic(const AGraphic: TX2GraphicContainerItem; ANewIndex: Integer); virtual; procedure RegisterList(const AList: TX2GraphicList); procedure UnregisterList(const AList: TX2GraphicList); @@ -167,6 +168,7 @@ type procedure AddImage(const AIndex: Integer); virtual; procedure UpdateImage(const AIndex: Integer); virtual; procedure DeleteImage(const AIndex: Integer); virtual; + procedure MoveImage(const AOldIndex, ANewIndex: Integer); virtual; procedure RebuildImages(); virtual; @@ -194,6 +196,7 @@ uses ImgList, SysUtils; + type PClass = ^TClass; @@ -231,6 +234,7 @@ begin FPicture.PictureAdapter := Self; end; + destructor TX2GraphicContainerItem.Destroy(); begin if Assigned(Container) then @@ -284,6 +288,7 @@ begin Result := inherited GetParentComponent(); end; + function TX2GraphicContainerItem.HasParent(): Boolean; begin if Assigned(Container) then @@ -302,6 +307,7 @@ begin Container := TX2GraphicContainer(Reader.Parent); end; + procedure TX2GraphicContainerItem.SetParentComponent(AParent: TComponent); begin if not (csLoading in ComponentState) and (AParent is TX2GraphicContainer) then @@ -316,6 +322,7 @@ begin Result := Container.GraphicsList.IndexOf(Self); end; + procedure TX2GraphicContainerItem.SetContainer(const Value: TX2GraphicContainer); begin if Value <> Container then @@ -331,31 +338,14 @@ begin end; end; + procedure TX2GraphicContainerItem.SetIndex(const Value: Integer); -var - count: Integer; - curIndex: Integer; - newIndex: Integer; - begin - curIndex := GetIndex(); - - if curIndex > -1 then - begin - count := Container.GraphicsList.Count; - newIndex := Value; - - if newIndex < 0 then - newIndex := 0; - - if newIndex >= count then - newIndex := Pred(count); - - if newIndex <> curIndex then - Container.GraphicsList.Move(curIndex, newIndex); - end; + if Assigned(Container) then + Container.MoveGraphic(Self, Value); end; + procedure TX2GraphicContainerItem.SetPicture(const Value: TPicture); begin FPicture.Assign(Value); @@ -442,6 +432,7 @@ begin FLists := TList.Create(); end; + destructor TX2GraphicContainer.Destroy(); begin Clear(); @@ -468,6 +459,7 @@ begin end; end; + function TX2GraphicContainer.GraphicByName(const AName: String): TX2GraphicContainerItem; var graphicIndex: Integer; @@ -479,6 +471,7 @@ begin Result := Graphics[graphicIndex]; end; + function TX2GraphicContainer.PictureByName(const AName: String): TPicture; var graphic: TX2GraphicContainerItem; @@ -535,6 +528,7 @@ begin end; end; + procedure TX2GraphicContainer.SetChildOrder(Component: TComponent; Order: Integer); begin if GraphicsList.IndexOf(Component) >= 0 then @@ -578,7 +572,7 @@ begin begin if AComponent is TX2GraphicContainerItem then RemoveGraphic(TX2GraphicContainerItem(AComponent)) - + else if AComponent is TX2GraphicList then Lists.Remove(AComponent); end; @@ -648,6 +642,7 @@ begin TX2GraphicList(Lists[listIndex]).AddImage(graphicIndex); end; + procedure TX2GraphicContainer.RemoveGraphic(const AGraphic: TX2GraphicContainerItem); var graphicIndex: Integer; @@ -666,6 +661,7 @@ begin end; end; + procedure TX2GraphicContainer.UpdateGraphic(const AGraphic: TX2GraphicContainerItem); var graphicIndex: Integer; @@ -682,6 +678,49 @@ begin end; +procedure TX2GraphicContainer.MoveGraphic(const AGraphic: TX2GraphicContainerItem; ANewIndex: Integer); +var + count: Integer; + curIndex: Integer; + newIndex: Integer; + listIndex: Integer; + +begin + if not Assigned(AGraphic.Container) then + Exit; + + if AGraphic.Container <> Self then + begin + AGraphic.Container.MoveGraphic(AGraphic, ANewIndex); + Exit; + end; + + + curIndex := AGraphic.Index; + + if curIndex > -1 then + begin + count := GraphicsList.Count; + newIndex := ANewIndex; + + if newIndex < 0 then + newIndex := 0; + + if newIndex >= count then + newIndex := Pred(count); + + if newIndex <> curIndex then + begin + GraphicsList.Move(curIndex, newIndex); + + for listIndex := Pred(Lists.Count) downto 0 do + TX2GraphicList(Lists[listIndex]).MoveImage(curIndex, newIndex); + end; + end; +end; + + + procedure TX2GraphicContainer.RegisterList(const AList: TX2GraphicList); begin if Lists.IndexOf(AList) = -1 then @@ -691,10 +730,11 @@ begin end; end; + procedure TX2GraphicContainer.UnregisterList(const AList: TX2GraphicList); begin if Lists.Remove(AList) > -1 then - AList.RemoveFreeNotification(Self); + AList.RemoveFreeNotification(Self); end; @@ -704,6 +744,7 @@ begin Result := GraphicsList.Count; end; + function TX2GraphicContainer.GetGraphics(Index: Integer): TX2GraphicContainerItem; begin Result := TX2GraphicContainerItem(GraphicsList[Index]); @@ -730,6 +771,7 @@ begin FStretchMode := smCrop; end; + procedure TX2GraphicList.Loaded(); begin inherited; @@ -737,6 +779,7 @@ begin RebuildImages(); end; + procedure TX2GraphicList.Change(); begin inherited; @@ -912,6 +955,7 @@ begin Result := True; end; + procedure TX2GraphicList.DoDraw(Index: Integer; Canvas: TCanvas; X, Y: Integer; Style: Cardinal; Enabled: Boolean = True); begin @@ -1060,6 +1104,7 @@ begin end; end; + procedure TX2GraphicList.AddImage(const AIndex: Integer); var bmpImage: TBitmap; @@ -1090,6 +1135,7 @@ begin end; end; + procedure TX2GraphicList.UpdateImage(const AIndex: Integer); var bmpImage: TBitmap; @@ -1118,6 +1164,7 @@ begin end; end; + procedure TX2GraphicList.DeleteImage(const AIndex: Integer); begin BeginUpdate(); @@ -1129,6 +1176,17 @@ begin end; +procedure TX2GraphicList.MoveImage(const AOldIndex, ANewIndex: Integer); +begin + BeginUpdate(); + try + Move(AOldIndex, ANewIndex); + finally + EndUpdate(); + end; +end; + + procedure TX2GraphicList.RebuildImages(); var iIndex: Integer; @@ -1178,6 +1236,7 @@ begin end; end; + procedure TX2GraphicList.Notification(AComponent: TComponent; Operation: TOperation); begin @@ -1194,6 +1253,7 @@ begin RebuildImages(); end; + procedure TX2GraphicList.SetContainer(const Value: TX2GraphicContainer); begin if Assigned(FContainer) then @@ -1213,6 +1273,7 @@ begin RebuildImages(); end; + procedure TX2GraphicList.SetConvert(const Value: Boolean); begin if Value <> FConvert then @@ -1222,12 +1283,14 @@ begin end; end; + procedure TX2GraphicList.SetEnabled(const Value: Boolean); begin FEnabled := Value; RebuildImages(); end; + procedure TX2GraphicList.SetStretchMode(const Value: TX2GLStretchMode); begin FStretchMode := Value; @@ -1240,6 +1303,7 @@ begin Inc(FUpdateCount); end; + procedure TX2GraphicList.EndUpdate(); begin Assert(FUpdateCount > 0, 'EndUpdate without matching BeginUpdate!'); @@ -1256,6 +1320,7 @@ begin FPicture := TPicture.Create(); end; + destructor TDeprecatedGraphicItem.Destroy(); begin FreeAndNil(FPicture); @@ -1263,12 +1328,14 @@ begin inherited; end; + procedure TDeprecatedGraphicItem.SetPicture(const Value: TPicture); begin FPicture.Assign(Value); end; + initialization RegisterClass(TX2GraphicContainerItem);