16
Aug
07

Adding icons to a Flex TabNavigator control

I was trying to figure out how to add icons to a TabNavigator control today and ended up making this. The trick is that you actually add the icon on the TabNavigator control’s child containers and not on the TabNavigator itself. The example also has three tabs which each look at a different filtered view of an XML document (filtered using E4X).

Full code after the jump.

View MXML

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="vertical"
        verticalAlign="middle"
        backgroundColor="white">

    <mx:XML id="model">
        <records>
            <record uuid="1" status="check" name="User 1" data="Data 1" />
            <record uuid="2" status="warning" name="User 2" data="Data 2" />
            <record uuid="3" status="warning" name="User 3" data="Data 3" />
            <record uuid="4" status="critical" name="User 4" data="Data 4" />
            <record uuid="5" status="check" name="User 5" data="Data 5" />
            <record uuid="6" status="check" name="User 6" data="Data 6" />
            <record uuid="7" status="warning" name="User 7" data="Data 7" />
            <record uuid="8" status="critical" name="User 8" data="Data 8" />
        </records>
    </mx:XML>

    <mx:Script>
        <![CDATA[
            [Bindable]
            [Embed(source="assets/bulletCheck.png")]
            private var BulletCheck:Class;

            [Bindable]
            [Embed(source="assets/bulletWarning.png")]
            private var BulletWarning:Class;

            [Bindable]
            [Embed(source="assets/bulletCritical.png")]
            private var BulletCritical:Class;

            private const CHECK:String = "check";
            private const WARNING:String = "warning";
            private const CRITICAL:String = "critical";
        ]]>
    </mx:Script>

    <mx:TabNavigator width="400" height="200">
        <mx:VBox label="Check" icon="{BulletCheck}">
            <mx:DataGrid id="gridCheck"
                    width="100%"
                    height="100%">
                <mx:columns>
                    <mx:DataGridColumn dataField="@name" />
                    <mx:DataGridColumn dataField="@data" />
                </mx:columns>
                <mx:dataProvider>
                    {model.record.(@status == CHECK)}
                </mx:dataProvider>
            </mx:DataGrid>
        </mx:VBox>

        <mx:VBox label="Warnings" icon="{BulletWarning}">
            <mx:DataGrid id="gridWarning"
                    width="100%"
                    height="100%">
                <mx:columns>
                    <mx:DataGridColumn dataField="@name" />
                    <mx:DataGridColumn dataField="@data" />
                </mx:columns>
                <mx:dataProvider>
                    {model.record.(@status == WARNING)}
                </mx:dataProvider>
            </mx:DataGrid>
        </mx:VBox>

        <mx:VBox label="Errors" icon="{BulletCritical}">
            <mx:DataGrid id="gridCritical"
                    width="100%"
                    height="100%">
                <mx:columns>
                    <mx:DataGridColumn dataField="@name" />
                    <mx:DataGridColumn dataField="@data" />
                </mx:columns>
                <mx:dataProvider>
                    {model.record.(@status == CRITICAL)}
                </mx:dataProvider>
            </mx:DataGrid>
        </mx:VBox>
    </mx:TabNavigator>

</mx:Application>

View source is enabled in the following example.


6 Responses to “Adding icons to a Flex TabNavigator control”


  1. 1 Bruce Aug 17th, 2007 at 6:37 am

    Very nice example - thanks for posting it. When I tried to download the source code I got a 404 error. I wanted to get the icons you used so I could run the example myself in FlexBuilder.

  2. 2 peterd Aug 17th, 2007 at 10:56 am

    Bruce,

    Sorry about that. I’ll try and reFTP that ZIP file and see if it uploads this time.

  3. 3 Paulo Jose Aug 27th, 2008 at 6:01 am

    Peterd,
    i need to put 10 labels in my tabNavigator and i need every names are visible!
    thanks
    Paulo

  4. 4 peterd Aug 27th, 2008 at 7:22 am

    Paulo Jose,

    You could try the SuperTabNavigator container from FlexLib: http://code.google.com/p/flexlib/wiki/ComponentList

    I’m not sure if it supports multiple rows of tabs or not though.

    Peter

  5. 5 Sean Sep 2nd, 2008 at 9:03 am

    Do you know how to move the icon’s to a stylesheet?

    I have the following, but it doesn’t appear to work (the background style comes through though.

    .greenTab {
    	icon:        Embed('/assets/green-dot.gif');
    	backgroundColor:	'#cccccc';
    }
    
    .redTab {
    	icon:        Embed('/assets/red-dot.gif');
    	backgroundColor:	'#cccccc';
    }
    

    -Sean

  6. 6 peterd Oct 3rd, 2008 at 8:34 am

    Sean,

    I logged an enhancement request about making it easier to skin individual buttons on a ButtonBar control a while ago, http://bugs.adobe.com/jira/browse/SDK-17117.

    The same workarounds may apply to the TabBar/TabNavigator controls as well, although you may need to use the getTabAt() method, I believe.

    When I get some time, I’ll see if I can post the workarounds to SDK-17117 as full blog entries.

    Hope that helps,

    Peter

Leave a Reply

This blog is terrible at eating HTML tags. If you plan on posting code/XML, please escape your "<" characters as "&lt;" and your ">" characters as "&gt;".