RSS

A WPF StackPanel-surrogate with shared-sizing scope ability

Here is a simple trick for simulating the shared-sizing feature of the WPF Grid even in a StackPanel fashion.

demo

Basically, you can have several panels, each one in a separate visual fragment, and “synchronize” their children height (or width, when horizontally-oriented).
A short video explains better than thousands of words.

The solution is pretty simple. Since the Grid already offers such a feature, the trick is leveraging it instead a “real” StackPanel. Otherwise, the mechanism for managing the shared-size scopes is rather complex. As for “complex” I mean that you should keep all the scrolling and virtualization features which is part of a StackPanel, and that’s rather complex.
The resulting StackPanel-surrogate code is very simple:

    /// <summary>
    /// Represent a StackPanel surrogate whose children width/height can be
    /// shared with other homogeneous panel's children
    /// </summary>
    public class StackPanel3S
        : Grid
    {
        /// <summary>
        /// Gets or sets a value that identifies the panel as a member 
        /// of a defined group that shares sizing properties.
        /// </summary>
        public string SharedSizeGroup { get; set; }


        #region DP Orientation

        /// <summary>
        /// Identifies the StackPanelEx.Orientation dependency property.
        /// </summary>
        public static readonly DependencyProperty OrientationProperty = DependencyProperty.Register(
            "Orientation",
            typeof(Orientation),
            typeof(StackPanel3S),
            new FrameworkPropertyMetadata(
                Orientation.Vertical,
                FrameworkPropertyMetadataOptions.AffectsMeasure,
                (obj, args) =>
                {
                    var ctl = (StackPanel3S)obj;
                    ctl.OrientationChanged(args);
                }));


        /// <summary>
        /// Gets or sets a value that indicates the dimension by which child elements are stacked.
        /// </summary>
        public Orientation Orientation
        {
            get { return (Orientation)GetValue(OrientationProperty); }
            set { SetValue(OrientationProperty, value); }
        }

        #endregion


        private void OrientationChanged(
            DependencyPropertyChangedEventArgs args
            )
        {
            //flush any current row/column definition
            this.RowDefinitions.Clear();
            this.ColumnDefinitions.Clear();
        }


        protected override Size MeasureOverride(Size constraint)
        {
            //retrieve the number of children
            int count = this.InternalChildren.Count;

            if (this.Orientation == System.Windows.Controls.Orientation.Vertical)
            {
                //add the missing row-defintions
                for (int i = this.RowDefinitions.Count; i < count; i++)
                {
                    this.RowDefinitions.Add(
                        new RowDefinition()
                        {
                            Height = GridLength.Auto,
                            SharedSizeGroup = this.SharedSizeGroup + "__R" + i
                        });
                }

                //remove the unnecessary row-definitions
                for (int i = this.RowDefinitions.Count - 1; i >= count; i--)
                {
                    this.RowDefinitions.RemoveAt(i);
                }

                //assing a progressive index to each child
                for (int i = 0; i < count; i++)
                {
                    UIElement child;
                    if ((child = this.InternalChildren[i]) != null)
                    {
                        Grid.SetRow(child, i);
                    }
                }
            }
            else
            {
                //add the missing column-defintions
                for (int i = this.ColumnDefinitions.Count; i < count; i++)
                {
                    this.ColumnDefinitions.Add(
                        new ColumnDefinition()
                        {
                            Width = GridLength.Auto,
                            SharedSizeGroup = this.SharedSizeGroup + "__C" + i
                        });
                }

                //remove the unnecessary column-definitions
                for (int i = this.ColumnDefinitions.Count - 1; i >= count; i--)
                {
                    this.ColumnDefinitions.RemoveAt(i);
                }

                //assing a progressive index to each child
                for (int i = 0; i < count; i++)
                {
                    UIElement child;
                    if ((child = this.InternalChildren[i]) != null)
                    {
                        Grid.SetColumn(child, i);
                    }
                }
            }

            //yield the default measuring pass
            return base.MeasureOverride(constraint);
        }

    }

Enjoy!

 
Leave a comment

Posted by on September 14, 2014 in .Net, Software

 

Tags: , , , ,

Pfelders 2014 (and bits)

Just finished our holidays in Pfelders, South-Tyrol, Italy.
Can’t think a better place where relaxing peacefully!
Enjoy some pictures…

 
Leave a comment

Posted by on August 24, 2014 in Turismo

 

Tags: , , ,

Nesting a private C# Dynamic object

I don’t use often the dynamic feature of the C# language, but past yesterday I bumped against a subtle issue.

A basic implementation.

