Changeset 57
- Timestamp:
- 03/30/08 18:39:46 (5 months ago)
- Files:
-
- trunk/win32/dfl/internal/winapi.d (modified) (2 diffs)
- trunk/win32/dfl/toolbar.d (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/win32/dfl/internal/winapi.d
r56 r57 2008 2008 2009 2009 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; 2014 2032 2015 2033 2016 2034 enum: BYTE 2017 2035 { 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 { 2018 2062 TBSTATE_ENABLED = 0x04, 2019 2063 } 2020 2064 2021 2065 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, 2026 2071 } 2027 2072 … … 2032 2077 TB_INSERTBUTTONA = WM_USER + 21, 2033 2078 TB_DELETEBUTTON = WM_USER + 22, 2079 TB_GETITEMRECT = WM_USER + 29, 2034 2080 TB_BUTTONSTRUCTSIZE = WM_USER + 30, 2035 2081 TB_SETIMAGELIST = WM_USER + 48, 2036 2082 TB_INSERTBUTTONW = WM_USER + 67, 2037 2083 TB_ADDBUTTONSW = WM_USER + 68, 2084 } 2085 2086 2087 enum: UINT 2088 { 2089 TBN_FIRST = cast(UINT)-700, 2090 TBN_DROPDOWN = TBN_FIRST - 10, 2038 2091 } 2039 2092 trunk/win32/dfl/toolbar.d
r56 r57 12 12 { 13 13 private import dfl.imagelist; 14 } 15 16 version(DFL_TOOLBAR_NO_MENU) 17 { 18 } 19 else 20 { 21 private import dfl.menu; 22 } 23 24 25 /// 26 enum 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 14 33 } 15 34 … … 71 90 72 91 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 73 108 override Dstring toString() 74 109 { … … 98 133 { 99 134 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. 100 197 } 101 198 … … 103 200 private: 104 201 ToolBar tbar; 202 int _id = 0; 105 203 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 } 106 213 version(DFL_NO_IMAGELIST) 107 214 { … … 161 268 { 162 269 val.tbar = tbar; 270 val._id = tbar._allocTbbID(); 163 271 164 272 if(created) … … 180 288 prevwproc(TB_DELETEBUTTON, idx, 0); 181 289 } 290 val.tbar = null; 182 291 } 183 292 } … … 294 403 break; 295 404 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 296 431 default: ; 297 432 } … … 319 454 320 455 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 321 487 protected override void onHandleCreated(EventArgs ea) 322 488 { … … 369 535 xtb.iBitmap = tbb._imgidx; 370 536 } 371 //xtb.idCommand = 42;537 xtb.idCommand = tbb._id; 372 538 xtb.dwData = cast(DWORD)cast(void*)tbb; 373 539 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. 375 541 LRESULT lresult; 376 542 // MSDN says iString can be either an int offset or pointer to a string buffer.
