Verktyg, gränssnitt och deskriptorer

Dynamix innehåller ett stort antal UI-kontroller (träd, menyer och toolbars m fl) som kan användas för att designa dialoger och verktyg. Ofta är det dock inte nödvändigt att själv bygga ihop verktygen från de minsta UI-beståndsdelarna. Ett bra alternativ är att beskriva egendesignade objekt med deskriptor-attribut och använda någon av Dynamix dialoglayouter för verktyget.

Hantering av objekt - listutseende

Hantering av objekt - trädutseende

Dynamix tillhandahåller som standard två gränssnittsvarianter - listvy och trädvy.

Layouterna innehåller de vanligaste redigeringsfunktionerna:

  • Ny, redigera, ta bort

  • Kopiera, klipp ut, klistra in

  • Behörighetshantering

Om dessa inte är tillräckliga går det att anpassa med egna toolbarknappar, menyer, listkolumner mm.

Hur fungerar det?

I vårt exempel ska vi bygga ett redigeringsverktyg för det egna objektet QA (Question and Answer). Det innehåller egenskaperna Question, Answer och Image.

  1. C#
  1. using System;
  2. using System.Runtime.Serialization;
  3. using Dynamix;
  4. using Dynamix.Descriptors.UI;
  5. using TestSite.UI.Dialogs;
  6. namespace TestSite
  7. {
  8. [Serializable]
  9. [EditObjectDialogDescriptor( typeof( EditQA.UIEditObjectDialogDescriptor ) )]
  10. [Name( "Fråga och svar" )]
  11. public class QA : Dynamix.Object
  12. {
  13. public static readonly TextProperty p_Question = new TextProperty( "Question" );
  14. public static readonly TextProperty p_Answer = new TextProperty( "Answer" );
  15. public static readonly ObjectProperty p_Image = new ObjectProperty( "Image", typeof( Dynamix.Image ), ObjectPropertyFlags.Cascaded );
  16. public QA() {}
  17. protected QA( ObjectID id ) : base( id ) {}
  18. protected QA( SerializationInfo info, StreamingContext context ) : base( info, context ) {}
  19. [Dynamix.Descriptors.UI.Label( "Fråga:" )]
  20. public string Question
  21. {
  22. get { return GetPropertyValue( p_Question ); }
  23. set { SetPropertyValue( p_Question, value ); }
  24. }
  25. [Dynamix.Descriptors.UI.Label( "Svar:" )]
  26. public string Answer
  27. {
  28. get { return GetPropertyValue( p_Answer ); }
  29. set { SetPropertyValue( p_Answer, value ); }
  30. }
  31. [Dynamix.Descriptors.UI.Label( "Bild:" )]
  32. public Dynamix.Image Image
  33. {
  34. get { return (Dynamix.Image)GetPropertyValue( p_Image ); }
  35. set { SetPropertyValue( p_Image, value ); }
  36. }
  37. protected override string IName_Name
  38. {
  39. get { return Question; }
  40. }
  41. public override bool IsUIDeletable
  42. {
  43. get { return true; }
  44. }
  45. public override bool IsUIEditable
  46. {
  47. get { return true; }
  48. }
  49. public static ObjectList All()
  50. {
  51. return Dynamix.Object.All( typeof( QA ) );
  52. }
  53. }
  54. }

Notera attributet EditObjectDialogDescriptor som har satts på klassen. Det pekar ut en deskriptorklass som beskriver den dialog som ska användas för att redigera QA-objekt. I dialogen EditQA är den deifinierad enligt:

  1. C#
  1. [Serializable]
  2. public class UIEditObjectDialogDescriptor :
  3. Dynamix.Descriptors.UI.EditObjectDialogDescriptor
  4. {
  5. public override Url Url
  6. {
  7. get { return new Url( "/Lib/QA/UI/Dialogs/EditQA.aspx" ); }
  8. }
  9. public override Size DialogSize
  10. {
  11. get { return new Size( 791, 543 ); }
  12. }
  13. public override string GetNewTitle()
  14. {
  15. return "Ny fråga och svar";
  16. }
  17. public override string GetEditTitle(Dynamix.Object o)
  18. {
  19. return "Redigera fråga och svar";
  20. }
  21. }

Verktyget