Consider a very basic dynamic object implementation against the DynamicObject, which looks like the overhauled ExpandoObject:

    public class MyDynamicObject
        : DynamicObject
    {
        public MyDynamicObject()
        {
            this._dict = new Dictionary<string, object>();
        }


        private readonly Dictionary<string, object> _dict;


        /**
         * called when the host tries to GET the value
         * from a member
         **/
        public override bool TryGetMember(
            GetMemberBinder binder,
            out object result
            )
        {
            //look for the member into the dictionary
            bool found = this._dict.TryGetValue(
                binder.Name,
                out result
                );

            if (found)
            {
                return true;
            }

            //yield the default behavior
            return base.TryGetMember(
                binder,
                out result
                );
        }


        /**
         * called when the host tries to SET a value
         * against a member
         **/
        public override bool TrySetMember(
            SetMemberBinder binder,
            object value
            )
        {
            //store the value in the dictionary
            this._dict[binder.Name] = value;
            return true;
        }

    }

Its usage may be expressed as follows:

    class Program
    {
        static void Main(string[] args)
        {
            dynamic d = new MyDynamicObject();
            d.first = "John";
            d.last = "Doe";
            d.birthdate = new DateTime(1966, 7, 23);
            d.registered = true;

            Console.WriteLine(d.first);
            Console.WriteLine(d.last);
            Console.WriteLine(d.birthdate);
            Console.WriteLine(d.registered);

            Console.ReadKey();
        }
    }

So far, so well. But what about retrieving a member “by name”, that is using a string as a “key” for mapping the desired member?
The above snippet could be refined as follows:

    class Program
    {
        static void Main(string[] args)
        {
            dynamic d = new MyDynamicObject();
            d.first = "John";
            d.last = "Doe";
            d.birthdate = new DateTime(1966, 7, 23);
            d.registered = true;

            Console.WriteLine(d.first);
            Console.WriteLine(d.last);
            Console.WriteLine(d.birthdate);
            Console.WriteLine(d.registered);

            Console.WriteLine();
            Console.Write("Please enter a field name: ");
            string key = Console.ReadLine();

            //how to map the required field?
            //Console.WriteLine("The field value is: " + ??? );

            Console.ReadKey();
        }
    }

Again, with an ExpandoObject everything would be straightforward, but the actual “MyDynamicObject” used in the original application requires a more complex content, with XML and a dictionary working aside.

pic1

Going on this way, the “keyed” dynamic object implementation is easy to refine:

    public class MyDynamicObject
        : DynamicObject
    {

        // ... original implementation ...


        /**
         * provide a member access through a key
         **/
        public object this[string key]
        {
            get { return this._dict[key]; }
            set { this._dict[key] = value; }
        }

    }

At this point, the demo application works fine with both the accessing way. It looks much like a JavaScript object!

    class Program
    {
        static void Main(string[] args)
        {
            dynamic d = new MyDynamicObject();
            d.first = "John";
            d.last = "Doe";
            d.birthdate = new DateTime(1966, 7, 23);
            d["registered"] = true;

            Console.WriteLine(d.first);
            Console.WriteLine(d.last);
            Console.WriteLine(d.birthdate);
            Console.WriteLine(d.registered);

            Console.WriteLine();
            Console.Write("Please enter a field name: ");
            string key = Console.ReadLine();

            Console.WriteLine("The field value is: " + d[key]);
            Console.ReadKey();
        }
    }

pic2

The problem: a nested-private dynamic object.

Consider a proxy pattern, and a dynamic object to expose indirectly to the hosting application. Also consider that the dynamic object should be marked as “private” due to avoid any possible usage outside its context.
The revised component would look as follows:

    class MyClass
    {

        public IDynamicMetaObjectProvider GetDynamicAccess()
        {
            return new MyDynamicObject();
        }


        //notice that the below class is marked as "private"
        private class MyDynamicObject
            : DynamicObject
        {

            // ... implementation as the keyed-one seen above ...

        }
    }

When used in such a sample application, it won’t work:

    class Program
    {
        static void Main(string[] args)
        {
            var c = new MyClass();

            dynamic d = c.GetDynamicAccess();
            d.first = "John";
            d.last = "Doe";
            d.birthdate = new DateTime(1966, 7, 23);
            d["registered"] = true;     //throws!

            Console.WriteLine(d.first);
            Console.WriteLine(d.last);
            Console.WriteLine(d.birthdate);
            Console.WriteLine(d.registered);

            Console.WriteLine();
            Console.Write("Please enter a field name: ");
            string key = Console.ReadLine();

            //the following would also throw
            Console.WriteLine("The field value is: " + d[key]);
            Console.ReadKey();
        }
    }

