cObject
---cWebObject
------cWebBaseUIObject
---------cWebBaseDEOServer
------------cWebBaseControl
---------------cWebGroup
------------------cWebWidget
The cWebWidget is the base foundation building block for building "Widgets". This class is used as the base class to subclass from, often using the Composite keyword. Instances of this class are what dynamically populate the cWebWidgetContainer.
Building Widgets is very similar to building a cWebView. When using the Composite approach, any child object can go directly inside your Widget "Class", just like building a view or any other container type object.
Make sure you set the psWidgetName to a unique identifiable name for your Widget.
When using composite, you can directly override, implement and augment, methods of your child objects inside the object definition itself.
Controls inside Widgets can be data-aware, meaning you can use Entry_Item statements on, for example, an underlying cWebForm. This also means that Widgets can contain DataDictionaries, which are added just like you would in a cWebView.
Navigations also work just like in a cWebView. You can use WebRegisterPath to register navigations from anywhere inside a Widget and then use the NavigatePath instruction to perform the actual navigation.
The cWebWidget class has several events of interest to potentially implement. Refer to the documentation of OnInitializeWidget and AllowAccess for more information.
Widgets can also be "configurable", refer to Configurable Widgets for more information.
This sample shows how to create a widget that displays a list of customers.
Use cWebWidget.pkg Use cWebHtmlBox.pkg Use cCustomerDataDictionary.dd Composite cWidgetCustomers is a cWebWidget Set peLayoutType to ltFlow Set piColumnCount to 12 Set psRowHeights to "0/1fr" Set psWidgetName to "cWidgetCustomers" Set psCaption to "Customers" Set psWidgetCaption to "Customers" Set psWidgetDescription to "List of customers" Set piDefaultColSpan to 4 Set piDefaultRowSpan to 5 Set pbShowBorder to True { WebProperty=Server } Property String piBalanceFrom 0 { WebProperty=Server } Property String piBalanceTo 0 Object oCustomer_DD is a cCustomerDataDictionary Procedure OnConstrain Integer iFrom iTo Forward Send OnConstrain WebGet piBalanceFrom of (Widget(Self)) to iFrom WebGet piBalanceTo of (Widget(Self)) to iTo If (iTo > 0) ; Constrain Customer.Balance lt iTo If (iFrom > 0) ; Constrain Customer.Balance gt iFrom End_Procedure End_Object Set Main_DD to oCustomer_DD Set Server to oCustomer_DD Object oLabel is a cWebHtmlBox Set piColumnSpan to 12 Set psHtml to "<h1>Customers</h1>" Procedure UpdateLabel Integer iFrom iTo String sLabel WebGet piBalanceFrom of (Widget(Self)) to iFrom WebGet piBalanceTo of (Widget(Self)) to iTo If (iFrom > 0 and iTo > 0) ; Move (sLabel + SFormat("<p>(balance between %1 and %2)</p>", iFrom, iTo)) to sLabel Else If (iFrom > 0) ; Move (sLabel + SFormat("<p>(balance above %1)</p>", iFrom, iTo)) to sLabel Else If (iTo > 0) ; Move (sLabel + SFormat("<p>(balance below %2)</p>", iFrom, iTo)) to sLabel WebSet psHtml to sLabel WebSet pbRender to (sLabel <> "") End_Procedure End_Object Object oList is a cWebList Set piColumnSpan to 12 Set pbServerOnRowClick to True Set pbFillHeight to True Set psCSSClass to "MobileList" Set piSortColumn to 0 Set pbShowHeader to False Set pbAllowDeleteRow to True Object oCustomerName is a cWebColumn Entry_Item Customer.Name Set psCaption to "Customer Name" Set piWidth to 315 Set psCSSClass to "RowCaption" Set piListColSpan to 3 End_Object Object oCustomerCustomer_Number is a cWebColumn Entry_Item Customer.Customer_Number Set psCaption to "Number" Set piWidth to 32 Set pbFixedWidth to True Set peAlign to alignLeft Set pbNewLine to True Set psCSSClass to "RowDetail" End_Object Object oCustomer_City is a cWebColumn Set psCaption to "City, State, Zip" Set piWidth to 954 Set psCSSClass to "RowDetail" Set peWordBreak to wbEllipsis Procedure OnSetCalculatedValue String ByRef sValue Move (Customer.City - "," * Customer.State - "," * Customer.Zip) to sValue End_Procedure End_Object Object oCustomerBalance is a cWebColumn Entry_Item Customer.Balance Set psCaption to "Balance Due" Set piWidth to 93 Set pbFixedWidth to True Set psCSSClass to "RowDetail" End_Object WebRegisterPath ntNavigateForward oZoomCustomer Self "EditCustomer" Procedure OnRowClick String sRowID tWebNavigateData NavigateData String sTask Boolean bFound Get GetNavigateData to NavigateData Case Begin Case (NavigateData.eNavigateType=nfFromChild) Case (NavigateData.eNavigateType=nfFromMain) // a child or main lookup Send NavigateClose Self Case Break Case (NavigateData.eNavigateType=nfFromParent) // not used yet Case Break Case Else Get NamedValueGet NavigateData.NamedValues "task" to sTask If (sTask="maint") Begin Send NavigateForward to oZoomCustomer Self End Else Begin Send NavigateForward to oZoomCustomer Self End Case End End_Procedure End_Object Procedure OnInitializeWidget Send UpdateLabel of oLabel Send Rebuild_Constraints of oCustomer_DD Send FindFromTop of oList End_Procedure Procedure OnWidgetPropsChanged Send UpdateLabel of oLabel Send Rebuild_Constraints of oCustomer_DD Send FindFromTop of oList End_Procedure Procedure OnGetConfigurableProps tWidgetConfigProp[] ByRef aConfigurableProps Forward Send OnGetConfigurableProps (&aConfigurableProps) Get CreateConfigurableProp (Self) (RefFunc(piBalanceFrom)) to aConfigurableProps[0] Move 'Minimum Balance' to aConfigurableProps[0].Settings.sOptLabel Move 0 to aConfigurableProps[0].Settings.eControlType // Form Get CreateConfigurableProp (Self) (RefFunc(piBalanceTo)) to aConfigurableProps[1] Move 'Maximum Balance' to aConfigurableProps[1].Settings.sOptLabel Move 0 to aConfigurableProps[1].Settings.eControlType // Form End_Procedure End_Composite