Changeset 57

Show
Ignore:
Timestamp:
03/30/08 18:39:46 (5 months ago)
Author:
Chris Miller
Message:

More ToolBar? features.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/win32/dfl/internal/winapi.d

    r56 r57  
    20082008     
    20092009     
    2010     /+enum 
    2011     { 
    2012         TBSTYLE_AUTOSIZE 
    2013     }+/ 
     2010    struct NMTOOLBARA 
     2011    { 
     2012        NMHDR hdr; 
     2013        int iItem; 
     2014        TBBUTTON tbButton; 
     2015        int cchText; 
     2016        LPSTR pszText; 
     2017        RECT rcButton; 
     2018    } 
     2019    alias NMTOOLBARA* LPNMTOOLBARA; 
     2020     
     2021     
     2022    struct NMTOOLBARW 
     2023    { 
     2024        NMHDR hdr; 
     2025        int iItem; 
     2026        TBBUTTON tbButton; 
     2027        int cchText; 
     2028        LPWSTR pszText; 
     2029        RECT rcButton; 
     2030    } 
     2031    alias NMTOOLBARW* LPNMTOOLBARW; 
    20142032     
    20152033     
    20162034    enum: BYTE 
    20172035    { 
     2036        TBSTYLE_BUTTON = 0x00, 
     2037        TBSTYLE_SEP = 0x01, 
     2038        TBSTYLE_CHECK = 0x02, 
     2039        TBSTYLE_GROUP = 0x04, 
     2040        TBSTYLE_DROPDOWN = 0x08, 
     2041        TBSTYLE_AUTOSIZE = 0x10, 
     2042         
     2043        /+ 
     2044        // The following are too big for TBBUTTON.fsStyle 
     2045        TBSTYLE_TOOLTIPS = 0x0100, 
     2046        TBSTYLE_WRAPABLE = 0x0200, 
     2047        TBSTYLE_ALTDRAG = 0x0400, 
     2048        +/ 
     2049    } 
     2050     
     2051     
     2052    enum: BYTE 
     2053    { 
     2054        //BTNS_AUTOSIZE = TBSTYLE_AUTOSIZE, 
     2055         
     2056        BTNS_WHOLEDROPDOWN = 0x80, 
     2057    } 
     2058     
     2059     
     2060    enum: BYTE 
     2061    { 
    20182062        TBSTATE_ENABLED = 0x04, 
    20192063    } 
    20202064     
    20212065     
    2022     enum: BYTE 
    2023     { 
    2024         //BTNS_AUTOSIZE = TBSTYLE_AUTOSIZE, 
    2025         BTNS_AUTOSIZE = 0x0010, 
     2066    enum: LRESULT 
     2067    { 
     2068        TBDDRET_DEFAULT = 0, 
     2069        TBDDRET_NODEFAULT = 1, 
     2070        TBDDRET_TREATPRESSED = 2, 
    20262071    } 
    20272072     
     
    20322077        TB_INSERTBUTTONA = WM_USER + 21, 
    20332078        TB_DELETEBUTTON = WM_USER + 22, 
     2079        TB_GETITEMRECT = WM_USER + 29, 
    20342080        TB_BUTTONSTRUCTSIZE = WM_USER + 30, 
    20352081        TB_SETIMAGELIST = WM_USER + 48, 
    20362082        TB_INSERTBUTTONW = WM_USER + 67, 
    20372083        TB_ADDBUTTONSW = WM_USER + 68, 
     2084    } 
     2085     
     2086     
     2087    enum: UINT 
     2088    { 
     2089        TBN_FIRST = cast(UINT)-700, 
     2090        TBN_DROPDOWN = TBN_FIRST - 10, 
    20382091    } 
    20392092     
  • trunk/win32/dfl/toolbar.d

    r56 r57  
    1212{ 
    1313    private import dfl.imagelist; 
     14} 
     15 
     16version(DFL_TOOLBAR_NO_MENU) 
     17{ 
     18} 
     19else 
     20{ 
     21    private import dfl.menu; 
     22} 
     23 
     24 
     25/// 
     26enum ToolBarButtonStyle: ubyte 
     27{ 
     28    PUSH_BUTTON = TBSTYLE_BUTTON, /// 
     29    TOGGLE_BUTTON = TBSTYLE_CHECK, /// ditto 
     30    SEPARATOR = TBSTYLE_SEP, /// ditto 
     31    //DROP_DOWN_BUTTON = TBSTYLE_DROPDOWN, /// ditto 
     32    DROP_DOWN_BUTTON = TBSTYLE_DROPDOWN | BTNS_WHOLEDROPDOWN, /// ditto 
    1433} 
    1534 
     
    7190     
    7291     
     92    /// 
     93    final void style(ToolBarButtonStyle st) // setter 
     94    { 
     95        this._st = st; 
     96         
     97        //if(tbar && tbar.created) 
     98        //   
     99    } 
     100     
     101    /// ditto 
     102    final ToolBarButtonStyle style() // getter 
     103    { 
     104        return _st; 
     105    } 
     106     
     107     
    73108    override Dstring toString() 
    74109    { 
     
    98133    { 
    99134        return stringICmp(text, val); 
     135    } 
     136     
     137     
     138    /// 
     139    final void tag(Object o) // setter 
     140    { 
     141        _tag = o; 
     142    } 
     143     
     144    /// ditto 
     145    final Object tag() // getter 
     146    { 
     147        return _tag; 
     148    } 
     149     
     150     
     151    version(DFL_TOOLBAR_NO_MENU) 
     152    { 
     153    } 
     154    else 
     155    { 
     156        /// 
     157        final void dropDownMenu(ContextMenu cmenu) // setter 
     158        { 
     159            _cmenu = cmenu; 
     160        } 
     161         
     162        /// ditto 
     163        final ContextMenu dropDownMenu() // getter 
     164        { 
     165            return _cmenu; 
     166        } 
     167    } 
     168     
     169     
     170    /// 
     171    final ToolBar parent() // getter 
     172    { 
     173        return tbar; 
     174    } 
     175     
     176     
     177    /// 
     178    final Rect rectangle() // getter 
     179    { 
     180        //if(!tbar || !tbar.created) 
     181        if(!visible) 
     182            return Rect(0, 0, 0, 0); // ? 
     183        assert(tbar !is null); 
     184        RECT rect; 
     185        //assert(-1 != tbar.buttons.indexOf(this)); 
     186        tbar.prevwproc(TB_GETITEMRECT, tbar.buttons.indexOf(this), cast(LPARAM)&rect); // Fails if item is hidden. 
     187        return Rect(&rect); // Should return all 0`s if TB_GETITEMRECT failed. 
     188    } 
     189     
     190     
     191    /// 
     192    final bool visible() // getter 
     193    { 
     194        if(!tbar || !tbar.created) 
     195            return false; 
     196        return true; // To-do: get actual hidden state. 
    100197    } 
    101198     
     
    103200    private: 
    104201    ToolBar tbar; 
     202    int _id = 0; 
    105203    Dstring _text; 
     204    Object _tag; 
     205    ToolBarButtonStyle _st = ToolBarButtonStyle.PUSH_BUTTON; 
     206    version(DFL_TOOLBAR_NO_MENU) 
     207    { 
     208    } 
     209    else 
     210    { 
     211        ContextMenu _cmenu; 
     212    } 
    106213    version(DFL_NO_IMAGELIST) 
    107214    { 
     
    161268        { 
    162269            val.tbar = tbar; 
     270            val._id = tbar._allocTbbID(); 
    163271             
    164272            if(created) 
     
    180288                    prevwproc(TB_DELETEBUTTON, idx, 0); 
    181289                } 
     290                val.tbar = null; 
    182291            } 
    183292        } 
     
    294403                            break; 
    295404                         
     405                        case TBN_DROPDOWN: 
     406                            version(DFL_TOOLBAR_NO_MENU) // This condition might be removed later. 
     407                            { 
     408                            } 
     409                            else // Ditto. 
     410                            { 
     411                                auto nmtb = cast(LPNMTOOLBARA)nmh; // NMTOOLBARA/NMTOOLBARW doesn't matter here; string fields not used. 
     412                                auto tbb = buttomFromID(nmtb.iItem); 
     413                                if(tbb) 
     414                                { 
     415                                    version(DFL_TOOLBAR_NO_MENU) // Keep this here in case the other condition is removed. 
     416                                    { 
     417                                    } 
     418                                    else // Ditto. 
     419                                    { 
     420                                        if(tbb._cmenu) 
     421                                        { 
     422                                            auto brect = tbb.rectangle; 
     423                                            tbb._cmenu.show(this, pointToScreen(Point(brect.x, brect.bottom))); 
     424                                            // Note: showing a menu also triggers a click! 
     425                                        } 
     426                                    } 
     427                                } 
     428                            } 
     429                            return TBDDRET_DEFAULT; 
     430                         
    296431                        default: ; 
    297432                    } 
     
    319454     
    320455     
     456     
     457    // Used internally 
     458    /+package+/ final ToolBarButton buttomFromID(int id) // package 
     459    { 
     460        foreach(tbb; _tbuttons._buttons) 
     461        { 
     462            if(id == tbb._id) 
     463                return tbb; 
     464        } 
     465        return null; 
     466    } 
     467     
     468     
     469    package int _lastTbbID = 0; 
     470     
     471    package final int _allocTbbID() 
     472    { 
     473        for(int j = 0; j != 250; j++) 
     474        { 
     475            _lastTbbID++; 
     476            if(_lastTbbID >= short.max) 
     477                _lastTbbID = 1; 
     478             
     479            if(!buttomFromID(_lastTbbID)) 
     480                return _lastTbbID; 
     481        } 
     482        return 0; 
     483    } 
     484     
     485     
     486     
    321487    protected override void onHandleCreated(EventArgs ea) 
    322488    { 
     
    369535            xtb.iBitmap = tbb._imgidx; 
    370536        } 
    371         //xtb.idCommand = 42
     537        xtb.idCommand = tbb._id
    372538        xtb.dwData = cast(DWORD)cast(void*)tbb; 
    373539        xtb.fsState = TBSTATE_ENABLED; 
    374         xtb.fsStyle = BTNS_AUTOSIZE; 
     540        xtb.fsStyle = TBSTYLE_AUTOSIZE | tbb._st; // TBSTYLE_AUTOSIZE factors in the text's width instead of default button size. 
    375541        LRESULT lresult; 
    376542        // MSDN says iString can be either an int offset or pointer to a string buffer.