Better: it won’t work the “keyed” access, but the classic way is available, however.

I wasn’t able to find *ANY* solution unless you have the ability to modify the implementation. Here are the possible solutions.

Solution 1: mark the MyDynamicObject class accessor as “public”.

This is the simplest way, but I’d say it’s also a NON-solution because the original desire is keeping the class as “private”.

Solution 2: use the reflection.

You know, reflection is able to dig into the deepest yet hidden corners of your assembly, but it’s yet a last-rescue way. The compiler has a very-little (or nothing at all) control over what we access through reflection. I’d discourage, though feasible.

Solution 3: add an interface.

The “best” solution (although I’d demote to “decent”) is adding an interface, which aim is to expose the indexed access (keyed) to the host application.

    interface IKeyedAccess
    {
        object this[string name] { get; set; }
    }


    class MyClass
    {

        public IDynamicMetaObjectProvider GetDynamicAccess()
        {
            return new MyDynamicObject();
        }


        //notice that the below class is marked as "private"
        private class MyDynamicObject
            : DynamicObject, IKeyedAccess
        {

            // ... implementation as the keyed-one seen above ...

        }
    }

Our keyed-dynamic object must implement the interface, but rather obvious because our primary goal is that.
The major difference is rather on the object usage:

    class Program
    {
        static void Main(string[] args)
        {
            var c = new MyClass();

            dynamic d = c.GetDynamicAccess();
            var dk = (IKeyedAccess)d;
            d.first = "John";
            d.last = "Doe";
            d.birthdate = new DateTime(1966, 7, 23);
            dk["registered"] = true;

            Console.WriteLine(d.first);
            Console.WriteLine(d.last);
            Console.WriteLine(d.birthdate);
            Console.WriteLine(d.registered);

            Console.WriteLine();
            Console.Write("Please enter a field name: ");
            string key = Console.ReadLine();

            Console.WriteLine("The field value is: " + dk[key]);
            Console.ReadKey();
        }
    }

Unfortunately not as good as expected, but at least it allows to keep sticky to the “private” constraint.

Here is the source code.

 
Leave a comment

Posted by on July 26, 2014 in .Net, Software

 

Tags: , , , ,

