Index: VerpakkingsDefinitie/UI/ProductDetailScherm.pas =================================================================== diff -u -r594 -r596 --- VerpakkingsDefinitie/UI/ProductDetailScherm.pas (.../ProductDetailScherm.pas) (revision 594) +++ VerpakkingsDefinitie/UI/ProductDetailScherm.pas (.../ProductDetailScherm.pas) (revision 596) @@ -12,7 +12,6 @@ resourceString GEEN_DATA_CAPTION = 'Geen product geselecteerd'; - NERGENS_DEEL_VAN_CAPTION = '--Nergens deel van--'; type TFormProductDetail = class(TFormSubscherm) @@ -31,18 +30,23 @@ procedure FormDestroy(Sender: TObject); procedure ListViewVerpakkingenSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); private - FProductDetailsSubject: TSubject; - FProductDetailsSubjectObserver: TSubjectObserver; + FProductsContextSubject: TSubject; + FProductsContextSubjectObserver: TSubjectObserver; + FVerpakkingenContextSubject: TSubject; + FVerpakkingenContextSubjectObserver: TSubjectObserver; + FProductsAgent: TProductsAgent; LabelGeenData: TLabel; - procedure UpdateGui(Sender: TObject); - procedure UpdateControlsEnableStatus(); - procedure UpdateGuiDataAanwezigheid(Aanwezig: Boolean); + procedure UpdateGuiProduct(Sender: TObject); + procedure UpdateGuiVerpakkingen(Sender: TObject); + procedure LaadProductVerpakkingen(GeselecteerdProduct: TProductInformatie); + procedure UpdateVerpakkingControlsEnableStatus(); + procedure UpdateGuiProductAanwezigheid(Aanwezig: Boolean); public Constructor Create(AOwner: TComponent; Navigator: INavigator; ApplicationContext: TApplicationContext; - ProductDetailsSubject: TSubject; ProductsAgent: TProductsAgent); + ProductsContextSubject: TSubject; VerpakkingContextSubject: TSubject; ProductsAgent: TProductsAgent); end; implementation @@ -51,89 +55,107 @@ {$R *.dfm} Constructor TFormProductDetail.Create(AOwner: TComponent; Navigator: INavigator; ApplicationContext: TApplicationContext; - ProductDetailsSubject: TSubject; ProductsAgent: TProductsAgent); + ProductsContextSubject: TSubject; VerpakkingContextSubject: TSubject; ProductsAgent: TProductsAgent); begin inherited Create(AOwner, Navigator, ApplicationContext); - self.FProductDetailsSubject := ProductDetailsSubject; - self.FProductDetailsSubjectObserver := TSubjectObserver.Create(self); - self.FProductDetailsSubjectObserver.OnChange := UpdateGui; + + self.FProductsContextSubject := ProductsContextSubject; + self.FProductsContextSubjectObserver := TSubjectObserver.Create(self); + self.FProductsContextSubjectObserver.OnChange := UpdateGuiProduct; + + self.FVerpakkingenContextSubject := VerpakkingContextSubject; + self.FVerpakkingenContextSubjectObserver := TSubjectObserver.Create(self); + self.FVerpakkingenContextSubjectObserver.OnChange := UpdateGuiVerpakkingen; + self.FProductsAgent := ProductsAgent; end; procedure TFormProductDetail.FormCreate(Sender: TObject); begin // Registreer bij observer - FProductDetailsSubject.RegisterObserver(FProductDetailsSubjectObserver); + FProductsContextSubject.RegisterObserver(FProductsContextSubjectObserver); + FVerpakkingenContextSubject.RegisterObserver(FVerpakkingenContextSubjectObserver); end; procedure TFormProductDetail.FormDestroy(Sender: TObject); begin - FProductDetailsSubject.UnregisterObserver(FProductDetailsSubjectObserver); + FProductsContextSubject.UnregisterObserver(FProductsContextSubjectObserver); + FVerpakkingenContextSubject.UnregisterObserver(FVerpakkingenContextSubjectObserver); end; -procedure TFormProductDetail.ListViewVerpakkingenSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); +procedure TFormProductDetail.UpdateGuiProduct(Sender: TObject); +var + GeselecteerdProduct: TProductInformatie; begin - if Selected then + GeselecteerdProduct := ApplicationContext.ProductsContext.GeselecteerdProduct; + if GeselecteerdProduct = nil then begin - ApplicationContext.ProductVerpakkingContext.GeselecteerdeVerpakking := TProductVerpakking(ListViewVerpakkingen.Selected.Data); - ApplicationContext.ProductVerpakkingContext.NotifyChanged(); { TODO : Vervangen door notify changed in setter } + UpdateGuiProductAanwezigheid(False); + exit; end; + + // Product is geselecteerd + + // Update met data uit geselecteerd product + LabelOmschrijving1.Caption := GeselecteerdProduct.Omschrijving1; + LabelOmschrijving2.Caption := GeselecteerdProduct.Omschrijving2; + LabelProductNaam.Caption := GeselecteerdProduct.Kol1; + LabelProductNummer.Caption := intToStr(GeselecteerdProduct.ProductNr); + + UpdateGuiProductAanwezigheid(True); + + // Verpakkingen opzoeken horende bij dit geselecteerde product + LaadProductVerpakkingen(GeselecteerdProduct); end; -procedure TFormProductDetail.UpdateGui(Sender: TObject); +procedure TFormProductDetail.LaadProductVerpakkingen(GeselecteerdProduct: TProductInformatie); var - GeselecteerdProduct: TProductInformatie; ErrorMessage: string; - ProductVerpakking: TProductVerpakking; - VorigeIndexInList: Integer; begin - GeselecteerdProduct := ApplicationContext.ProductsContext.GeselecteerdProduct; + // Product informatie ophalen + FProductsAgent.ZoekProductVerpakkingenMetProductNr(GeselecteerdProduct.ProductNr, self.ApplicationContext.UserContext, + self.ApplicationContext.ProductVerpakkingContext); - if GeselecteerdProduct <> nil then + if self.ApplicationContext.ProductVerpakkingContext.IsOK then + // Gelukt + else begin - // Product informatie ophalen - FProductsAgent.ZoekProductVerpakkingenMetProductNr(GeselecteerdProduct.ProductNr, self.ApplicationContext.UserContext, - self.ApplicationContext.ProductVerpakkingContext); + // Opzoeking gefaald + ErrorMessage := self.ApplicationContext.ProductVerpakkingContext.ErrorMessage; + if self.ApplicationContext.ProductVerpakkingContext.InternalErrorMessage <> '' then + ErrorMessage := ErrorMessage + sLineBreak + self.ApplicationContext.ProductVerpakkingContext.InternalErrorMessage; - if self.ApplicationContext.ProductVerpakkingContext.IsOK then - // Gelukt - Navigator.NavigeerNaar(NAVTOONPRODUCTVERPAKKING) - else - begin - // Opzoeking gefaald - ErrorMessage := self.ApplicationContext.ProductVerpakkingContext.ErrorMessage; - if self.ApplicationContext.ProductVerpakkingContext.InternalErrorMessage <> '' then - begin - ErrorMessage := ErrorMessage + sLineBreak + self.ApplicationContext.ProductVerpakkingContext.InternalErrorMessage; - end; - - MessageDlg(ErrorMessage, TMsgDlgType.mtInformation, [mbOK], 0, mbCancel); - exit; - end; + MessageDlg(ErrorMessage, TMsgDlgType.mtInformation, [mbOK], 0, mbCancel); end; +end; - if (GeselecteerdProduct = nil) or (ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen.Count = 0) then +procedure TFormProductDetail.ListViewVerpakkingenSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); +begin + if Selected then begin - UpdateGuiDataAanwezigheid(False); - exit; - end - else - UpdateGuiDataAanwezigheid(True); + if ApplicationContext.ProductVerpakkingContext.GeselecteerdeVerpakking <> + TProductVerpakking(ListViewVerpakkingen.Selected.Data) then + begin + // Product selecteren. Wij doen de selectie en willen dus niet opnieuw worden opgeroepen. + FVerpakkingenContextSubjectObserver.Enabled := False; + ApplicationContext.ProductVerpakkingContext.GeselecteerdeVerpakking := + TProductVerpakking(ListViewVerpakkingen.Selected.Data); + FVerpakkingenContextSubjectObserver.Enabled := True; + end; - UpdateControlsEnableStatus(); + Navigator.NavigeerNaar(NAVTOONPRODUCTVERPAKKING); + end; +end; - // Update met data uit ApplicationContext - LabelOmschrijving1.Caption := GeselecteerdProduct.Omschrijving1; - LabelOmschrijving2.Caption := GeselecteerdProduct.Omschrijving2; - LabelProductNaam.Caption := GeselecteerdProduct.Kol1; - LabelProductNummer.Caption := intToStr(GeselecteerdProduct.ProductNr); - - VorigeIndexInList := ListViewVerpakkingen.ItemIndex; - - // List view (grid) +procedure TFormProductDetail.UpdateGuiVerpakkingen(Sender: TObject); +var + ProductVerpakking: TProductVerpakking; +begin + // List view (grid). We vullen de lijst iedere keer opnieuw om wijzigingen aan verpakkingen te reflecteren. ListViewVerpakkingen.Items.BeginUpdate; + ListViewVerpakkingen.Clear(); - for ProductVerpakking in ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen do + for ProductVerpakking in TProductVerpakkingenContext(Sender).ProductVerpakkingen do begin With ListViewVerpakkingen.Items.Add Do begin @@ -144,28 +166,31 @@ SubItems.Add(ProductVerpakking.Breedte + ' x ' + ProductVerpakking.Diepte + ' x ' + ProductVerpakking.Hoogte); SubItems.Add(ProductVerpakking.Aantal); SubItems.Add(ProductVerpakking.MaxCombinAantal); - if ProductVerpakking.DeelVan <> nil then - SubItems.Add(ProductVerpakking.DeelVanCaption) - else - SubItems.Add(''); + SubItems.Add(ProductVerpakking.DeelVanCaption); SubItems.Add(ProductVerpakking.ID); end; end; ListViewVerpakkingen.Items.EndUpdate; - // Kijk of dezelfde verpakking als voor de update opnieuw geselecteerd kan worden - if (VorigeIndexInList >= 0) and (VorigeIndexInList < ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen.Count) then - ProductVerpakking := ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen[VorigeIndexInList] - else if ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen.Count > 0 then - // Default eerste verpakking selecteren - ProductVerpakking := ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen[0] + // Bepaal het geselecteerde item in de list view + if TProductVerpakkingenContext(Sender).GeselecteerdeVerpakking = nil then + begin + // Nog geen verpakking gekozen, selecteer er zelf een. Default de eerste. + if TProductVerpakkingenContext(Sender).ProductVerpakkingen.Count > 0 then + // Default eerste verpakking selecteren + ListViewVerpakkingen.ItemIndex := 0; + end else - ProductVerpakking := nil; // Geen verpakking aanwezig + begin + // Er was reeds een verpakking gekozen, selecteer de juiste index van de ListView + ListViewVerpakkingen.ItemIndex := TProductVerpakkingenContext(Sender) + .ProductVerpakkingen.IndexOf(TProductVerpakkingenContext(Sender).GeselecteerdeVerpakking); + end; - ApplicationContext.ProductVerpakkingContext.GeselecteerdeVerpakking := ProductVerpakking; + UpdateVerpakkingControlsEnableStatus; end; -procedure TFormProductDetail.UpdateControlsEnableStatus(); +procedure TFormProductDetail.UpdateVerpakkingControlsEnableStatus(); var VerpakkingAanwezigEnGeselecteerd: Boolean; begin @@ -174,7 +199,7 @@ ButtonVerwijder.Enabled := VerpakkingAanwezigEnGeselecteerd; end; -procedure TFormProductDetail.UpdateGuiDataAanwezigheid(Aanwezig: Boolean); +procedure TFormProductDetail.UpdateGuiProductAanwezigheid(Aanwezig: Boolean); var I: Integer; begin