Click here to Skip to main content
Click here to Skip to main content

Programming the Roma Widget Set (C# X11) - a zero dependency GUI application framework - Part 1, Basics

By , 31 Mar 2014
Rate this:
Please Sign up or sign in to vote.
Download complete project Version 0.10 32 bit (zip)

Download complete project Version 0.10 64 bit (zip)

Download complete project version 0.20 32 bit (zip)

Download complete project version 0.20 64 bit (zip)

Download complete project version 0.30 32 bit (zip)

Download complete project version 0.30 64 bit (zip)

Introduction

This article deals with the practical use of the Roma Widget Set (Xrw), a C# GUI application framework, that is directly based on X11 library calls. The idea of the Roma widget set has been developed as consequence of the first article of this series, Programming Xlib with Mono Develop - Part 1: Low-level (proof of concept) and influenced by the experience made through writing the subsequent articles Programming Xlib with Mono Develop - Part 2: Athena widgets (proof of concept), Programming Xlib with Mono Develop - Part 3: Motif widgets (proof of concept) and Programming Xlib with Mono Develop - Part 4: FWF Xt widgets.

Because the whole Topic grows beyond 50 pages with , i decided to split it into multiple parts.

  • This one: Part 1, Basics. It contains descriptions of simple widgets. It shold be your first point of contact.
  • The new one: Part 3, Composite widgets. It contains the reference description of composite widgets only.

This article provides a sample application's complete project for 32 bit and 64 bit. All features, described later on, can be marked as:

  • available from version 0.1,
  • disabled with version 0.2,
  • available from version 0.2,
  • disabled with version 0.3 and
  • available from version 0.3.

First - the main disadvantages:

  • The complete framework is crafted - there is no big developer comunity in the background.
  • The framework uses the capabilities of C# and X11 (via P/Invoke) only - currently no additional libraries like Xt, Xpm, Xft, Cairo, Pango, ... are involved - i.e. drawing capabilities are limited (no gradient color, no antialiasing).
  • It is platform dependend - it runs on X11 only.
  • There is no GUI designer.
  • Only 24 bit color model (16 777 216 colors, 32 bits per pixel) is supported by . The 16 bit color model (65536 colors, 16 bits per pixel) is supported by , but no color optimization or smoothing is provided for the reduced color space.

Second - the main advantages:

  • The framework is small, very well inline-documented and can be adopted/extended to a specific need easyly.
  • The framework comes with complete source code and is wirtten entirely in C# - all parts of the framework can be maintained from a single C# solution or project.
  • The framework has no dependencies except X11 and it has zero overhead. It is very lightweight and fast.
  • The framework starts to contain widgets, that aren't available for Athena widget set, Motif or GTK. The first of them is a basic ribbon.

It might be, any future version includes the option to use additional libraries or run on other platforms than X11.

This provokes the question - why another GUI application framework? The answer is the fun to deal with it, the individuality that applications can reach and the flexibility to design an uncommon GUI for a specific application.

Background

The Roma widget set has been designed to support programming of simple GUIs for small tools. It's focus is the efficiency in application, not the completeness of rarely used features. What are the alternatives?

All other widget sets - the Athena widget set and its descendants (e. g. neXtaw, XawM, Xaw-Xpm, XawPlus or Xaw3d), the Motif widget set (Open Motif or LessTif), GTK (GTK+ alreaty has the C# wrapper GTK#) and KDE (Qt already has the C# wrapper Qyoto) - are developed in C/C++ and are very hard to adopt/extend to a specific purpose within a C# project.

The Roma widget set framework shall support all adoptions/extentions through native C# code.

This is not a new idea/requirement. The DotGNU Portable.NET project - gone with the shutdown of it's parent project DotGNU in December 2012 - contains the pnetlib, which was under active development until March 2007 by Rhys Weatherley, at that time director of Southern Storm Software, Pty Ltd, and others. The last version (0.8.0) of the pnetlib project contains Xsharp and System.Windows.Forms among other things. While Xsharp implements a basic framework to program X11 from C# (and might be worth to take a look at it), System.Windows.Forms is a re-implementation of Microsoft's not ECMA standardized namespace and has always been subject of discussions and warnings about whether Microsoft is probably planning to destroy such C# implementations through patent suits.

The Roma widget set framework will not try to re-implement any known GUI framework.

Using the code

The sample application was written with Mono Develop 2.4.1 for Mono 2.8.1 on OPEN SUSE 11.3 Linux 32 bit EN and GNOME desktop. Neither the port to any older nor to any newer version should be a problem. The sample application's solution consists of three projects (the complete sources are provided for download):

  • X11Wrapper defines the function prototypes, structures and types for Xlib/X11 calls to the libX11.so
  • Xrw contains the Roma witget set (Xrw)
  • X11 contains the sample application
The sample application is also tested with Mono Develop 3.0.6 for Mono 3.0.4 on OPEN SUSE 12.3 Linux 64 bit DE and GNOME desktop, IceWM, TWM und Xfce.

The only difference between the 32 bit and the 64 bit solution is the definition of some types, as already described in the first article of this series.

Theme support

Currently the framework has a generic theme support and these predefined themes:

  • XrwTheme.GeneralStyle.WinClassic (in and named XrwTheme.GeneralStyle.Win95),
  • XrwTheme.GeneralStyle.WinLuna (loocks similar like WinXP / MS Office 2007),
  • XrwTheme.GeneralStyle.WinRoyale (loocks similar like Vista/Win7 / MS Office 2010),
  • XrwTheme.GeneralStyle.WinMidori (loocks similar like Win8 / MS Office 2013) and
  • XrwTheme.GeneralStyle.Gtk2Clearlooks.

The theme support covers colors, geometries and images.

To design an uncommon GUI for a specific application, almost all widget properties, that are influenced by a theme, can also be overruled by individual values. Or a new XrwTheme.GeneralStyle can be created and applied.

Look & feel of XrwTheme.GeneralStyle.WinClassic demonstrated with the "File selection" dialog.

Look & feel of XrwTheme.GeneralStyle.Gtk2Clearlooks demonstrated with the "File selection" dialog

Colors

The XrwTheme class supports these theme colors:

Property Samples (WinClassic und Gtk2)
:
InteractiveSelectedBackgroundColorLight
InteractiveSelectedBackgroundColorMedium
InteractiveSelectedBackgroundColorDark
:
CollectionItemSelectedBackgroundColorLight
CollectionItemSelectedBackgroundColorMedium
CollectionItemSelectedBackgroundColorDark
:
InteractiveFocusedSelectedBackgroundColorLight
InteractiveFocusedSelectedBackgroundColorMedium
InteractiveFocusedSelectedBackgroundColorDark
:
CollectionItemFocusedSelectedBackgroundColorLight
CollectionItemFocusedSelectedBackgroundColorMedium
CollectionItemFocusedSelectedBackgroundColorDark
:
ScrollBackgroundColor
:
ScrollFocusedBackgroundColor
:
ScrollThumbBackgroundColorLight
ScrollThumbBackgroundColorMedium
ScrollThumbBackgroundColorDark
:
ScrollThumbFocusedBackgroundColorLight
ScrollThumbFocusedBackgroundColorMedium
ScrollThumbFocusedBackgroundColorDark
:
TextColor
InverseTextColor
Property
Samples (WinLuna und Gtk2)
:
RibbonTabCaptionBackgroundColor
RibbonTabCaptionFocusedBackgroundColor
RibbonBackgroundColorLight
RibbonBackgroundColorMedium
RibbonBackgroundColorDark
:
RibbonCommandGadgetSelectedBackgroundColorLight
RibbonCommandGadgetSelectedBackgroundColorMedium
RibbonCommandGadgetSelectedBackgroundColorDark
RibbonCommandGadgetFocusedBackgroundColorLight
RibbonCommandGadgetFocusedBackgroundColorMedium
RibbonCommandGadgetFocusedBackgroundColorDark
:
ApplicationButtonBackgroundColorLight
ApplicationButtonBackgroundColorMedium
ApplicationButtonBackgroundColorDark
ApplicationButtonFocusedBackgroundColorLight
ApplicationButtonFocusedBackgroundColorMedium
ApplicationButtonFocusedBackgroundColorDark


Geometries

The XrwTheme class supports these theme geometries:

PropertySamples
DlgShellPrimaryChildSpacing
ViewportChildSpacing

Images

The X11Graphic class supports these theme stock images (the XrwTheme class provides easy access):

PropertySamples (WinClassic und Gtk2)
Computer (16, 24, 32 and 48 pixel)
Drive (16, 24, 32 and 48 pixel)
FolderClose (16, 24, 32 and 48 pixel)
FolderOpen (16, 24, 32 and 48 pixel)
MyFolder (16, 24, 32 and 48 pixel)
Computer (16, 24, 32 and 48 pixel)
PropertySample (generic)
Attention (16, 24, 32 and 48 pixel)
Cancel (16, 24, 32 and 48 pixel)
Error (16, 24, 32 and 48 pixel)
File (16, 24, 32 and 48 pixel)
Information (16, 24, 32 and 48 pixel)
OK (16, 24, 32 and 48 pixel)
Question (16, 24, 32 and 48 pixel)
RadioOff (16 pixel)
RadioOn (16 pixel)
ToggleOff (16 pixel)
ToggleOn (16 pixel)
Warning (16, 24, 32 and 48 pixel)
TextSub (16 pixel)
TextSuper (16 pixel)
ApplicationButton (16 pixel)
PropertySample (Win und Gtk2)
RibbonClose (16 and 32 pixel)
RibbonExit (16 and 32 pixel)
RibbonNew (16 and 32 pixel)
RibbonOpen (16 and 32 pixel)
RibbonOptions (16 and 32 pixel)
RibbonSave (16 and 32 pixel)
RibbonSaveAs (16 and 32 pixel)
TextAlignBottom (16 pixel)
TextAlignCenter (16 pixel)
TextAlignJustify (16 pixel)
TextAlignLeft (16 pixel)
TextAlignMiddle (16 pixel)
TextAlignRight (16 pixel)
TextAlignTop (16 pixel)
TextBold (16 pixel)
TextItalic (16 pixel)
TextUnderline (16 pixel)

To select a theme, the program's Main() method should set the desired theme to the XrwTheme.Style static property before the instantiation of XrwApplicationShell.

public static void Main ()
{
    // Set the desired theme.
    XXrwTheme.Style = XrwTheme.GeneralStyle.Gtk2Clearlooks;
 
    TPoint assignedPosition = new TPoint (0, 0);
    TSize  assignedSize     = new TSize  (350, 300);
 
    // Instantiate the program's instance of XrwApplicationShell.
    X11Window appWindow     = new X11Window(ref assignedPosition, ref assignedSize);
 
    appWindow.Run ();
} 

Anatomy of an application or dialog window

Application windows are based on an XrwApplicationShell, dialog windows are based on an XrwDialogShell. Both are derived from abstract XrwWmShell, and XrwWmShell is derived from XrwComposite - the base class for containers, that manages an arbitary number of child widgets. XrwWmShell provides interaction with the windows manager (move, resize, close, ... of a window). Since XrwComposite has no integrated layout management, it is recommended to assign one XrwBox child to each XrwApplicationShell or XrwDialogShell instance, that manages the layout of the shell's grandchildren.

Since XrwWmShell derivatives set the XSetWindowAttributes attribute bit_gravity to NorthWestGravity and the window's background color to XrwTheme.GeneralBackgroundColor, the flickering effects during the redraw procedure (to observe on window resize operations) of any contained grandchild are already minimized. (The flickering effects come from the black (undrawn) shell background and the time delay between shell background cleaning and widget/gadget redrawing.)

public class XrwBitmapAndVectorFontSelectionDialog : XrwDialogShell
{
    // Define constants and member attributes.
    ...
 
    // Implement the constructor.
    public XrwBitmapAndVectorFontSelectionDialog (XrwApplicationShell parent,
                                                  ref TPoint assignedPosition,
                                                  ref TSize assignedSize, string title)
        : base (parent, ref assignedPosition, ref assignedSize)
    {
        // Initialize member attributes.
        ...
 
        // Create shell's primary layout manager.
        XrwBox vboxMain = XrwBox.NewVBoxGadget (this);
        vboxMain.BorderWidth = XrwTheme.DlgShellPrimaryChildBorderWidth;
        vboxMain.BorderColor = _backgroundColorPixel;
        vboxMain.VertSpacing = XrwTheme.DlgShellPrimaryChildSpacing;
        AddChild (vboxMain);
 
        // Create shell's grandchildren.
        ...
    }
 
    // Implement the destructor, properties and methods.
    ...   
}

Support for 16 Bit color model

The general approach to support 16 bit color model is to use an individual visual and colormap for the application, that is based on a 24 bit color model, if X server runs in 16 bit color mode. The necessary code, especially XrwCore.InitializeApplicationShellWindow(), XrwCore.InitializeTransientShellWindow() and XrwCore.InitializeOverrideShellWindow() has been prepared already by . The following changes have been implemented with to support 16 Bit color model finally:

  • Reduction of the stock icon's color depth to 15 bit (not necessarily needed, but recommended).
  • Reduction of the application's icon color depth to 15 bit (required).
  • Correction of XrwApplicationFramework.SetWmShellIcon() (see "Fixed errors" No. 3).
  • Correction of X11Graphic.CreateIndependentGraphicPixmap() (see "Fixed errors" No. 4).

The /etc/X11/xorg.conf.d/50-screen.conf on my OPEN SUSE 11.3 Linux 32 bit EN has been modiefied like that, to test 16 Bit color model support:

Section "Screen"
  Identifier "Default Screen"
  Device "Default Device"

  ## Doesn't help for radeon/radeonhd drivers; use magic in
  ## 50-device.conf instead
  Monitor "Default Monitor"

  # DefaultDepth 32 Chrashing!
  # DefaultDepth 24 # Running!
  DefaultDepth 16 # Running!
  # DefaultDepth 15 Chrashing!
  # DefaultDepth 8 # Running, but ugly!

  #############################################################################
  # Use one of these GRUB start options to repair a crashing X11 session:
  # - vga=ask: This option allows you to select the mode for the video adaptor.
  # - init=/bin/sh: Run the program /bin/sh (the shell) instead of init.
  #############################################################################
EndSection 

The ("X -configure" generated) /etc/X11/xorg.conf on my OPEN SUSE 12.3 Linux 64 bit DE has been modiefied like that, to test 16 Bit color model support:

Section "Screen"
  ...

  # DefaultDepth 32 Chrashing!
  # DefaultDepth 24 # Running!
  DefaultDepth 16 # Running!
  # DefaultDepth 15 Running with Xfce only!
  # DefaultDepth 8 # Running, but ugly!
EndSection 

Usage of popup menus

Popup menus can be created very easily. These are the steps:

  • Create a popup menu shell XrwSimpleMenuShell.
  • Add the menu entries with XrwSme to the menu shell and register the callbacks to the menu entries.
  • Force shell's geometry management.
  • Create a menu button XrmMenuButton and add it to the parent composite.
  • Register the menu shell to the menu button.

There is no additional code to process pop up, pop down or selection required.

XrwSimpleMenu _fileMenuShell = null;

...

// ---- Create popup menu.

TPoint origin   = new TPoint (20, 20);
TSize  initSize = new TSize  (-1, -1);
_fileMenuShell = new XrwSimpleMenu (this, ref origin, ref initSize);

// ---- Add menu entries.

X11Graphic menuEntryGraphicA = XrwTheme.GetGraphic ( _display,_screenNumber,
    X11Graphic.StockIcon.Information16);
X11Graphic menuEntryGraphicB = XrwTheme.GetGraphic ( _display,_screenNumber,
    X11Graphic.StockIcon.Question16);
XrwSme menuEntry1 = XrwSme.NewXrwSmeGadget (_fileMenuShell, "File menu entry 1",
    menuEntryGraphicA, true, menuEntryGraphicB, true);
menuEntry1.ButtonRelease += HandleMenuEntry1ButtonRelease;
_fileMenuShell.AddChild (menuEntry1);
XrwSme menuEntry2 = XrwSme.NewXrwSmeGadget (_fileMenuShell, "File menu entry 2",
    menuEntryGraphicA, true, menuEntryGraphicB, true);
menuEntry2.ButtonRelease += HandleMenuEntry2ButtonRelease;
_fileMenuShell.AddChild (menuEntry2);

// ---- Beautify popup menu.

_fileMenuShell.CalculateChildLayout ();
_fileMenuShell.SetFixedWidth  (_fileMenuShell.AssignedSize.Width);
_fileMenuShell.SetFixedHeight (_fileMenuShell.AssignedSize.Height);

// ---- Create menu button.

X11Graphic cbw0GraphicA = XrwTheme.GetGraphic ( _display,_screenNumber,
    X11Graphic.StockIcon.FileGeneric16);
X11Graphic cbw0GraphicB = XrwTheme.GetGraphic ( _display,_screenNumber,
    X11Graphic.StockIcon.FolderClose16);
XrwMenuButton commandFileMenu = XrwMenuButton.NewXrwMenuButtonWidget
    (hboxFileRibbon, "File", cbw0GraphicA, true, cbw0GraphicB, true);
commandFileMenu.FrameType = XrwTheme.StaticFrameType;
commandFileMenu.FrameWidth = XrwTheme.StaticFrameWidth;
commandFileMenu.ExpandToAvailableHeight = true;

// ---- Register menu to menu button and insert menu button into parent widget.

commandFileMenu.Menu = _fileMenuShell;
hboxFileRibbon.AddChild (commandFileMenu); 

To clean up the popup menu shell, an additional application's close delegate must be registered:

    // Register close event.
    this.WmShellClose += HandleShellClose;

...

/// <summary> Application specific processing of the WmShellClose event. </summary>
/// <param name="source"> The widget, the ApplicationClose event is
/// assigned to. <see cref="XrwRectObj"/> </param>
/// <param name="e"> The event data. <see cref="XawClientMessageEvent"/> </param>
/// <remarks> Set XawClientMessageEvent.
/// Set result to nonzero to stop further event processing. </remarks>
void HandleShellClose (XrwRectObj source, XrwClientMessageEvent e)
{
    if (_fileMenuShell != null)
    {
        this.RemoveChild (_fileMenuShell);
        _fileMenuShell.Dispose ();
    }
    
    // Go on calling delegates...
    e.Result = 0;
}

Since the WmShellClose delegate is invoked in reverse order, the clean up process always processes from derived classes back to the base class.

/// <summary> Handle the ClientMessage event. </summary>
/// <param name="e"> The event data. <see cref="XawClientMessageEvent"/> </param>
/// <remarks> Set XawClientMessageEvent.
/// Set result to nonzero to stop further event processing. </remarks>
public void OnClose (XrwClientMessageEvent e)
{
    // Call the close delegates in reverse order!
    object[]    param = new object[] {this, e};
    Delegate[]    delegates = WmShellClose.GetInvocationList();
    for (int i=delegates.Length-1;i>=0;i--)
        delegates[i].DynamicInvoke (param);
        
    //WmShellCloseDelegate wmShellClose = WmShellClose;
    //if (wmShellClose != null)
    //    wmShellClose (this, e);
}

This enables resource deallocation without memory leaks.

Usage of standard dialogs

Curently these standard dialogs are available:

  • XrwMessageBox for a notification only message box (no input except the choice between OK and Cancel).
  • XrwFileSelectionDialog for single file selection.
  • XrwBitmapAndVectorFontSelectionDialog to select a font using all X11 font information.

This is an image of the XrwMessageBox.

This is an image of the XrwFileSelectionDialog.

This is an image of the XrwBitmapAndVectorFontSelectionDialog.

Widget set

The widget names and functionality follow the ideas of the "Athena widget set" with a little influence of the "Motif widget set" and GTK. The widget set is not complete, but continuously growing. The widget hierarchy looks as follows:

Simple widgets

The simple widgest are described within this article.

XrwObject:IDisposable ultimate base object[1, ∅] of this widget set
XrwRectObject fundamental base object[1, ∅] with geometry
XrwVisibleRectObject fundamental base object[1, ∅] with drawing
XrwCore universal base gadget/widget[2/3, ∅]
XrwLabelBase static label base object[2/3, ∅]
| ⌊ XrwComboBox drop down selection widget[3]
| ⌊ XrwLabelstatic label[2/3]
| | ⌊ XrwCommandcommand button widget[3]
| | | ⌊ XrwMenuButtonbutton widget[3], to pop up a simple menu
| | ⌊ XrwSmesimple menu entry gadget[2]
| ⌊ XrwTextSpinButton spin button widget[3], to spin text constants
| ⌊ XrwToggle toggle button widget[3]
| XrwRadioradio button widget[3]
| XrwNotebookTab notebook tab button widget[3]
XrwSimpleuniversal object[2/3]
| ⌊ XrwList list widget[3]
| ⌊ XrwRibbonCommandBase base object[2, ∅] of ribbon command gadgets
| | ⌊ XrwRibbonButton command button gadget[2] for ribbon
| | | ⌊ XrwRibbonSplitButton button gadget[2] for ribbon, to pop up a simple menu
| | ⌊ XrwRibbonControlGroup gadget[2] for ribbon, to organize control group nodes
| ⌊ XrwScrollbar scroll bar widget[3]
| ⌊ XrwText single line text edit widget[3]
| ⌊ XrwTree toggle button widget[3]
⌊ XrwCompositecontainer[2/3, ∅], managing many children

[1] object = invisible and windowless, uses neither the ***parent*** window nor an ***onw*** window
[2] gadget = uses the ***parent*** window instead of an ***onw*** window, saves resources compared to widget, but can receive events only if forwarded from the widget it is contained in
[3] widget = has an ***onw*** window, can creceive events directly from the WM[4]
[4] WM = Windows Manager
[∅] do not instantiate

Composite widgets

The composite widgets are, starting with , described within the new article Programming the Roma Widget Set (C# X11) - a zero dependency GUI application framework - Part 3, Composite widgets.

XrwObject

The XrwObject class is the ultimate base class of the widget set. It is comparable to Athena's "Object".

The X Toolkit Intrinsics's description for "Object" says (X Toolkit Intrinsics Reference Manual):
The Object is the root of the class hierarchy; it does not have a superclass. All objects and widgets are subclasses of Object. Object encapsulates the mechanismus for resource management and is never instanciated.

This class is abstract and can not be instantiated.

Inheritance (↑)

IDisposable --> XrwObject

Properties

NameTypeAccessDefault/Fallback
HasOwnWindow bool get false
  • HasOwnWindow distinguishes whether object has an own window on X server side or not - or in other worst distinguishes between gadget (false, no window on X server side) and widget (true).

Methods

  • Dispose() implements the IDispose interface.
  • DisposeByParent() should be used to dispose any children and the base class explicitly.
  • Static SendExposeEvent() is a helper to easily send an ExposeEvent event.

XrwRectObject

The XrwRectObject class is the fundamental base class for rectangle objects. It is comparable to Athena's "RectObj".

The X Toolkit Intrinsics's description for "RectObj" says (X Toolkit Intrinsics Reference Manual):
The RectObj is a direct subclass of Object. It does not have a window, but does have a width, height and location, and encapsulates the mechanismus for geometry management.
RectObj can be subclassed to provide widget-like objects (sometimes called "gadgets") that do not use windows and that do not have features often unused in simple widgets. This can save memory resources both in the server and in applications.

This class is abstract and can not be instantiated.

The image shows the general capabilities of a XrwRectObject.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject

New event definitions

To receive events, a window on X server side is required (the object must be a widget, not a gadget). Otherwise events can only be forwarded from widgets to child gadgets. (Athena uses this approach as well, to forward events from "SimpleMenu" to "Sme*".)

  • ButtonPress occures after the object has been pressed by a mouse button and is calling registered event handler delegates.
  • ButtonRelease occures after the object has been released by a mouse button and is calling registered event handler delegates.
  • Enter occures after the object has been entered and is calling registered event handler delegates.
  • Leave occures after the object has been leaved and is calling registered event handler delegates.
  • FocusIn occures after the object has receivedthe input focus and is calling registered event handler delegates.
  • FocusOut occures after the object has lost the input focus and is calling registered event handler delegates.
  • Expose occures if the object has to be redrawn and is calling registered event handler delegates.
  • Motion occures after the mouse pointer has been moved within the object and is calling registered event handler delegates.
  • KeyPress occures after the object has received a keyboard key press and is calling registered event handler delegates.
  • KeyRelease occures after the object has received a keyboard key release and is calling registered event handler delegates.

New properties

NameTypeAccessDefault/Fallback
AssignedPositionTPointget [0, 0]
AssignedSizeTSizeget [-1, -1]
BorderColor TPixelget, set XrwTheme.BorderWidth
BorderWidth intget, set 0
FixedSizeTSizeget [-1, -1] (dynamic width/heigt)
IgnoreEventDelegatesboolget, set false (process/transmit events)
IsFixedHeightbool get false (dynamic heigt)
IsFixedWidthboolget false (dynamic width)

  • AssignedPosition get the preferred position, the geometry management has assigned to the object, or the fixed position.
  • AssignedSize get the preferred size, the geometry management has assigned to the object, or the fixed size.
  • BorderColor get or set the border color.
  • BorderWidth get or set the border width.
  • FixedSize get the size, defining as fixed size. Default is (-1, -1).
  • IgnoreEventDelegates distinguish whether to ignore registered event delegates or not.
  • IsFixedHeight distinguish between fixed and dynamic height. Only on dynamic height the geometry management can assign the preferred height. Default is false.
  • IsFixedWidth distinguish between fixed and dynamic width. Only on dynamic width the geometry management can assign the preferred width. Default is false.

New methods

  • CalculateChildLayout() distribute the available size to the children (if any) with regard to their PreferredSize, ExpandToAvailableHeight, ExpandToMaxSiblingHeight, ExpandToAvailableWidth, and ExpandToMaxSiblingWidth and set the AssignedSize and AssignedPosition.
  • ClientArea() calculate the client area (the rectangle inside the border).
  • InsideAssignedBoundings() determine whether idicated point coordinates are inside assigned bounding box. The coordinates must be within the local coordinate system of the apprpriate window.
  • MinimumSize() calculate the minimum size.
  • PreferredSize() calculate the preferred size.
  • SetFixedHeight() set the fixed height (a value of -1 enables dynamic height).
  • SetFixedWidth() set the fixed width (a value of -1 enables dynamic width).

Event handler

  • OnButtonPress handle the ButtonPressEvent event.
  • OnButtonRelease handle the ButtonReleaseEvent event.
  • OnEnter handle the EnterEvent event.
  • OnLeave handle the LeaveEvent event.
  • OnFocusIn handle the FocusInEvent event.
  • OnFocusOut handle the FocusOutEvent event.
  • OnExpose handle the ExposeEvent event.
  • OnMotion handle the MotionEvent event.
  • OnKeyPress handle the KeyPressEvent event.
  • OnKeyRelease handle the KeyReleaseEvent event.

XrwVisibleRectObject

The XrwVisibleRectObject class is the fundamental base class for visible rectangle objects. It is comparable to Athena's "unnamed".

This class is abstract and can not be instantiated.

The image shows the general capabilities of a XrwVisibleRectObject.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject

New properties

NameTypeAccessDefault/Fallback
BackgroundColorDarkTPixel get, set XrwTheme.StaticBackgroundColorDark
BackgroundColorLight TPixel get, set XrwTheme.StaticBackgroundColorLight
BackgroundColorMedium TPixel get, set XrwTheme.StaticBackgroundColorMedium
Display IntPtr get != IntPtr.Zero
ExpandToAvailableHeight boolget, set false
ExpandToMaxSiblingHeightboolget, set false
ExpandToAvailableWidthboolget, set false
ExpandToMaxSiblingWidthboolget, set false
FrameType TFrameType get, set TFrameType.None
FrameWidth int get, set XrwTheme.NonInteractingFrameWidth
GC IntPtr get != null
IsGradientBackgroundTPixelget XrwTheme.LightShadowColor
IsRealized bool get XrwTheme.LightShadowColor
Screen intget > 0
ShadowColorDark TPixel get XrwTheme.DarkShadowColor
ShadowColorLight TPixel get XrwTheme.DarkShadowColor
Window IntPtr get != null
  • BackgroundColorDark get or set the background color 3/3 to use for background drawing.
  • BackgroundColorLight get or set the background color 1/3 to use for background drawing
  • BackgroundColorMedium get or set the background color 2/3 to use for background drawing
  • Display get the display pointer.
  • ExpandToAvailableHeight distinguish whether to expand height equal to the available height (defined by the XrwComposite it is contained).
  • ExpandToAvailableWidth distinguish whether to expand width equal to the available width (defined by the XrwComposite it is contained).
  • ExpandToMaxSiblingHeight distinguish whether to expand height equal to the sibling's max. height. Siblings are contained in the same XrwComposite.
  • ExpandToMaxSiblingWidth distinguish whether to expand width equal to the sibling's max. width. Siblings are contained in the same XrwComposite.
  • FrameType get or set the frame type.
  • FrameWidth get or set the frame width.
  • GC get the grphics context.
  • IsGradientBackground get whether the background has a gradient.
  • IsRealized get he visibility state (true, if object is realized).
  • Screen get the screen number.
  • ShadowColorDark get the frame color to use for dark shadow drawing.
  • ShadowColorLight get the frame color to use for light shadow drawing.
  • Window get the window pointer.

New methods

  • GetContentArea() calculate the content area.
  • GetWindowAttributes() determine the window attributes from the X server.
  • GetWinwowRectangle() get the window rectangle. This is a specialized call to GetWindowAttributes().
  • DrawArrow draws a closed filled arror (e.g. for XrwTheme.GeneralStyle.WinClassic) or an open arrow (e.g. for XrwTheme.GeneralStyle.Gtk2Clearlooks) used for scroll bars, forth and back buttons.
  • DrawBackground() draw the background.
  • DrawBackgroundHGradient() draw the background with horizontal gradient.
  • DrawBackgroundVGradient() draw the background with vertical gradient.
  • DrawBorder() draw the border.
  • DrawFrame() draw the frame.
  • DrawTextLine() draw a single text line.
  • MeasureTextLineBoundings() measure a text line's bounding box using the default font of indicated graphics context.
  • MeasureTextLineSize() measure a text line's size using the default font of indicated graphics context.
  • DrawTextLine() draw a single text line.
  • DrawTextLines() draw multiple text line.

Overridden methods (XrwRectObj)

  • MinimumSize() calculate the minimum size.
  • PreferredSize() calculate the preferred size.
  • SetFixedHeight() set the fixed height (a value of -1 enables dynamic height).
  • SetFixedWidth() set the fixed width (a value of -1 enables dynamic width).

XrwCore

The XrwCore class is the universal base object for widgets/gadgets. It is comparable to Athena's "Core".

The Athena's description for "Core" says (X Window System Athena Widgets, Quick Reference Guide):
The core widget forms the basis for all the other widget classes. It is the highest level widget class that can actually be displayed (its parents in the class hierarchy have no windows associated with them, and thus aren’t very interesting from the application programmer’s point of view). The Core widget is sometimes used as a drawing area, but otherwise it is rarely instantiated.

This class is typically not instantiated.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore

New properties

NameTypeAccessDefault/Fallback
ApplicationShellXrwApplicationShellget null
Parent XrwCore get null
Sensitive bool get, set true
WmShell XrwWmShell getfalse
  • ApplicationShell get the application shell this object is child of.
  • HasOwnWindow distinguish between gadget (false) and widget (true).
  • Parent get the parent object, if any.
  • Sensitive distinguish whether this object is active / receives input.
  • WmShell get the WM shell this widget is registered for, if any.

Overridden properties (XrwObject)

  • HasOwnWindow distinguishe between gadget (false) and widget (true).

New methods

  • AllocateClosestColor() look up the underlaying colormap to investigate the closest color value provided.
  • AllWindowedWidgets() return the collection of all windowed child widgets.
  • AllWindowlessWidgets() return the collection of all windowless child widgets.
  • Realize() allocate and map the resources of the associated window (if object is a widget/has own window) on the X server. Makes the object visible.
  • Redraw() redraw the object.
  • Unrealize() unmap and free the resources of the associated window (if object is a widget/has own window) on the X server. Makes the object invisible.

Overridden event handler (XrwRectObj)

  • OnExpose() handle the ExposeEvent event.

XrwLabelBase

The XrwLabelBase class is the base class for static text display widgets and gadgets.

The XrwLabelBase class implements the fundamental functionality of a static text display. Such a class is unknown to Athena and GTK, but there are a lot of Xrw classes, that benefit from the fundamental functionality of a static text display.

This class is abstract and can not be instantiated.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwLabelBase

New properties

NameTypeAccessDefault/Fallback
Labelstring get, set
LinesMultiline get
HorzTextAlignfloat get, set 0.5
VertTextAlignfloat get, set 0.5
Spaceint get 4
TextColorTPixel get, set XrwTheme.TextColor
FontSpecification string get
FontId IntPtr getIntPtr.Zero
  • Label get or set the (multiline) label text to display.
  • Lines get the label to display, transformed into measured lines.
  • HorzTextAlign get or set the horizontal text alignment. 0.0 aligns left, 0.5 aligns center and 1.0 right.
  • VertTextAlign get or set the vertical text alignment. 0.0 aligns top, 0.5 aligns middle and 1.0 bottom.
  • Space get the spacing around the label. Used from left bitmap to label (if != null), from label to right bitmap (if != null) and from label to top/bottom.
  • TextColor get or set the text color of the label.
  • FontSpecification get the current font specification. An empty string indicates the initially used system default font. To set the font specification use SetFont() method.
  • FontId get the current font id. The IntPtr.Zero indicates the initially used system default font.

New methods

  • SetFont() set a font different to the X server's default font.

XrwComboBox

The XrwComboBox class implements a drop down selection calling button widget, that pops up an XrwSpinMenu via the button press event. It is comparable to Gtk's ComboBoxText.

A XrwComboBox is a widget that allows the user to choose from a list of valid choices. The XrwComboBox displays the selected choice. When activated, the XrwComboBox displays a XrwSpinMenu popup which allows the user to make a new choice.

This class has no public constructor, but one factory method. NewXrwComboBoxWidget creates a new XrwComboBox.

This class incorporates a XrwSpinMenu to realize the selection popup (creation and disposal is handled automatically).

The image shows a XrwComboBox with left and right (transparent multicolor) bitmap as well as delimiter and right arrow.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwLabelBase --> XrwComboBox

New properties

NameTypeAccessDefault/Fallback
LeftMargin int get, set true
RightMargin int get, set true
FocusedBackground- ColorDark TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorDark
FocusedBackground- ColorLight TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorLight
FocusedBackground-ColorMedium TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorMedium
DelimiterColorDark TPixel get, set XrwTheme.TextColor
DelimiterColorLight TPixel get, set XrwTheme.InverseTextColor
Focused bool get false
Pressed bool get, set false
Dropdown XrwSpinMenu get
Selection int get, set false
  • LeftMargin get or set the space (in pixels) that will be lef free between the left edge and the content.
  • RightMargin get or set the space (in pixels) that will be lef free between the right edge and the content.
  • FocusedBackgroundColorDark get or set the focused background color 3/3.
  • FocusedBackgroundColorLight get or set the focused background color 1/3.
  • FocusedBackgroundColorMedium get or set the focused background color 2/3.
  • DelimiterColorDark get or set the delimiter color 2/2.
  • DelimiterColorLight get or set the delimiter color 1/2.
  • Focused get the focused indicator. A XrwComboBox is focused if it has input focus and the mouse pointer is placed inside the widget.
  • Pressed get or set the pressed indicator.
  • Dropdown get the associated XrwSpinMenu dropdown.
  • Selection get or set the index of the selected entry.

Overridden methods (XrwRectObj)

  • MinimumSize() calculate the minimum size.
  • PreferredSize() calculate the preferred size.

Overridden event handler (XrwRectObj)

  • OnExpose() handle the ExposeEvent event.

Preregistered event delegates

  • Enter += HandleEnterDefault set focused.
  • Leave += HandleLeaveDefault unset focused.
  • ButtonPress+= HandleButtonPressDefault set pressed.
  • _dropdown.ChildAdded += HandleChildAddedDefault performs some configuration for XrwSme menu panes, added to the associated XrwSpinMenu dropdown.
  • sme.ButtonRelease += HandleChildButtonRelease performs the button release action for XrwSme menu panes, added to the associated XrwSpinMenu dropdown.

XrwLabel

The XrwLabel class implements a static label. It is comparable to Athena's "Label" widget.

The Athena's description for "Label" says (X Window System Athena Widgets, Quick Reference Guide):
A Label widget holds a graphic displayed within a rectangular region of the screen. The graphic may be a text string containing multiple lines of characters in an 8 bit or 16 bit character set (to be displayed with a font), or in a multi-byte encoding (for use with a fontset). The graphic may also be a bitmap or pixmap. The Label widget will allow its graphic to be left, right, or center justified. Normally, this widget can be neither selected nor directly edited by the user. It is intended for use as an output device only.

This class has no public constructor, but two factory methods. NewXrwLabelWidget/NewLabelGadged create a new XrwLabel.

The image shows a multiline XrwLabel with left and right (transparent multicolor) bitmap.

This class introduces four special string constants

  • TextToArrowString.Up,
  • TextToArrowString.Down,
  • TextToArrowString.Left and
  • TextToArrowString.Right,

that are - set as the widget/gadget's label - drawn as an arrow instead of an string. This behaviour is applied especially for XrwSpinBox and XrwSpinMenu but can also be useful for any other purpose.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwLabelBase --> XrwLabel

New properties

NameTypeAccessDefault/Fallback
LeftMargin int get, set 4
RightMargin int get, set 4
LeftBitmap X11Graphic getnull
LeftBitmapShared bool get false
LeftBitmapVertAlign float get, set 0.5
RightBitmap X11Graphic get null
RightBitmapShared bool get false
RightBitmapVertAlign float get, set 0.5
  • LeftMargin get or set the space (in pixels) that will be lef free between the left edge and the content.
  • RightMargin get or set the space (in pixels) that will be lef free between the right edge and the content.
  • LeftBitmap get left bitmap.
  • LeftBitmapShared get the left bitmap shared flag. Not shared bitmaps will be disposed by the XrwLabel's Dispose(), shared bitmaps won't. Always use true for stock icons.
  • VertLeftBitmapAlign get or set the vertical left bitmap alignment. 0.0 aligns top, 0.5 aligns middle and 1.0 bottom.
  • LeftBitmapVertAlign get or set the vertical left bitmap alignment. 0.0 aligns top, 0.5 aligns middle and 1.0 bottom.
  • RightBitmap get right bitmap.
  • RightBitmapShared get the right bitmap shared flag. Not shared bitmaps will be disposed by the XrwLabel's Dispose(), shared bitmaps won't. Always use true for stock icons.
  • VertRightBitmapAlign get or set the vertical right bitmap alignment. 0.0 aligns top, 0.5 aligns middle and 1.0 bottom.
  • RightBitmapVertAlign get or set the vertical right bitmap alignment. 0.0 aligns top, 0.5 aligns middle and 1.0 bottom.

New methods

  • SetLeftBitmap() set the left bitmap and bitmap shared flag.
  • SetRightBitmap() set the right bitmap and bitmap shared flag.

Overridden methods (XrwRectObj)

  • MinimumSize() calculate the minimum size.
  • PreferredSize() calculate the preferred size.

Overridden event handler (XrwRectObj)

  • OnExpose() handle the ExposeEvent event.

XrwCommand

The XrwCommand class implements a command button widget, that calls a callback via the clicked event. It is comparable to Athena's "Command" widget.

The Athena's description for "Command" says (X Window System Athena Widgets, Quick Reference Guide):
The Command widget is an area, often rectangular, that contains text or a graphical image. Command widgets are often referred to as ‘‘push buttons.’’ When the pointer is over a Command widget, the widget becomes highlighted by drawing a rectangle around its perimeter. This highlighting indicates that the widget is ready for selection. When mouse button 1 is pressed, the Command widget indicates that it has been selected by reversing its foreground and background colors.
When the mouse button is released, the Command widget’s notify action is invoked, calling all functions on its callback list. If the pointer is moved off of the widget before the pointer button is released, the widget reverts to its normal foreground and background colors, and releasing the pointer button has no effect. This behavior allows the user to cancel an action.

This class has no public constructor, but one factory method. NewXrwCommandWidget creates a new XrwCommand.

The image shows a XrwCommand with left and right (transparent multicolor) bitmap.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwLabelBase --> XrwLabel --> XrwCommand

New properties

NameTypeAccessDefault/Fallback
Focused boolget false
FocusedBackground- ColorDark TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorDark
FocusedBackground- ColorLight TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorLight
FocusedBackground- ColorMedium TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorMedium
  • Focused get the focused indicator. A XrwCommand is focused if it has input focus and the mouse pointer is placed inside the widget.
  • FocusedBackgroundColorDark get or set the focused background color 3/3.
  • FocusedBackgroundColorLight get or set the focused background color 1/3.
  • FocusedBackgroundColorMedium get or set the focused background color 2/3.

New methods

None.

New event handler

  • OnClicked() handle the Clicked event.

Overridden event handler (XrwRectObj)

  • OnExpose() handle the ExposeEvent event.

Preregistered event delegates

  • Enter += HandleEnterDefault set focused.
  • Leave += HandleLeaveDefault unset focused.
  • ButtonPress+= HandleButtonPressDefault set pressed.
  • ButtonRelease+= HandleButtonReleaseDefault unset pressed and call OnClicked().

XrwMenuButton

The XrwMenuButton class implements a popup menu calling button widget, that pops up an XrwSimpleMenu via the button press event. It is comparable to Athena's "MenuButton".

The X Toolkit Intrinsics's description for "MenuButton" says (Athena Widget Set — C Language Interface):
The MenuButton widget is an area, often rectangular, that displays a graphic. The graphic may be a text string containing multiple lines of characters in an 8 bit or 16 bit character set (to be displayed with a font), or in a multi-byte encoding (for use with a fontset). The graphic may also be a bitmap or pixmap.
When the pointer cursor is on a MenuButton widget, the MenuButton becomes highlighted by drawing a rectangle around its perimeter. This highlighting indicates that the MenuButton is ready for selection. When a pointer button is pressed, the MenuButton widget will pop up the menu named in the menuName resource.

This class has no public constructor, but one factory method. NewXrwMenuButtonWidget creates a new XrwMenuButton.

This class incorporates a XrwSimpleMenu to realize the popup menu (creation and disposal is handled automatically).

The image shows a simple XrwMenuButton with left and right (transparent multicolor) bitmap - including it's poped up menu.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwLabelBase --> XrwLabel --> XrwCommand --> XrwMenuButton

New properties

NameTypeAccessDefault/Fallback
Menu XrwSimpleMenuget != null
  • Menu get or set the menu to pop up.
  • Menu get the associated menu to pop up. Starting with version 0.2 the menu is integral part of the XrwMenuButton, it will be automatically created and disposed with the XrwMenuButton.

New methods

None.

Preregistered event delegates

Inherited from XrwCommand.
  • ButtonPress += HandleButtonPressDefault pop up registered XrwSimpleMenu.

Usage

A XrwMenuButton is typically used in conjunction with a XrwSimpleMenu. See XrwSimpleMenu for class details.

The sample code shows how to create a menu button and it's associated simple menu, containing three entries.

// ---- Create a menu button.
XrwMenuButton commandFileMenu = XrwMenuButton.NewXrwMenuButtonWidget (hboxFileRibbon,
    "File", cbw0GraphicA, true, cbw0GraphicB, true);
hboxFileRibbon.AddChild (commandFileMenu);

// ---- Create the associated simple menu entries.
X11Graphic menuEntryGraphicA = XrwTheme.GetGraphic ( _display, _screenNumber,
    X11Graphic.StockIcon.Information16);
X11Graphic menuEntryGraphicB = XrwTheme.GetGraphic ( _display, _screenNumber,
    X11Graphic.StockIcon.Question16);
X11Graphic menuEntryGraphicC = XrwTheme.GetGraphic ( _display, _screenNumber,
    X11Graphic.StockIcon.Warning16);
XrwSme menuEntry1 = XrwSme.NewXrwSmeGadget (commandFileMenu.Menu, "File menu entry 1",
    menuEntryGraphicA, true, menuEntryGraphicB, true);
commandFileMenu.Menu.AddChild (menuEntry1);
menuEntry1.ButtonRelease += HandleMenuEntry1ButtonRelease;
XrwSme menuEntry2 = XrwSme.NewXrwSmeGadget (commandFileMenu.Menu, "File menu entry 2",
    menuEntryGraphicA, true, menuEntryGraphicB, true);
commandFileMenu.Menu.AddChild (menuEntry2);
menuEntry2.ButtonRelease += HandleMenuEntry2ButtonRelease;
XrwSme menuEntry3 = XrwSme.NewXrwSmeGadget (commandFileMenu.Menu, "Close app",
    menuEntryGraphicC, true, null, false);
commandFileMenu.Menu.AddChild (menuEntry3);
menuEntry3.ButtonRelease += HandleCloseButtonRelease; 

It is recommended to add any XrwSme instance to the simple menu first and connect the ButtonRelease event handler second. This is because the AddChild() mehtod invokes the XrwConposite's ChildAdded event. This event has a default handler for XrwSimpleMenu, that registers the XrwSimpleMenu.HandleChildButtonReleaseDefault to the new child and this event handler calls Unrealize() for the XrwSimpleMenu on XrwSme's ButtonRelease event.

It must be guaranteed, that Unrealize() for the XrwSimpleMenu ist the first action that takes place on a XrwSme's ButtonRelease event. Otherwise, an 'application close' command would clean up the application's widget hierarchy first and Unrealize() for the XrwSimpleMenu would be called after that, which would be too late.

If any XrwSme instance is addeed to the simple menu after the ButtonRelease event handler has been connected to this XrwSme instance, the invocation sequence of the ButtonRelease event handler has to be adopted. This is done automatically by XrwSimpleMenu.HandleChildAddedDefault, but requires additional effort:

/// <summary> Handle the ChildAdded event. </summary>
/// <param name="source"> The menu, that the menu entry has been added to. <see cref="XrwCore"/> </param>
/// <param name="added"> The menu entry, that has been added to the menu. <see cref="XrwCore"/> </param>
void HandleChildAddedDefault (XrwCore source, XrwCore added)
{
    XrwSme sme = added as XrwSme;
    if (sme == null)
        return;
    
    // Add the default handler to singnal selection on FIRST POSITION.
    // This ensures the menu's Unrealize() BEFORE any other processing.
    // It is important to keep the right sequence of Unrealize() calls in case of application close.
    System.Delegate[]    delegates = sme.ButtonReleaseInvocationList;
    for (int count = 0; count < delegates.Length; count++)
        sme.ButtonRelease -= (Xrw.ButtonReleaseDelegate)delegates[count];
    sme.ButtonRelease += HandleChildButtonReleaseDefault;
    for (int count = 0; count < delegates.Length; count++)
        sme.ButtonRelease += (Xrw.ButtonReleaseDelegate)delegates[count];
}

XrwSme

The XrwSme class implements a simple menu entry gadget. It is comparable to Athena's "SmeBSB" object.

The X Toolkit Intrinsic's description for "SmeBSB" says (Athena Widget Set — C Language Interface):
The SmeBSB object is used to create a menu entry that contains a string, and optional bitmaps in
its left and right margins. Since each menu entry is an independent object, the application is able
to change the font, color, height, and other attributes of the menu entries, on an entry by entry
basis. The format of the string may either be the encoding of the 8 bit font utilized, or in a multibyte
encoding for use with a fontSet.

The image shows two XrwSme with left and right (transparent multicolor) bitmap contained in a XrwDialogShell poped up from a XrwMenuButton.


Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwLabelBase --> XrwLabel --> XrwSme

New properties

NameTypeAccessDefault/Fallback
Focused boolget false
FocusedBackground-
ColorDark
TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorDark
FocusedBackground-
ColorLight
TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorLight
FocusedBackground-
ColorMedium
TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorMedium
FocusedSelectedBackground-
ColorPixelDark
TPixel get, set XrwTheme.InteractiveFocused-SelectedBackgroundColorDark
FocusedSelectedBackground-
ColorPixelLight
TPixel get, set XrwTheme.InteractiveFocused-SelectedBackgroundColorLight
FocusedSelectedBackground-
ColorPixelMedium
TPixel get, set XrwTheme.InteractiveFocused-SelectedBackgroundColorMedium
Selectedboolget, set false
SelectedBackground-
ColorDark
TPixel get, setXrwTheme.InteractiveSelected-BackgroundColorDark
SelectedBackground-
ColorLight
TPixel get, set XrwTheme.InteractiveSelected-BackgroundColorLight
SelectedBackground-
ColorMedium
TPixel get, set XrwTheme.InteractiveSelected-BackgroundColorMedium
  • Focused get the focused indicator. A XrwSme is focused if it has input focus and the mouse pointer is placed inside the widget.
  • FocusedBackgroundColorDark get or set the focused background color 3/3.
  • FocusedBackgroundColorLight get or set the focused background color 1/3.
  • FocusedBackgroundColorMedium get or set the focused background color 2/3.
  • FocusedSelectedBackgroundColorDark get or set the selected and focused sme's background color 3/3.
  • FocusedSelectedBackgroundColorLight get or set the selected and focused sme's background color 1/3.
  • FocusedSelectedBackgroundColorMedium get or set the selected and focused sme's background color 2/3.
  • Selected get or set the selected indicator. A XrwSme is selected if it has been set to selected by application's code.
  • SelectedBackgroundColorDark get or set the selected node's background color pixel 3/3.
  • SelectedBackgroundColorLight get or set the selected node's background color pixel 1/3.
  • SelectedBackgroundColorMedium get or set the selected node's background color pixel 2/3.

New methods

None.

Overridden event handler (XrwRectObj)

  • OnExpose() handle the ExposeEvent event.

Preregistered event delegates

  • Enter += HandleEnterDefault set focused.
  • eave += HandleLeaveDefault unset focused.

XrwTextSpinButton

The XrwTextSpinButton class implements a spin button widget, that can spin text constants via the clicked event. It is roughly comparable to GTK's SpinButton widget, but doesn't spin an integer or floating point number.

The XrwTextSpinButton is ideal way to allow the user to set the value of some attribute. Rather than having to directly type a string into a XrwText, the XrwTextSpinButton allows the user to click on one of two arrows to increment or decrement the displayed text constant. The user can not type in any text, but has to select one of the predefined text constants.

This class has no public constructor, but two factory methods. NewHXrwTextSpinButton/NewVXrwTextSpinButton create a new horizintal/vertical spinning XrwTextSpinButton.

The image shows a XrwTextSpinButton with horizontal (left and right) navigators as well as a XrwTextSpinButton with vertical (top and bottom) navigators.

New properties

NameTypeAccessDefault/Fallback
ArrowColor TPixel get, set XrwTheme.TextColor
FocusedBackground- ColorDark TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorDark
FocusedBackground- ColorLight TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorLight
FocusedBackground- ColorMedium TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorMedium
DelimiterColorDark TPixel get, set XrwTheme.TextColor
DelimiterColorLight TPixel get, set XrwTheme.InverseTextColor
IsHorizontal bool get
SelectedIndex int get, set 0
SelectedValue string get
  • ArrowColor get or set the color of the navigator arrows.
  • FocusedBackgroundColorDark get or set the focused background color 3/3.
  • FocusedBackgroundColorLight get or set the focused background color 1/3.
  • FocusedBackgroundColorMedium get or set the focused background color 2/3.
  • DelimiterColorDark get or set the delimiter color 2/2.
  • DelimiterColorLight get or set the delimiter color 1/2.
  • IsHorizontal whether the navigator buttons are arranged horizontal (left and right) to the spinnable text.
  • SelectedIndex get or the selected value's index.
  • SelectedValue get the selected value.

New methods

None.

Overridden methods (XrwRectObj)

  • MinimumSize() calculate the minimum size.
  • PreferredSize() calculate the preferred size.

New event handler

  • OnClicked() handle the Clicked event.

Overridden event handler (XrwRectObj)

  • OnExpose() handle the ExposeEvent event.

Preregistered event delegates

  • Enter += HandleEnterDefault set focused.
  • Leave += HandleLeaveDefault unset focused.
  • ButtonPress+= HandleButtonPressDefault set pressed.
  • ButtonRelease += HandleButtonReleaseDefault unset pressed and call OnClicked().

XrwToggle

The XrwToggle class implements a toggle button widget. It is comparable to Athena's Toggle widget.

The Athena's description for "Toggle" says (X Window System Athena Widgets, Quick Reference Guide):
The Toggle widget is an area, often rectangular, containing a text label or bitmap image. This widget maintains a Boolean state (e.g. True/False or On/Off) and changes state whenever it is selected. When the pointer is on the button, the button may become highlighted by drawing a rectangle around its perimeter. This highlighting indicates that the button is ready for selection. When pointer button 1 is pressed and released, the Toggle widget indicates that it has changed state by reversing its foreground and background colors, and its notify action is invoked, calling all functions on its callback list. If the pointer is moved out of the widget before the button is released, the widget reverts to its normal foreground and background colors, and releasing the button has no effect. This behavior allows the user to cancel an action.
Toggle buttons may also be part of a radio group. A radio group is a list of at least two Toggle buttons in which no more than one Toggle may be set at any time. A radio group is identified by the widget ID of any one of its members. The convenience routine XawToggleGetCurrent will return information about the Toggle button in the radio group. Toggle widget state is preserved across changes in sensitivity.

This class has no public constructor, but one factory method. NewXrwToggleWidget creates a new XrwToggle.

The image shows three simple XrwToggles, one switched on, two switched off. To draw the radio buttons without frame, the FrameType property can be set to TFrameType.None and the FrameWidth property can be set to 0.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwLabelBase --> XrwToggle

New event definitions

The XrwToggle always receives events on it's own.

  • SwitchedOff occures after the toggle has been switched off and is calling registered event handler delegates.
  • SwitchedOn occures after the toggle has been switched on and is calling registered event handler delegates.

New properties

NameTypeAccessDefault/Fallback
LeftMargin int get, set 4
RightMargin int get, set 4
OffBitmap X11Graphic getnull
OffBitmapShared bool get false
OnBitmap X11Graphic get null
OnBitmapShared bool get false
VertBitmapAlign float get, set 0.5
Focused bool get false
FocusedBackgroundColorDark TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorDark
FocusedBackgroundColorLight TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorLight
FocusedBackgroundColorMedium TPixel get, set XrwTheme.InteractiveFocused-BackgroundColorMedium
Pressed boolget, set false
  • LeftMargin get or set the space (in pixels) that will be lef free between the left edge and the content.
  • RightMargin get or set the space (in pixels) that will be lef free between the right edge and the content.
  • OffBitmap get toggle off bitmap.
  • OffBitmapShared get the toggle off bitmap shared flag. Not shared bitmaps will be disposed by the XrwLabel's Dispose(), shared bitmaps won't.
  • OnBitmap get toggle on bitmap.
  • OnBitmapShared get the toggle on bitmap shared flag. Not shared bitmaps will be disposed by the XrwLabel's Dispose(), shared bitmaps won't.
  • VertBitmapAlign get or set the vertical bitmap alignment. 0.0 aligns top, 0.5 aligns middle and 1.0 bottom.
  • Focused get the focused indicator. A XrwToggle is focused if it has input focus and the mouse pointer is placed inside the widget.
  • FocusedBackgroundColorDark get or set the focused background color 3/3.
  • FocusedBackgroundColorLight get or set the focused background color 1/3.
  • FocusedBackgroundColorMedium get or set the focused background color 2/3.
  • Pressed get or set the pressed indicator.

New methods

  • SetOffBitmap() set the off bitmap and bitmap shared flag.
  • SetOnBitmap() set the on bitmap and bitmap shared flag.

Overridden methods (XrwRectObj)

  • MinimumSize() calculate the minimum size.
  • PreferredSize() calculate the preferred size.

New event handler

  • SwitchedOff occures after the command has been switched off and is calling registered event handler delegates.
  • SwitchedOn occures after the command has been switched on and is calling registered event handler delegates

Overridden event handler (XrwRectObj)

  • OnExpose() handle the ExposeEvent event.

Preregistered event delegates

  • Enter += HandleEnterDefault set focused.
  • Leave += HandleLeaveDefault unset focused.
  • ButtonPress += HandleButtonPressDefault switch on (if behaviour is radio button).
  • ButtonRelease += HandleButtonReleaseDefault switch on (if behaviour is radio button) or toggle (if behaviour is toggle button).

XrwRadio

The XrwRadio class implements a radio button widget. It is comparable to Gtk's RadioButton.

Radio buttons are typically grouped by a XrwRadioBox and at any time only one radio button of a group is set on, all others are set off. A single radio button performs the same basic function as a XrwToggle.
Every radio button is a member of some group of radio buttons. When one is selected, all other radio buttons in the same group are deselected.

This class has no public constructor, but one factory method NewXrwRadioWidget creates a new XrwRadio.

The image shows a horizontally oriented XrwRadioBox with three simple XrwRadios, one switched on, two switched off. To draw the radio buttons without frame, the FrameType property can be set to TFrameType.None and the FrameWidth property can be set to 0.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwLabelBase --> XrwToggle --> XrwRadio

New properties

None.

New methods

None.

Preregistered event delegates

Inherited from XrwToggle.

XrwNotebookTab

The XrwNotebookTab class implements a notebook tab button widget.

Notebook tabs are used only by a XrwNotebook and at any time only one notebook tab of a notebook is set on, all others are set off. A single notebook tab performs the same basic function as a XrwRadio.
Every notebook tab is a member of a notebook. When one is selected, all other notebook tabs in the notebook are deselected.

This class has no public constructor, but one factory method NewXrwNotebookTabWidget creates a new XrwNotebookTab.

The image shows a notebook with four tabs inside the tab-box ("File", "Dialog test", "Toggle test" and "Radio test"). The first tab "File" is selected and shows the first page inside the page-stack (with the four buttons "File", "Close menu", "Message box" and "Close app").


Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwLabelBase --> XrwToggle --> XrwRadio --> XrwNotebookTab

New properties

None.

New methods

None.

Preregistered event delegates

Inherited from XrwToggle.

XrwSimple

The XrwSimple class is a universal widget. This widget is not very useful by itself, as it has no semantics on its own. Its main purpose is to be used as a common superclass for other simple (non-composite) widgets. It might also be a good superclass to use for application specific widgets to write. It is comparable to Athena's "Simple" widget.

The Athena's description for "Simple" says (X Window System Athena Widgets, Quick Reference Guide):
The Simple widget is not very useful by itself, as it has no semantics of its own. It main purpose is to be used as a common superclass for the other simple Athena widgets. This widget adds five resources to the resource list provided by the Core widget and its superclasses.

This class has no public constructor, but two factory methods. NewXrwSimpleWidget/NewXrwSimpleGadget creates a new XrwSimple.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwSimple

New properties

None.

New methods

None.

XrwList

The XrwList class implements a toggle button widget. It is comparable to Athena's "List" widget.

The Athena's description for "List" says (X Window System Athena Widgets, Quick Reference Guide):
The List widget contains a list of strings formatted into rows and columns. When one of the strings is selected, it is highlighted, and the List widget’s Notify action is invoked, calling all routines on its callback list. Only one string may be selected at a time.

This class has no public constructor, but one factory method. NewXrwListWidget creates a new XrwList.

The image shows a simple XrwList with one selected list node.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwSimple --> XrwList

New event definitions

The XrwList always receives events on it's own.

  • EntrySelectionChanged occures after any list entry has been selected.
  • SizePreferenceChanged occures after the list preferres a new size (e. g. the content or the type of view has hanged). A XrwViewport should listen to this event.
  • SelectedEntryCommandInvoke occures after a double click, indicating that selected node should execute a command, happened.

New properties

NameTypeAccessDefault/Fallback
TextColor TPixel get, set XrwTheme.TextColor
InverseTextColor TPixel get, set XrwTheme.InverseTextColor
FocusedSelectedBackground-
ColorPixelDark
TPixel get, set XrwTheme.InteractiveFocused-
SelectedBackgroundColorDark
FocusedSelectedBackground-
ColorPixelLight
TPixel get, set XrwTheme.InteractiveFocused-
SelectedBackgroundColorLight
FocusedSelectedBackground-
ColorPixelMedium
TPixel get, set XrwTheme.InteractiveFocused-
SelectedBackgroundColorMedium
Nodes List<ListNode> get != null
SelectedBackground-
ColorDark
TPixel get, setXrwTheme.InteractiveSelected- BackgroundColorDark
SelectedBackground-
ColorLight
TPixel get, set XrwTheme.InteractiveSelected- BackgroundColorLight
SelectedBackground-
ColorMedium
TPixel get, set XrwTheme.InteractiveSelected-
BackgroundColorMedium
  • TextColor get or set the text color of a list node's label.
  • InverseTextColor get or set the text color of a selected list node's label.
  • FocusedSelectedBackgroundColorDark get or set the selected and focused node's background color pixel 3/3.
  • FocusedSelectedBackgroundColorLight get or set the selected and focused node's background color pixel 1/3.
  • FocusedSelectedBackgroundColorMedium get or set the selected and focused node's background color pixel 2/3.
  • Nodes get the list of list nodes.
  • SelectedBackgroundColorDark get or set the selected node's background color pixel 3/3.
  • SelectedBackgroundColorLight get or set the selected node's background color pixel 1/3.
  • SelectedBackgroundColorMedium get or set the selected node's background color pixel 2/3.

New methods

  • FindListNode() find a list node by a pointer position.
  • SetSelectionForList() set the indicated selection state for all list nodes.
  • SetFocusedForList() set the indicated focused state for all list nodes.
  • GetSelections() get all currently selected list nodes.

Overridden methods (XrwRectObj)

  • PreferredSize() calculate the preferred size.

New event handler

  • OnEntrySelectionChanged occures after any list entry has been selected and is calling registered event handler delegates.
  • OnSizePreferenceChanged occures after the list preferres a new size (e. g. the content or the type of view has hanged) and is calling registered event handler delegates.
  • OnSelectedEntryCommandInvoke occures after a double click, indicating that selected node should execute a command, happened and is calling registered event handler delegates.

Overridden event handler (XrwRectObj)

  • OnExpose() handle the ExposeEvent event.

Preregistered event delegates

  • ButtonRelease += HandleButtonReleaseDefault selects a list node and calls the node command on double click.
  • Motion += HandleMotionDefault focus or unfocus a list node.

XrwRibbonCommandBase

The XrwRibbonCommandBase is the base class for objects within the ribbon, calling a callback via button press event or clicked event.

Because the ribbon is implemented as one integral widget, almost all of its children (including the ribbon command bas) are implemented as gadgets. The ribbon command base consolidates the common functionality of ribbon children, that call a callback.

This class is abstract and can not be instantiated.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwSimple --> XrwRibbonCommandBase

New event definitions

None.

New properties

NameTypeAccessDefault/Fallback
FocusedBackground-
ColorDark
TPixel get, set XrwTheme.RibbonCommand-
GadgetFocused-
BackgroundColorDark
FocusedBackground-
ColorLight
TPixel get, set XrwTheme.RibbonCommand-
GadgetFocused-
BackgroundColorLight
FocusedBackground-
ColorMedium
TPixel get, set XrwTheme.RibbonCommand-
GadgetFocused-
BackgroundColorMedium
FocusedSelectedBackground-
ColorDark
TPixel get, set XrwTheme.RibbonCommand-
GadgetFocusedSelected-
BackgroundColorDark
FocusedSelectedBackground-
ColorlLight
TPixel get, set XrwTheme.RibbonCommand-
GadgetFocusedSelected-
BackgroundColorLight
FocusedSelectedBackground-
ColorMedium
List<ListNode> get XrwTheme.RibbonCommand-
GadgetFocusedSelected-
BackgroundColorMedium
SelectedBackground-
ColorDark
TPixel get, setXrwTheme.RibbonCommand-
GadgetSelected-
BackgroundColorDark
SelectedBackground-
ColorLight
TPixel get, set XrwTheme.RibbonCommand-
GadgetSelected-
BackgroundColorLight
SelectedBackground-
ColorMedium
TPixel get, set XrwTheme.RibbonCommand-
GadgetSelected-
dBackgroundColorMedium
  • FocusedBackgroundColorDark get or set the focused command gadget's background color pixel 3/3.
  • FocusedBackgroundColorLight get or set the focused command gadget's background color pixel 1/3.
  • FocusedBackgroundColorMedium get or set the focused command gadget's background color pixel 2/3.
  • FocusedSelectedBackgroundColorDark get or set the selected and focused command gadget's background color pixel 3/3.
  • FocusedSelectedBackgroundColorLight get or set the selected and focused command gadget's background color pixel 1/3.
  • FocusedSelectedBackgroundColorMedium get or set the selected and focused command gadget's background color pixel 2/3.
  • SelectedBackgroundColorDark get or set the selected command gadget's background color pixel 3/3.
  • SelectedBackgroundColorLight get or set the selected command gadget's background color pixel 1/3.
  • SelectedBackgroundColorMedium get or set the selectedd command gadget's background color pixel 2/3.

Overridden properties (XrwRectObj)

  • BorderWidth is now read only.

Overridden properties (XrwVisibleRectObj)

  • FrameWidth is now read only.

New methods

None.

Overridden methods

None.

New event handler

None.

Overridden event handler

None.

Preregistered event delegates

None.

XrwRibbonButton

The XrwRibbonButton is a command button gadget to be used within the ribbon, that calls a callback via the click event. Because it is a gadget, it's ribbon is responsible for any event processing (highlight, button press, expose, ...).

Because the ribbon is implemented as one integral widget, almost all of its children (including the ribbon button) are implemented as gadgets. The ribbon buttom is a ribbon child, that provides the functionality of a command button to the ribbon.

This class has no public constructor, but one factory method. NewXrwRibbonButton creates a new XrwRibbonButton.

The image shows one XrwRibbonPanel including the dialog launcher right beside the ribbon panel's label and three XrwRibbonButtons with CurrentSizeMode == RibbonPanelSizePolicy.Large and another XrwRibbonPanel including the dialog launcher right beside the ribbon panel's label and three XrwRibbonButtons with CurrentSizeMode == RibbonPanelSizePolicy.Medium. The first ribbon button is focused.


Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwSimple --> XrwRibbonCommandBase --> XrwRibbonButton

New event definitions

The XrwRibbonButton always receives events passed-through from it's parent XrwRibbon.

  • Clicked occures after the button has been switched and is calling registered event handler delegates.

New properties

NameTypeAccessDefault/Fallback
TextColor TPixel get, set XrwTheme.TextColor
InactiveTextColor TPixel get, set XrwTheme.ShadowFrame-
ColorDark
Labelstring get, set
Lines Multiline get
LargeBitmapX11Graphic get null
LargeBitmapShared boolget false
SmallBitmap X11Graphic get != null
SmallBitmapShared bool get false
PreferredSizeMode RibbonPanelSizePolicy get RibbonPanelSizePolicy.Large
CurrentSizeMode RibbonPanelSizePolicy get RibbonPanelSizePolicy.Large
Focused bool get false
  • TextColor get or set the text color of a ribbon button's label.
  • InactiveTextColor get or set text color of an inactive ribbon button's label.
  • Label get or set the (multiline) label text to display.
  • Lines get the label to display, transformed into measured lines.
  • LargeBitmap get the large ribbon button's bitmap. If LargeBitmap is provided, the PreferredSizeMode is set to RibbonPanelSizePolicy.Large, otherwise it is set to RibbonPanelSizePolicy.Medium. The bitmap must be of size 32x32 pixel.
  • LargeBitmapShared get the large bitmap shared flag. Not shared bitmaps will be disposed by the XrwRibbonButton's Dispose(), shared bitmaps won't.
  • SmallBitmap get the small ribbon button's bitmap. The LargeBitmap must be provided for every XrwRibbonButton, to support the RibbonPanelSizePolicy.Medium and RibbonPanelSizePolicy.Small. The bitmap must be of size 16x16 pixel.
  • SmallBitmapShared get the small bitmap shared flag. Not shared bitmaps will be disposed by the XrwRibbonButton's Dispose(), shared bitmaps won't.
  • PreferredSizeMode get the preferred ribbon button's size mode. It will be set automatically to RibbonPanelSizePolicy.Large, if a LargeBitmap is provided, or to RibbonPanelSizePolicy.Medium otherwise.
  • CurrentSizeMode get the current ribbon button's size mode. It will be set equsal to PreferredSizeMode initially, but can change to any smaller size mode, if ribbon button's parent ribbon panel has been contracted.
  • Focused get the focused indicator. A XrwRibbonButton is focused if it's windowed parent has input focus and the mouse pointer is placed inside the gadget.

New methods

  • SetLargeBitmap() set the large bitmap and bitmap shared flag.
  • SetSmallBitmap() set the small bitmap and bitmap shared flag.

Overridden methods (XrwRectObj)

  • MinimumSize() calculate the minimum size.
  • PreferredSize() calculate the preferred size.

Overridden methods (XrwCore)

  • Redraw() redraw the object.

New event handler

  • OnClicked() handle the Clicked event.

Overridden event handler

None.

Preregistered event delegates

  • ButtonRelease += HandleButtonReleaseDefault update the selection (end) and caret position.

XrwRibbonSplitButton

The XrwRibbonSplitButton is a split button gadget to be used within the ribbon, that pops up a menu via the button press event. Because it is a gadget, it's ribbon is responsible for any event processing (highlight, button press, expose, ...).

Because the ribbon is implemented as one integral widget, almost all of its children (including the ribbon split button) are implemented as gadgets. The ribbon split buttom is a ribbon child, that provides the functionality of a menu button to the ribbon.

This class has no public constructor, but one factory method. NewXrwRibbonSplitButton creates a new XrwRibbonSplitButton.

The image shows one XrwRibbonPanel with one XrwRibbonSplitButton on CurrentSizeMode == RibbonPanelSizePolicy.Large and another XrwRibbonPanel with one XrwRibbonSplitButton on CurrentSizeMode == RibbonPanelSizePolicy.Medium. The second ribbon split button has been clicked and shows it's popup menu.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwSimple --> XrwRibbonCommandBase --> XrwRibbonButton --> XrwRibbonSplitButton

New event definitions

None.

New properties

NameTypeAccessDefault/Fallback
Menu XrwSimpleMenu get XrwTheme.TextColor
  • Menu get the associated menu to pop up.The menu is integral part of the XrwRibbonSplitButton, it will be automatically created and disposed with the XrwRibbonSplitButton.

Overridden methods (XrwCore)

  • Redraw() redraw the object.

New event handler

None.

Overridden event handler

None.

Peregistered event delegates

  • ButtonPress += HandleButtonPressDefault pop up registered XrwSimpleMenu.

Usage

A XrwRibbonSplitButton is typically used in conjunction with a XrwSimpleMenu. See XrwSimpleMenu for class details.

The sample code shows how to create a ribon split button and it's associated simple menu, containing two entries.

// ---- Create a ribbon split button.
X11Graphic bigSplitGraphic = XrwTheme.GetGraphic ( _display,
    _screenNumber, X11Graphic.StockIcon.Information32);
X11Graphic smallSplitGraphic = XrwTheme.GetGraphic ( _display,
    _screenNumber, X11Graphic.StockIcon.Information16);
XrwRibbonSplitButton bigSplit = XrwRibbonSplitButton.NewXrwRibbonSplitButton (ribbonPanel,
    "Info", bigSplitGraphic, true, smallSplitGraphic, true);
ribbonPanel.AddChild (bigSplit);

// ---- Create the associated simple menu entries.
X11Graphic splitMenuEntryGraphic = XrwTheme.GetGraphic ( _display,
    _screenNumber, X11Graphic.StockIcon.Information16);
XrwSme splitMenuEntry1 = XrwSme.NewXrwSmeGadget (bigSplit.Menu,
    "About", splitMenuEntryGraphic, true, null, false);
bigSplit.Menu.AddChild (splitMenuEntry1);
splitMenuEntry1.ButtonRelease += HandleSplitMenuEntry1ButtonRelease;
XrwSme splitMenuEntry2 = XrwSme.NewXrwSmeGadget (bigSplit.Menu,
    "Help", splitMenuEntryGraphic, true, null, false);
bigSplit.Menu.AddChild (splitMenuEntry2);
splitMenuEntry2.ButtonRelease += HandleSplitMenuEntry2ButtonRelease; 

It is recommended to add any XrwSme instance to the simple menu first and connect the ButtonRelease event handler second. This is because the AddChild() mehtod invokes the XrwConposite's ChildAdded event. This event has a default handler for XrwSimpleMenu, that registers the XrwSimpleMenu.HandleChildButtonReleaseDefault to the new child and this event handler calls Unrealize() for the XrwSimpleMenu on XrwSme's ButtonRelease event.

It must be guaranteed, that Unrealize() for the XrwSimpleMenu ist the first action that takes place on a XrwSme's ButtonRelease event. Otherwise, an 'application close' command would clean up the application's widget hierarchy first and Unrealize() for the XrwSimpleMenu would be called after that, which would be too late.

XrwRibbonControlGroup

The XrwRibbonControlGroup is a gadget to be used within the ribbon, that organizes a group of interactive control group nodes and calls a callback via the click event. Because it is a gadget, it's ribbon is responsible for any event processing (highlight, button press, expose, ...).

Because the ribbon is implemented as one integral widget, almost all of its children (including the ribbon control group) are implemented as gadgets. The ribbon control group is a ribbon child, that provides the functionality of a radio box to the ribbon. Different to the XrwRadioBox it also permits to to handle toggle and exclusive toggle buttons.

The XrwRibbonControlGroup introduces four internal classes to provide radio, toggle and exclusive toggle buttons: XrwRibbonControlGroupNodes can be

  • XrwRibbonControlGroupNode is the abstract base calss for radio, toggle and exclusive toggle button within a XrwRibbonControlGroup.
  • XrwRibbonControlGroupRadioNode is derived from the abstract XrwRibbonControlGroupNode base calss and behaves like a radio button (switches all other radio buttons of it's control group off, if switchted on).
  • XrwRibbonControlGroupToggleNode is derived from the abstract XrwRibbonControlGroupNode base calss and behaves like a toggle button (can be switched on and off indipendently from the state of other toggle buttons of it's control group).
  • XrwRibbonControlGroupExclusiveToggleNode is derived from the abstract XrwRibbonControlGroupNode base calss and behaves like a combination of a toggle button (can be switched off indipendently from the state of other toggle buttons of it's control group) and a radio button (switches other toggle buttons of it's control group off, if switchted on).

XrwRibbonControlGroupRadioNodes, XrwRibbonControlGroupToggleNodes and XrwRibbonControlGroupExclusiveToggleNodes can be used within the same XrwRibbonControlGroup.
In this case XrwRibbonControlGroupRadioNodes only influence XrwRibbonControlGroupRadioNodes and XrwRibbonControlGroupExclusiveToggleNodes only influence XrwRibbonControlGroupToggleNodes and XrwRibbonControlGroupExclusiveToggleNodes.

This class has no public constructor, but one factory method. NewXrwRibbonControlGroup creates a new XrwRibbonControlGroup.

The image shows one XrwRibbonPanel with two XrwRibbonControlGroups, that contain four (align horizontal left, align horizontal center, align horizontal justify and align horizontal right) respectively three (align vertical top, align vertical middle, align vertical bottom) XrwRibbonControlGroupRadioNodes, and another XrwRibbonPanel with two XrwRibbonControlGroups, that contain three (markup bold, markup italic and markup underline) XrwRibbonControlGroupToggleNodes and respectively two (position sub, position super) XrwRibbonControlGroupExclusiveToggleNodes.

At any time exactly one horizontal alignment and one vertical alignment is selected. The three available markups permit any number (0 ... 3) of them to be selected. And the two positions permit none or one of them to be selected.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwSimple --> XrwRibbonCommandBase --> XrwRibbonControlGroup

New event definitions

The XrwRibbonControlGroup always receives events passed-through from it's parent XrwRibbon.

  • Clicked occures after any control group node of the XrwRibbonControlGroup has been switched and is calling registered event handler delegates.

New properties

NameTypeAccessDefault/Fallback
Nodes List<XrwRibbonControl-
GroupNode>
get != null
  • Nodes get the list of list nodes.

New Methods

  • InsideIndicatedNodeBoundings check whether the indicated point is inside the indicated node.
  • SelectedRadioNodeIndex get the index of the currently selected radio node. toggle nodes and exclusive toggle nodes increase the index, if determined before the selected radio node. If no radio node is selected, the first radio node becoms selected. If multiple radio nodes are relected, all radio nodes after the first selected radio node become unselected.
  • SetSelection set, according to the indicated position, a node as selected and - in case of a radio node - unset any other radio node's selection.

Overridden methods (XrwRectObj)

  • CalculateChildLayout() perform no action.
  • MinimumSize() calculate the minimum size.
  • PreferredSize() calculate the preferred size.

Overridden methods (XrwCore)

  • Redraw() redraw the object.

New event handler

  • OnClicked() handle the Clicked event.

Overridden event handler

None.

Peregistered event delegates

  • ButtonRelease += HandleButtonReleaseDefault update the selection (end) and caret position.

Usage

The sample code shows how to create a ribon control group and it's child nodes.
// ---- Prepare the graphics and create a ribbon control group.
X11Graphic radioGraphicAlignLeft      = XrwTheme.GetGraphic ( _display,
    _screenNumber, X11Graphic.StockIcon.TextAlignLeft);
X11Graphic radioGraphicAlignCenter    = XrwTheme.GetGraphic ( _display,
    _screenNumber, X11Graphic.StockIcon.TextAlignCenter);
X11Graphic radioGraphicAlignJustify   = XrwTheme.GetGraphic ( _display,
    _screenNumber, X11Graphic.StockIcon.TextAlignJustify);
X11Graphic radioGraphicAlignRight     = XrwTheme.GetGraphic ( _display,
    _screenNumber, X11Graphic.StockIcon.TextAlignRight);
XrwRibbonControlGroup ribCtrlGrpTextHAlignClicked =
    XrwRibbonControlGroup.NewXrwRibbonControlGroup (panelRadioTest);
panelRadioTest.AddChild (ribCtrlGrpTextHAlignClicked);

// ---- Create four ribbon control group nodes.
ribCtrlGrpTextHAlignClicked.Nodes.Add (new XrwRibbonControlGroup.XrwRibbonControlGroupRadioNode
    ("Align text horizontally to the left.",   radioGraphicAlignLeft,   true));
ribCtrlGrpTextHAlignClicked.Nodes.Add (new XrwRibbonControlGroup.XrwRibbonControlGroupRadioNode
    ("Align text horizontally to the center.", radioGraphicAlignCenter, true));
ribCtrlGrpTextHAlignClicked.Nodes.Add (new XrwRibbonControlGroup.XrwRibbonControlGroupRadioNode
    ("Align text horizontally to the justify.",  radioGraphicAlignJustify, true));
ribCtrlGrpTextHAlignClicked.Nodes.Add (new XrwRibbonControlGroup.XrwRibbonControlGroupRadioNode
    ("Align text horizontally to the right.",  radioGraphicAlignRight,  true));
ribCtrlGrpTextHAlignClicked.Clicked += HandleRibbonControlGroupClicked;

XrwScrollbar

The XrwScrollbar class implements a scroll bar widget. It is comparable to Athena's "Scrollbar".

The Athena's description for "Scrollbar" says (X Window System Athena Widgets, Quick Reference Guide):
The Scrollbar widget is a rectangular area containing a slide region and a thumb (also known as a slide bar). A Scrollbar can be used alone, as a value generator, or it can be used within a composite widget (for example, a Viewport). A Scrollbar can be oriented either vertically or horizontally.
When a Scrollbar is created, it is drawn with the thumb in a contrasting color. The thumb is normally used to scroll client data and to give visual feedback on the percentage of the client data that is visible.
...
While scrolling is in progress, the application receives notification through callback procedures. For both discrete scrolling actions, the callback returns the Scrollbar widget, the client_data, and the pixel position of the pointer when the button was released. For continuous scrolling, the callback routine returns the scroll bar widget, the client data, and the current relative position of the thumb. When the thumb is moved using pointer button 2, the callback procedure is invoked continuously. When either button 1 or 3 is pressed, the callback procedure is invoked only when the button is released and the client callback procedure is responsible for moving the thumb
.

This class has no public constructor, but two factory methods. NewHScrollWidget/NewVScrollWidget creates a new XrwScrollbar.

The image shows a horizontally oriented XrwScrollbar.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwSimple --> XrwScrollbar

New event definitions

The XrwList always receives events on it's own.

  • ThumbMoved occures after any scroll has been done.

New properties

NameTypeAccessDefault/Fallback
ArrowColorTPixelget, set XrwTheme.TextColor
ButtonBackgroundColorTPixel get, set XrwTheme.Interactive- BackgroundColorDark
FocusedButtonBackground TPixel get, set XrwTheme.InteractiveFocused- BackgroundColorDark
ThumbBackgroundColorDark TPixelget, setXrwTheme.ScrollThumb- BackgroundColorDark
ThumbBackgroundColorLightTPixel get, set XrwTheme.ScrollThumb- BackgroundColorLight
ThumbBackground- ColorMedium TPixel get, set XrwTheme.ScrollThumb-BackgroundColorMedium
ThumbFocused- BackgroundColorDark TPixel get, set XrwTheme.ScrollThumbFocused- BackgroundColorDark
ThumbFocused- BackgroundColorLight TPixel get, set XrwTheme.ScrollThumbFocused- BackgroundColorLight
ThumbFocused- BackgroundColorMedium TPixel get, set XrwTheme.ScrollThumbFocused-
BackgroundColorMedium
IsHorizontal boolget
ButtonFrameType TFrameTypeget, set XrwTheme.InteractiveFrameType
ButtonFrameWidth intget, set XrwTheme.InteractiveFrameWidth
ThumbFrameType TFrameTypeget, set TFrameType.Raised
ThumbFrameWidth intget, set XrwTheme.InteractiveFrameWidth
ThumbWidth intget, set 100000 (XrwScrollbar.ThumbMaxValue / 10)
ThumbValue intget, set 0
ThumbStepWidth intget, set 10000 (XrwScrollbar. ThumbMaxValue / 100)
ThumbPageWidth intget, set 100000 (XrwScrollbar. ThumbMaxValue / 10)
  • ArrowColor get or set the arrow color.
  • ButtonBackgroundColor get or set the scroll area background color.
  • FocusedButtonBackground get or set the scroll area focused background color.
  • ThumbBackgroundColorDark get or set the thumb background color pixel 3/3.
  • ThumbBackgroundColorLight get or set the thumb background color pixel 1/3.
  • ThumbBackgroundColorMedium get or set the thumb background color pixel 2/3.
  • ThumbFocusedBackgroundColorDark get or set the focused thumb background color pixel 3/3.
  • ThumbFocusedBackgroundColorLight get or set the focused thumb background color pixel 1/3.
  • ThumbFocusedBackgroundColorMedium get or set the focused thumb background color pixel 2/3.
  • IsHorizontal get whether the scroll bar is oriented horizontal.
  • ButtonFrameType get or set the selected and focused node's background color pixel 1/3.
  • ButtonFrameWidth get or set the selected and focused node's background color pixel 2/3.
  • ThumbFrameType get or set the thumb frame type.
  • ThumbFrameWidth get or set the thumb frame width.
  • ThumbWidth et or set the current thumb width - as a percentage value, multiplied with 10,000, of the movable width.
  • ThumbValue get or set the current thumb position value.
  • ThumbStepWidth get or set the thumb position change value for step jump - as a percentage value, multiplied with 10,000, of the movable width.
  • ThumbPageWidth get or set the thumb position change value for page jump - as a percentage value, multiplied with 10,000, of the movable width.

New methods

None.

Overridden methods (XrwRectObj)

  • MinimumSize() calculate the minimum size.
  • PreferredSize() calculate the preferred size.

New event handler

  • OnThumbMoved occures after any scroll has been done and is calling registered event handler delegates.

Overridden event handler (XrwRectObj)

  • OnExpose() handle the ExposeEvent event.

Preregistered event delegates

  • Enter += HandleEnterDefault set focused.
  • Leave += HandleLeaveDefault unset focused.
  • Motion += HandleMotionDefault highlight or unhighlight buttons, background or thumb. Moves the thumb on pressed button.
  • ButtonPress += HandleButtonPressDefault realize step scroll (prssed on a button) or page scroll (pressed on the background). Can repeat on continuous press.

XrwText

The XrwText class implements a single line text edit. It's prototype is a simplified Athena's "Text" widget.

The XrwText is a widget, used to render and edit text.

This class has no public constructor, but one factory method. NewXrwTextWidget creates a new XrwText.

The image shows a simple XrwText including a selection of two letters and the caret.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwSimple --> XrwText

New event definitions

The XrwText always receives events on it's own.

New properties

NameTypeAccessDefault/Fallback
FocusedBackgroundColor TPixel get, set XrwTheme.EditableFocused-BackgroundColorLight
HorzTextAlign float get, set 0.5
VertTextAlign float get, set 0.5
Text string get, set false
LeftMargin int get, set 4
RightMargin int get, set 4
TopMargin int get, set 4
BottomMargin int get, set 4
CaretCharIndex int get, set XrwTheme.InteractiveFocused-BackgroundColorLight
SelectionStartIndex int get, set XrwTheme.InteractiveFocused-BackgroundColorMedium
SelectionEndIndex int get, set false
  • FocusedBackgroundColor get or set the focused background color pixel.
  • HorzTextAlign get or set the horizontal text alignment. 0.0 aligns left, 0.5 aligns center and 1.0 right.
  • VertTextAlign get or set the vertical text alignment. 0.0 aligns top, 0.5 aligns middle and 1.0 bottom.
  • Text get or set the text to handle.
  • LeftMargin get or set the space (in pixels) that will be lef free between the left edge and the content.
  • RightMargin get or set the space (in pixels) that will be lef free between the right edge and the content.
  • TopMargin get or set the space (in pixels) that will be lef free between the top edge and the content.
  • BottomMargin get or set the space (in pixels) that will be lef free between the bottom edge and the content.
  • CaretCharIndex get or set the character index from line start to charet.
  • SelectionStartIndex get or set the character index from line start to selection start.
  • SelectionEndIndex get or set the character index from line start to selection end.

New methods

  • CharIndexOfPosition() calculate character index from pointer position..

Overridden methods (XrwRectObj)

  • MinimumSize() calculate the minimum size.
  • PreferredSize() calculate the preferred size.

Overridden methods (XrwVisibleRectObj)

  • GetContentArea() calculate the content area.

Overridden event handler (XrwRectObj)

  • OnExpose() handle the ExposeEvent event.

Preregistered event delegates

  • Enter += HandleEnterDefault set focused.
  • Leave += HandleLeaveDefault unset focused.
  • Motion += HandleMotionDefault update the selection, if button is pressed.
  • ButtonPress += HandleButtonPressDefault update the selection (start and end) and caret position.
  • ButtonRelease += HandleButtonReleaseDefault update the selection (end) and caret position.
  • KeyPress += HandleKeyPressDefault process key stroke, either recognized a predefined short cut or treated as input.

Predefined keyboard shortcusts

  • Pos1 jump to the begin of the line.
  • Shift + Pos1 jump to the begin of the line and expand selection to the begin of the line.
  • End jump to the end of the line.
  • Shift + End jump to the end of the line and expand selection to the begin of the line.
  • Ctrl + Z undo last text change.
  • Ctrl + Y redo last text change undo.

XrwTree

The XrwTree class implements a toggle button widget. It is comparable to Athena's "Tree" widget.

The Athena's description for "Tree" says (X Window System Athena Widgets, Quick Reference Guide):
The Tree widget provides geometry management of arbitrary widgets arranged in a directed, acyclic graph (i.e., a tree). The hierarchy is constructed by attaching a constraint resource called treeParent to each widget indicating which other node in the tree should be treated as the widget's superior. The structure of the tree is shown by laying out the nodes in the standard format for tree diagrams with lines drawn connecting each node with its children.
The Tree sizes itself according to the needs of its children and is not intended to be resized by its parent. Instead, it should be placed inside another composite widget (such as the Porthole or Viewport) that can be used to scroll around in the tree.

This class has no public constructor, but one factory method. NewXrwTreeWidget creates a new XrwTree.

The image shows a simple XrwTree with one selected tree node.

Inheritance (↑)

IDisposable --> XrwObject --> XrwRectObject --> XrwVisibleRectObject --> XrwCore --> XrwSimple --> XrwTree

New event definitions

The XrwList always receives events on it's own.

  • EntrySelectionChanged occures after any list entry has been selected.
  • SizePreferenceChanged occures after the list preferres a new size (e. g. the content or the type of view has hanged). A XrwViewport should listen to this event.
  • SelectedEntryCommandInvoke occures after a double click, indicating that selected node should execute a command, happened.

New properties

NameTypeAccessDefault/Fallback
TextColor TPixel get, set XrwTheme.TextColor
InverseTextColor TPixel get, set XrwTheme.InverseTextColor
FocusedSelectedBackground-
ColorDark
TPixelget, set XrwTheme.InteractiveFocused-
SelectedBackgroundColorDark
FocusedSelectedBackground-
ColorLight
TPixel get, set XrwTheme.InteractiveFocused-
SelectedBackgroundColorLight
FocusedSelectedBackground-
ColorMedium
TPixelget, set XrwTheme.InteractiveFocused-
SelectedBackgroundColorMedium
FocusedExpander-
BackgroundColor
TPixelget, set XrwTheme.ExpanderFocused-
BackgroundColor
FocusedSelectedExpander-
BackgroundColor
TPixelget, set XrwTheme.ExpanderFocused-
SelectedBackgroundColor
Root TreeNodeget, set null

SelectedBackground-
ColorDark

TPixel get, setXrwTheme.InteractiveSelected-BackgroundColorDark
SelectedBackground-
ColorLight
TPixel get, set XrwTheme.InteractiveSelected-
BackgroundColorLight
SelectedBackground-
ColorMedium
TPixel get, set XrwTheme.InteractiveSelected-BackgroundColorMedium
  • TextColor get or set the text color of a list node's label.
  • InverseTextColor ges or set the text color of a selected list node's label.
  • LeftMargin get or set the space (in pixels) that will be lef free between the left edge and the content.
  • SelectedBackgroundColorDark get or set the selected node's background color pixel 3/3.
  • SelectedBackgroundColorLight get or set the selected node's background color pixel 1/3.
  • SelectedBackgroundColorMedium get or set the selected node's background color pixel 2/3.
  • FocusedSelectedBackgroundColorDark get or set the selected and focused node's background color pixel 3/3.
  • FocusedSelectedBackgroundColorLight get or set the selected and focused node's background color pixel 1/3.
  • FocusedSelectedBackgroundColorMedium get or set the selected and focused node's background color pixel 2/3.
  • FocusedExpanderBackgroundColor get or set the focused expander background color pixel.
  • FocusedSelectedExpanderBackgroundColor get or set the focused and selected expander background color pixel.
  • Root get or set the root tree node.

New methods

  • SetOffBitmap() set the off bitmap and bitmap shared flag.
  • SetRightBitmap() set the on bitmap and bitmap shared flag.

New supported events

  • SwitchedOff occures after the command has been switched off and is calling registered event handler delegates.
  • SwitchedOn occures after the command has been switched on and is calling registered event handler delegates.

Preregistered event delegates

  • ButtonRelease += HandleButtonReleaseDefault select a tree node and calls the node command on double click. Or expands or collapses on expander.
  • Motion += HandleMotionDefault focus or unfocus a tree node or expander.

Wishes and requests

Request Appeared Solved
Add ComboBox widget with SpinMenu. version 0.1version 0.2
Add SpinButton widget. version 0.1 version 0.2
Add support for 16 bit color model. version 0.1 version 0.2
Add a GTK compatible font selection dialog.version 0.1
Add missing static XrwNotebook factory method NewBottomTabedNotebook. version 0.1version 0.3
Change from 8 bit string to 16 bit string drawing to enable more than only ASCII characters. version 0.2
Add a color dialog.version 0.2
Add a basic ribbon. version 0.2 version 0.3
Add missing static XrwNotebook factory methods NewLeftTabedNotebook and NewRightTabedNotebook. version 0.3
Add a labeled frame. version 0.3
Add a basic property grid.version 0.3
Add enhanced tooltip to ribbon. version 0.3
.

Fixed errors

Fixed with :

  1. Double painting of XrwShell's children fixed.
  2. Missing background color initialization for widgets derived from XrwCore added.
  3. Fixed X11Graphic constructor arguments individualColormap and graphicDepth from application.IndividualColormap and application.ColorDepth to IntPtr.Zero and defaultColordepth (to use the root window's color map and depth, not the application's color map and depth), and fixed X11Graphic.CreateIndependentGraphicPixmap() / X11Graphic.CreateIndependentMaskPixmap() method argument window from application.Window to defaultRootWindow in XrwApplicationFramework.SetWmShellIcon(). Both was necessary to support 16 bit color model.
  4. Fixed X11lib.XCreateGC() method argument x11drawable from window to pixmap in X11Graphic.CreateIndependentGraphicPixmap(). It was necessary to support 16 bit color model

Fixed with :

  1. Fixed exception during application closing, if any XrwOverrideShell is currently poped up, now the collection handling for parent's child list is correct. (Disposal of an XrwOverrideShell implies removal from it' parent child list - this alters the child list collection.)
  2. Fixed X11Graphic.StockIcon.Information16 size from 18x18 to 16x16.
  3. Fixed XrwVisibleRectObj.ExpandToAvailableHeight, XrwVisibleRectObj.ExpandToAvailableWidth, XrwVisibleRectObj.ExpandToMaxSiblingHeight and XrwVisibleRectObj.ExpandToMaxSiblingWidth on any fixed dimension, now setting true is suppressed, if a fixed height/width is assigned.
  4. Fixed XrwVisibleRectObj.SetFixedHeight and XrwVisibleRectObj.SetFixedWidth on any dimension expansion is set, now XrwVisibleRectObj.ExpandToAvailableHeight and XrwVisibleRectObj.ExpandToAvailableWidth or XrwVisibleRectObj.ExpandToMaxSiblingHeight and XrwVisibleRectObj.ExpandToMaxSiblingWidth are reset to false if formerly true.
  5. Fixed XrwRectObj.GeometryManagerAccess.SetAssignedGeometry() for a fixed height assignment, now XrwVisibleRectObj.FixedSize.Height is applied correctly, only if XrwVisibleRectObj.IsFixedHeight is true.

Improvements

Improved with :

  • Generic drawing method to draw arrows for scroll bars, forth and back buttons XrwVisibleRectObj.DrawArrow().
  • New method signature for X11lib.XAllocWMHints(), now returning the unmanaged memory handle of WMHints and the marshaled strurture as reference argument. This enables to call X11lib.Free() with the unmanaged memory handle of WMHints.

Improvements with :

  • Removal of needles X11 events (events for an X11 window, that just has been unrealized) on XrwApplicationShell.RemoveCild() and XrwCore.DisposeByParent().
  • Additional themes XrwTheme.GeneralStyle.WinLuna, XrwTheme.GeneralStyle.WinRoyale and XrwTheme.GeneralStyle.WinMidori.
  • Extensions to the XrwNotebook that support bottom tabs.
  • A ribbon, that supports application menu button/application menu, tabs, panels, buttons, split buttons and control groups as well as theming.

Points of Interest

It was surprising how little effort is required to create a simple widget set with an attractive design.
This work should also animate other programmers to deal with Mono on Linux or Linux-like platforms.

After the implementation of the biggest part of Athena widget set compatible widgets, the idea did not let up to go beyond this and to create higher sophisticated widgets.

History

The first public version of the Roma widget set is version from 20. January 2014.
The second public version of the Roma widget set is version from 07. March 2014.
The third public version of the Roma widget set is version from 01. Aplil 2014.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Steffen Ploetz
CEO Ploetz + Zeller GmbH
Germany Germany
I am CEO at Ploetz + Zeller GmbH, Munich Germany (www.p-und-z.com)
 
Ploetz + Zeller GmbH is a consulting and software services company committed to pro-active and professional governance and optimization of our clients' company processes. Furthermore it offers Symbio (www.symbioworld.com) software, a very powerful and easy to use business process management suite.
 
My responsibilities range from product ownership of Symbio via responsibility for the architecture of some Symbio software components to implementation of software core parts (e. g. automatic layout).
 
I started programming 1986 with C64 BASIC and came via Pascal, Turbo Pascal, C, Turbo C, C++ and Java to C#. I like the potential of C++ very much, but now my favorite language is C#.
 
I believe a lot in free knowledge sharing. I'm author at German Wikipedia and, after 10 years of passive membership, author at CODE PROJECT.

Comments and Discussions

 
GeneralOutstanding work PinprotectorMarc Clifton8-Mar-14 8:51 
QuestionEpic PinmemberPieter Van Parys7-Mar-14 4:08 
QuestionSplit into multiple articles. PinmemberMalli_S7-Mar-14 3:50 
AnswerRe: Split into multiple articles. PinprofessionalSteffen Ploetz11-Mar-14 1:24 
SuggestionRe: Split into multiple articles. PinmemberMalli_S11-Mar-14 21:19 
GeneralRe: Split into multiple articles. PinprofessionalSteffen Ploetz12-Mar-14 7:33 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web04 | 2.8.140415.2 | Last Updated 1 Apr 2014
Article Copyright 2014 by Steffen Ploetz
Everything else Copyright © CodeProject, 1999-2014
Terms of Use
Layout: fixed | fluid