Memorabilia 2 – Apple ][

It’s been 20 years ago.

apple-invadersOn July 3, 1994 I subscribed for a small contest organized by RAI Radio Televisione Italiana. Anyone may submit his own software creation, and the prize was a TeleText module for PC.

I sent them my “Apple ][ emulator for PC" and I was awarded.

At that time, Internet still wasn't known and most TV's embed TeleText module, capable of receiving data on-the-air. Software broadcasting seemed as an unbelievable thing...then, in a few years, many of us were opening a web browser for surfing on the Internet.

 

My "real" Apple ][.

A step back to 1979.

My very first PC was a Commodore PET 2001: an unbelievable machine with a strange matrix-keyboard, a cassette-tape deck (storage) and a plain-green monitor on the top. Its engine was a 6502 CPU running at 1MHz and 8kB of RAM.

Yes, roughly an Arduino with an user-interface, but with the below exceptions:

  • an Arduino runs way faster;
  • the PET 2001 was particularly useful for the cold-winter days, due the relevant power consumption...

However, this PC was just for few months, then became too useless even for small games.

So, my "nominal" first PC was an Apple ][. In Europe it was marked “Europlus” (someone’d add “proudly built in Ireland”).

However, it came with the “usual” 6502 (actually an awesome CPU), still 1MHz, and 16kB of RAM (immediately upgraded to 48). The cassette-tape was replaced by a 5″ floppy-drive: each medium was capable of 140kB, that is probably less of this post. With a cost of 20000 Lire each (see below for a comparison), a Dysan floppy disk was the “best” on the market…at least for the humans.

I learn a lot on my Apple 2, both software and hardware.

With release of the Apple 2, the Cupertino-guys gave full-featured manuals, detailed hardware schematics, as well as ROM “BIOS” assembly dump. There was no point in the machine that wasn’t well known: hacking it was a real pleasure!

And I did it!…so many times!

Please, notice on the last picture the assembler listing signed by my myth, Steve Wozniak!

I designed several I/O hardware modules, where the most difficult part was the reproduction of the male-connection header: the PCB was the only way.

Along the huge yet worldwide success of Apple ][, they released the Apple //e, which started to fall fairly into the closeness, and so always more. That was the decay of the Apple company, and the rise of the IBM-PC, which moved in the same way as its predecessor: give away schematics and BIOS listings!
I still own my original Apple ][.

 

My "fake" Apple ][ (the emulator).

The advent of PC-XT changes almost everything but the general PC diffusion.

Whereas in the early '80 there were maybe a dozen students having a PC at home (out of about 1500 of the tech high-school I was), within as low as ten years almost everyone own a PC in their house: mostly an IBM PC-compatible.

However, the Apple ][ was still in my heart!

 

Due to university guidelines, I started to learn Pascal and Fortran. However, Fortran was awful, but (Turbo-) Pascal was awesome, instead. I loved it so much that literally was able to create anything. Whereas the standard Pascal can't reach something, just open an "asm" island, and mix high-level with assembler code.

No complex "includes", ".h" or whatever, which I always hated and *still* hate. What are used for? I mean thirty years ago, where the PC resources are very limited, but...today?

I mean, no wonders at all that behind the success of C# there's the creator of Turbo Pascal: Anders Hejlsberg.

 

So what?

Since my desktop wasn't enough to place both the old Apple ][ and the PC-AT, the most "reasonable" decision was: "just create an Apple ][ emulator running in the PC-AT!”

It was the early ’90, and I own a 386 machine (I don’t remember the actual CPU speed). However, I loved coding this mixture of “Pasc-asm” that the result was still one of my best creation ever.

Below there is a piece of assembler related to the LDA (immediate) and LDA (indirect, X):

@LDASS: mov     bx, es:[si+1]
        mov     di, bx
        and     di, $FC00
        shr     di, 9
        call    word ptr @LOCRD [di]
        sahf
        mov     cl, es:[bx]
        inc     cl
        dec     cl
        lahf
        add     si, 3
        jmp     @RET
@LDAIX: mov     bx, es:[si+1]
        add     bl, dl
        xor     bh, bh
        mov     bx, es:[bx]
        mov     di, bx
        and     di, $FC00
        shr     di, 9
        call    word ptr @LOCRD [di]
        sahf
        mov     cl, es:[bx]
        inc     cl
        dec     cl
        lahf
        add     si, 2
        jmp     @RET

 

 

Keep going on in the box!

I was able to rescue the old emulator application running even on my today’s Windows 8 64-bit machine. It seems that the old-DOS programs aren’t working in a 64-bit environment, but there’s a solution: DosBox.

DosBox, as always, is the result of a crew of heroes, who thankfully remember that there are still people asking for dinosaur’s stuffs…dino, maybe, but still valuable!

I actually had no problems installing and running my application: I was a bit worried because the total NON-abstraction on write data on video, but…it worked well!

Enjoy this piece of history!

 

 

The price of an Apple ][ computer.

Here is the complete price details of the Apple ][ products, taken from a magazine of the november 1980.

vlcsnap-2014-07-20-07h30m13s160

NOTE: "IVA" is VAT, which was 15% in 1980.

Now, according to this reference, the salary of a generic factory worker was roughly 400.000 Lire. It means that an Apple ][ had an equivalent cost as 5 times a worker salary!

 
Leave a comment

Posted by on July 20, 2014 in Software

 

Tags: , , ,

Cet MicroWPF is now on CodePlex

After loooooooong time, the Cet MicroWPF repository is publicly available on CodePlex.
The awaited release comes with a (decent) tutorial, where you may follow step-by-step how to create a nice graphical UI for your Netduino. Many more is still to do, but of sure there are enough stuffs to have some fun!

My Snapshot18

Stay tuned!

 
Leave a comment

Posted by on May 31, 2014 in .Net, Software

 

Tags: , , , , , , ,

Trieste Mini Maker Faire 2014

Trieste Mini Maker Faire 2014The wonderful location of Trieste-Miramare was chosen for the first ever Mini Maker Faire in Italy. By the way, this is the first time for me as well!
Today the weather was pretty cloudy, but there was not rain, at least during my visit. However, the uncertain sky didn’t stop many people coming from everywhere.

Miramare castle in Trieste - Italy

From Wikipedia:

Trieste was one of the oldest parts of the Habsburg Monarchy. In the 19th century, it was the most important port of one of the Great Powers of Europe. As a prosperous seaport in the Mediterranean region, Trieste became the fourth largest city of the Austro-Hungarian Empire (after Vienna, Budapest, and Prague). In the fin-de-siecle period, it emerged as an important hub for literature and music. It underwent an economic revival during the 1930s, and Trieste was an important spot in the struggle between the Eastern and Western blocs after the Second World War. Today, the city is in one of the richest regions of Italy, and has been a great centre for shipping, through its port (Port of Trieste), shipbuilding and financial services.

I was nice to see many “Makers” from abroad (Slovenia and Croatia are pretty close to Trieste), hence this “mini” faire seemed sized a little wider!
Here are some pictures!…

 
1 Comment

Posted by on May 17, 2014 in Maker

 

Tags: , ,

Two little “endians”…and then there were none (of big)

1940 cover of the bookIf you don’t have problems, it means that you are doing nothing new. In my job, I do have problems almost everyday, and that’s making me happy!
If you deal with low-level data transfer, then you probably faced the different “endianness” of the processors. Traditionally, companies like Intel embraced the Little-endian choice, whereas Motorola (now Freescale) joined the Big-endian way.
Now, it seems that the .Net Framework cares only the Little-endian vision of the world. Here is an excerpt of the BitConverter class as seen with any decent disassembler:

	public static class BitConverter
	{
		/// <summary>Indicates the byte order ("endianness") in which data is stored in this computer architecture.</summary>
		/// <filterpriority>1</filterpriority>
		[__DynamicallyInvokable]
		public static readonly bool IsLittleEndian = true;

                // ...

Anyway, when you have to write a C#/.Net program which has to exchange data with a Big-endian device, you’re in trouble because the very poor support of this format. So, I created a pretty decent reader/writer pair that should come useful for many of you.

The “BIDI”-way.

Many modern processors supports both the “endiannesses”, so…why a BinaryReader/BinaryWriter shouldn’t act as them? Furthermore, it’s not unusual to see a mixed-format data in the same stream. One of the latest occasions was just on the FT800 chip, which requires a mixture of Big-endian for the addressing, despite the specs state that the chip is Little-endian based.
So, I definitely wanted a Reader/Writer capable of both. However, the interface is meant as “explicit” reference to a type yet the format. There’s no any “default” format, and this context might be interesting as well. The classes have been based by the original Microsoft’s BinaryReader and BinaryWriter, then I modified the data access. The pair of new classes are named as BidiBinaryReader and BidiBinaryWriter.
If any of you browsed the sources of my Modbus library, then the problem isn’t new at all. This time I turned the source to “wrap” a generic Stream object, instead a faster but less-abstract byte array. Here is an example of how the BidiBinaryReader:


        /// <summary>Reads a 4-byte signed integer (Little-endian) from the current stream and advances the current position of the stream by four bytes.</summary>
        /// <returns>A 4-byte signed integer read from the current stream.</returns>
        /// <exception cref="T:System.IO.EndOfStreamException">The end of the stream is reached. </exception>
        /// <exception cref="T:System.ObjectDisposedException">The stream is closed. </exception>
        /// <exception cref="T:System.IO.IOException">An I/O error occurs. </exception>
        /// <filterpriority>2</filterpriority>
        public virtual int ReadInt32LE()
        {
            this.FillBuffer(4);
            return
                (int)this.m_buffer[0] |
                (int)this.m_buffer[1] << 8 |
                (int)this.m_buffer[2] << 16 |
                (int)this.m_buffer[3] << 24;
        }


        /// <summary>Reads a 4-byte signed integer (Big-endian) from the current stream and advances the current position of the stream by four bytes.</summary>
        /// <returns>A 4-byte signed integer read from the current stream.</returns>
        /// <exception cref="T:System.IO.EndOfStreamException">The end of the stream is reached. </exception>
        /// <exception cref="T:System.ObjectDisposedException">The stream is closed. </exception>
        /// <exception cref="T:System.IO.IOException">An I/O error occurs. </exception>
        /// <filterpriority>2</filterpriority>
        public virtual int ReadInt32BE()
        {
            this.FillBuffer(4);
            return
                (int)this.m_buffer[3] |
                (int)this.m_buffer[2] << 8 |
                (int)this.m_buffer[1] << 16 |
                (int)this.m_buffer[0] << 24;
        }

What the classes don’t expose.

The original Microsoft’s sources also offer the support for reading and writing chars, thus the codec-way to manipulate bytes. The problem is that those sources access to several internal stuffs, so the only way to leverage them is via reflection. I usually work with plain byte-arrays, and the text conversion is made by some specific codec (e.g. UTF8Encoding).
As stated, there’s no a support for setting a “default” endinanness of the Reader/Writer. I mean using the same original’s interface, but allowing the user to set whether adopt the Big- instead of the Little-endian format.

So far so well. As usual here are the sources.

 
Leave a comment

Posted by on March 27, 2014 in .Net, Software

 

Tags: , , , ,

 
Follow

Get every new post delivered to your Inbox.

Join 88 other followers