Nu är det dags att definiera själva verktyget som ska lista frågor och svar samt ge redaktören möjlighet att hantera dem (redigera, ta bort och skapa nya). Verktyget definieras på samma sätt som andra Dynamix-verktyg, skillnaden är varifrån DialogInfo hämtas.

  1. C#
  1. using System;
  2. using System.Runtime.Serialization;
  3. using Dynamix;
  4. using Dynamix.UI.Controls;
  5. namespace TestSite.Tools
  6. {
  7. [Serializable]
  8. [Dynamix.Definitions.Tool]
  9. public class QATool : Tool
  10. {
  11. protected QATool( ObjectID id ) : base( id ) {}
  12. protected QATool( SerializationInfo info, StreamingContext context ) : base( info, context ) {}
  13. public QATool() : base() {}
  14. public override string Name
  15. {
  16. get { return "Frågor och svar"; }
  17. }
  18. public override Dynamix.UI.DialogInfo DialogInfo()
  19. {
  20. QAToolDialogDescriptor desc = new QAToolDialogDescriptor();
  21. return Dynamix.UI.Dialogs.GeneralDialog.DialogInfo( desc );
  22. }
  23. public static QATool Instance
  24. {
  25. get { return (QATool)GetInstance( typeof( QATool ) ); }
  26. }
  27. }
  28. [Serializable]
  29. public class QAToolDialogDescriptor :
  30. Dynamix.Descriptors.UI.ListItemsDialogDescriptor
  31. {
  32. public override bool IsAllowedToViewPage
  33. {
  34. get { return QATool.Instance.CurrentUserIsAllowed; }
  35. }
  36. }
  37. }

Dialogen som ska visas är Dynamix.UI.Dialogs.GeneralDialog. Denna dialog har ingen egen layout utan kräver ett objekt av typen DialogDescriptor som i sin tur beskriver hur dialogen ska se ut och fungera.

I det här fallet används den egna klassen QAToolDialogDescriptor som ärver från ListItemsDialogDescriptor. Det enda vi ändrar är hur säkerhetskontrollen ska gå till, i det här fallet ska den inloggade användaren ha tillgång till QATool-verktyget.

När verkyget har installerats och visas i sajten ser det ut enligt:

Ännu så länge är inga funktioner tillgängliga. Anledningen är att vi ingenstans har sagt vilka objekt som ska visas och få redigeras i dialogen. För att definiera detta överlagrar vi fler funktioner i dialog-deskriptorn:

  1. C#
  1. [Serializable]
  2. public class QAToolDialogDescriptor :
  3. Dynamix.Descriptors.UI.ListItemsDialogDescriptor
  4. {
  5. public override bool IsAllowedToViewPage
  6. {
  7. get { return QATool.Instance.CurrentUserIsAllowed; }
  8. }
  9. public override System.Collections.ICollection GetAllowedTypes()
  10. {
  11. return new Type[] { typeof( QA ) };
  12. }
  13. public override ObjectList GetItems()
  14. {
  15. ObjectList items = new ObjectList( QA.All() );
  16. items.Sort( QA.p_Question.AscendingComparer );
  17. return items;
  18. }
  19. }

Resultatet blir:

I Ny-menyn visas de objekttyper som kan dialogen känner till. Listan hämtas från deskriptorns GetAllowedTypes()-metod. För varje objekttyp visas en text som hämtas från deskriptorns GetTypeName()-metod. Basimplementationen är att använda namn från attributet Dynamix.Descriptors.UI.Name om ett sådant finns satt på klassen (se QA-klassens kod högst upp i artikeln).

I listan visas de poster som kommer ur deskriptorns GetItems()-metod. I exemlet returnerar vi alla QA-objekt sorterade efter frågetexten. Som standard visas en ikon- och en namnkolumn, där ikonen hämtas från objektets IDisplayItem-implementation och namnet från objektets IName-implementation. För Dynamix.Object (som QA ärver från) överlagras enklast IName_Name och IDisplayItem_IconUrl. I vårt exempel har vi överlagrat IName_Name till att visa frågetexten. Mer om dessa interface finns bland länkarna i slutet av artikeln

Fler möjligheter

Ta bort och Redigera-funktionerna är bara aktiva om deskriptorn svarar med värdet true på frågorna IsDeletable respektive IsEditable. Standardimplementationen är att returnera objektets värde för IsUIDeletable och IsUIEditable, men genom att överlagra i deskriptorn är det alltså fullt möjligt att införa speciella regler för vissa objekt i gränssnittet istället för att låta objektet själv bestämma.

Det finns också möjligheter att överlagra funktioner för att bl a:

  • Skapa och rita ut fler kolumner eller ändra på befintliga

  • Lägga till egna toolbarknappar och menyer

  • Hantera vad som händer vid klipp ut, kopiera och klistra in

  • Hantera hur objekt ska sparas

Läs mer