source: dev/trunk/ab5.0/abdev/abdev/rebar.cpp@ 681

Last change on this file since 681 was 629, checked in by dai_9181, 16 years ago

MDIINFO構造体をリファクタリング。

File size: 9.1 KB
Line 
1#include "stdafx.h"
2
3#include "Common.h"
4
5
6/////////////////////////////////////////////////////////////
7// Note. レバーコントロールを新たに追加する場合は、
8// "レバー追加" で検索をかけ、適切なコードを埋め込む
9/////////////////////////////////////////////////////////////
10
11
12CDBRebarBand::CDBRebarBand(){
13 iMaxBandNum=0;
14}
15CDBRebarBand::~CDBRebarBand(){}
16
17void CDBRebarBand::add(int band_id,AddBandProc add_proc){
18 BandId[iMaxBandNum]=band_id;
19 pAddProc[iMaxBandNum]=add_proc;
20 iMaxBandNum++;
21}
22
23HWND CDBRebarBand::call_add(int band_id,int num,char *lpszText){
24 int i;
25 for(i=0;i<iMaxBandNum;i++){
26 if(BandId[i]==band_id) break;
27 }
28 if(i==iMaxBandNum) return 0;
29
30 return pAddProc[i](hRebar,num,lpszText);
31}
32
33
34HWND AddDocCombo(HWND hRebar,int num,char *lpszText);
35HWND AddStandardToolbar(HWND hRebar,int num,char *lpszText);
36HWND AddReleaseToolbar(HWND hRebar,int num,char *lpszText);
37HWND AddDebuggerToolbar(HWND hRebar,int num,char *lpszText);
38HWND AddBand_SelectCompiler(HWND hRebar,int num,char *lpszText);
39HWND AddBand_WebSearch(HWND hRebar,int num,char *lpszText);
40
41
42CMainRebar *pobj_Rebar=0;
43
44
45void CMainRebar::SetupRebar(HWND hwnd){
46 int i;
47
48 //レバーコントロールを生成
49 hRebar=CreateWindowEx(WS_EX_TOOLWINDOW,REBARCLASSNAME,NULL,
50 WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_BORDER|WS_VISIBLE|
51 CCS_ADJUSTABLE|RBS_BANDBORDERS|RBS_DBLCLKTOGGLE ,
52 0,0,0,0,hwnd,NULL,hInst,NULL);
53
54 pobj_DBRebarBand->hRebar=hRebar;
55
56 REBARINFO RebarInfo;
57 ZeroMemory(&RebarInfo,sizeof(RebarInfo));
58 RebarInfo.cbSize=sizeof(REBARINFO);
59 SendMessage(hRebar,RB_SETBARINFO,0,(long)&RebarInfo);
60
61 //バンドを挿入
62 REBARBANDINFO RebarBand;
63 ZeroMemory(&RebarBand,sizeof(REBARBANDINFO));
64 RebarBand.cbSize=sizeof(REBARBANDINFO);
65 RebarBand.fMask=RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE|RBBIM_ID;
66 RebarBand.cxMinChild=23;
67 RebarBand.cyMinChild=22;
68 if(pobj_nv->bNoGripper) RebarBand.fStyle=RBBS_CHILDEDGE|RBBS_NOGRIPPER;
69 else RebarBand.fStyle=RBBS_CHILDEDGE;
70 for(i=0;i<MAX_REBARBANDS;i++){
71 if(pobj_nv->SaveRebar[i].RebarID==0) break;
72
73 //レバー上にのせる子ウィンドウを生成
74 char szText[255];
75 HWND hChild;
76 hChild=pobj_DBRebarBand->call_add(pobj_nv->SaveRebar[i].RebarID,i,szText);
77
78 //レバーバンドを追加
79 RebarBand.lpText=szText;
80 RebarBand.hwndChild=hChild;
81 RebarBand.cx=pobj_nv->SaveRebar[i].RebarLength;
82 RebarBand.wID=pobj_nv->SaveRebar[i].RebarID;
83 RebarBand.fStyle|=pobj_nv->SaveRebar[i].IsBandBreak;
84 SendMessage(hRebar,RB_INSERTBAND,-1,(LPARAM)&RebarBand);
85 RebarBand.fStyle^=pobj_nv->SaveRebar[i].IsBandBreak;
86 }
87}
88
89CMainRebar::CMainRebar(HWND hwnd_parent){
90 hParent=hwnd_parent;
91
92 pobj_DBRebarBand=new CDBRebarBand();
93
94 pobj_DBRebarBand->add(
95 ID_DOCCOMBO,
96 AddDocCombo);
97
98 pobj_DBRebarBand->add(
99 ID_STANDARDTOOLBAR,
100 AddStandardToolbar);
101
102 pobj_DBRebarBand->add(
103 ID_RELEASETOOLBAR,
104 AddReleaseToolbar);
105
106 pobj_DBRebarBand->add(
107 ID_DEBUGGERTOOLBAR,
108 AddDebuggerToolbar);
109
110 pobj_DBRebarBand->add(
111 ID_SELECTCOMPILERCOMBO,
112 AddBand_SelectCompiler);
113
114 pobj_DBRebarBand->add(
115 ID_WEB_SEARCH,
116 AddBand_WebSearch);
117
118 //
119 //レバーバンドを追加する場合はこの行を編集する(レバー追加)
120 //
121
122
123 SetupRebar(hParent);
124}
125CMainRebar::~CMainRebar(){
126 SaveRebarState();
127 DestroyWindow(hRebar);
128
129 delete pobj_DBRebarBand;
130 pobj_DBRebarBand=0;
131}
132
133void CMainRebar::ResetInitRebar(){
134 DestroyWindow(hRebar);
135 ResetRebarData();
136 SetupRebar(hParent);
137}
138void CMainRebar::ResetRebar(){
139 SaveRebarState();
140 DestroyWindow(hRebar);
141 SetupRebar(hParent);
142}
143
144void CMainRebar::SaveRebarState(void){
145 int i,BandNum;
146 REBARBANDINFO BandInfo;
147
148 ZeroMemory(&BandInfo,sizeof(REBARBANDINFO));
149 BandInfo.cbSize=sizeof(REBARBANDINFO);
150 BandInfo.fMask=RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE|RBBIM_ID;
151 BandNum=SendMessage(hRebar,RB_GETBANDCOUNT,0,0);
152 for(i=0;i<BandNum;i++){
153 SendMessage(hRebar,RB_GETBANDINFO,i,(long)&BandInfo);
154 if(BandInfo.fStyle&RBBS_BREAK) pobj_nv->SaveRebar[i].IsBandBreak=RBBS_BREAK;
155 else pobj_nv->SaveRebar[i].IsBandBreak=0;
156 pobj_nv->SaveRebar[i].RebarID=BandInfo.wID;
157 pobj_nv->SaveRebar[i].RebarLength=BandInfo.cx;
158 }
159}
160
161void CMainRebar::ChangeRebarBand(int BandID){
162 int i;
163 REBARBANDINFO RebarBand;
164
165 //ツールバーが固定されている場合は解除する
166 if(pobj_nv->bNoGripper) SendMessage(hOwner,WM_COMMAND,IDM_NOGRIPPER,0);
167
168 SAVEREBAR *psr;
169 psr=pobj_nv->SaveRebar;
170
171 for(i=0;i<MAX_REBARBANDS;i++){
172 if(psr[i].RebarID==0) break;
173 if(psr[i].RebarID==BandID){
174 SendMessage(hRebar,RB_DELETEBAND,SendMessage(hRebar,RB_IDTOINDEX,BandID,0),0);
175 memcpy(&psr[i],&psr[i+1],(MAX_REBARBANDS-i-1)*sizeof(SAVEREBAR));
176 psr[MAX_REBARBANDS-1].RebarID=0;
177 if(psr[0].RebarID==0){
178 DestroyWindow(hRebar);
179 SetupRebar(hOwner);
180
181 //メニュー状態を設定
182 ResetState_DocMenu();
183
184 ActiveBasic::IDE::Program::mainFrame.Resized();
185 }
186 return;
187 }
188 }
189 if(i>=MAX_REBARBANDS) return;
190 psr[i].IsBandBreak=1;
191 psr[i].RebarID=BandID;
192 psr[i].RebarLength=0;
193 ZeroMemory(&RebarBand,sizeof(REBARBANDINFO));
194 RebarBand.cbSize=sizeof(REBARBANDINFO);
195 RebarBand.fMask=RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE|RBBIM_ID;
196 RebarBand.fStyle=RBBS_CHILDEDGE;
197 RebarBand.cxMinChild=0;
198 RebarBand.cyMinChild=22;
199
200 //レバー上にのせる子ウィンドウを生成
201 char szText[255];
202 HWND hChild;
203 hChild=pobj_DBRebarBand->call_add(pobj_nv->SaveRebar[i].RebarID,i,szText);
204
205 //レバーバンドを追加
206 RebarBand.lpText=szText;
207 RebarBand.hwndChild=hChild;
208 RebarBand.cx=pobj_nv->SaveRebar[i].RebarLength;
209 RebarBand.wID=pobj_nv->SaveRebar[i].RebarID;
210 RebarBand.fStyle|=pobj_nv->SaveRebar[i].IsBandBreak;
211 SendMessage(hRebar,RB_INSERTBAND,-1,(LPARAM)&RebarBand);
212 RebarBand.fStyle^=pobj_nv->SaveRebar[i].IsBandBreak;
213
214 //メニュー状態を設定
215 ResetState_DocMenu();
216}
217
218void CMainRebar::menu_popup(HWND hwnd,int PosX,int PosY){
219 //レバーコントロールの表示設定メニューを表示
220 int i;
221 POINT MousePos;
222 MENUITEMINFO MenuItemInfo;
223
224 //メニューのチェック項目をセット
225 extern HMENU hRebarMenu;
226 MenuItemInfo.cbSize=sizeof(MENUITEMINFO);
227 MenuItemInfo.fMask=MIIM_STATE;
228 MenuItemInfo.fState=MFS_UNCHECKED;
229 SetMenuItemInfo(hRebarMenu,IDM_DOCSELECTBAND,0,&MenuItemInfo);
230 SetMenuItemInfo(hRebarMenu,IDM_STANDARDBAND,0,&MenuItemInfo);
231 SetMenuItemInfo(hRebarMenu,IDM_BANDMENU_WEB_SEARCH,0,&MenuItemInfo);
232#ifndef THETEXT
233 //ProjectEditorのみ
234 SetMenuItemInfo(hRebarMenu,IDM_RELEASEBAND,0,&MenuItemInfo);
235 SetMenuItemInfo(hRebarMenu,IDM_DEBUGBAND,0,&MenuItemInfo);
236 SetMenuItemInfo(hRebarMenu,IDM_SELECTCOMPILERBAND,0,&MenuItemInfo);
237#endif
238
239
240 MenuItemInfo.fState=MFS_CHECKED;
241 for(i=0;i<MAX_REBARBANDS;i++){
242 if(pobj_nv->SaveRebar[i].RebarID==0) break;
243
244 if(pobj_nv->SaveRebar[i].RebarID==ID_DOCCOMBO)
245 SetMenuItemInfo(hRebarMenu,IDM_DOCSELECTBAND,0,&MenuItemInfo);
246
247 if(pobj_nv->SaveRebar[i].RebarID==ID_STANDARDTOOLBAR)
248 SetMenuItemInfo(hRebarMenu,IDM_STANDARDBAND,0,&MenuItemInfo);
249
250 if(pobj_nv->SaveRebar[i].RebarID==ID_WEB_SEARCH)
251 SetMenuItemInfo(hRebarMenu,IDM_BANDMENU_WEB_SEARCH,0,&MenuItemInfo);
252
253#ifndef THETEXT
254 //ProjectEditorのみ
255 if(pobj_nv->SaveRebar[i].RebarID==ID_RELEASETOOLBAR)
256 SetMenuItemInfo(hRebarMenu,IDM_RELEASEBAND,0,&MenuItemInfo);
257
258 if(pobj_nv->SaveRebar[i].RebarID==ID_DEBUGGERTOOLBAR)
259 SetMenuItemInfo(hRebarMenu,IDM_DEBUGBAND,0,&MenuItemInfo);
260
261 if(pobj_nv->SaveRebar[i].RebarID==ID_SELECTCOMPILERCOMBO)
262 SetMenuItemInfo(hRebarMenu,IDM_SELECTCOMPILERBAND,0,&MenuItemInfo);
263#endif
264
265 }
266 if(pobj_nv->bNoGripper) MenuItemInfo.fState=MFS_CHECKED;
267 else MenuItemInfo.fState=MFS_UNCHECKED;
268 SetMenuItemInfo(hRebarMenu,IDM_NOGRIPPER,0,&MenuItemInfo);
269
270 //ポップアップメニューを表示
271 MousePos.x=PosX;
272 MousePos.y=PosY;
273 ClientToScreen(hwnd,&MousePos);
274 TrackPopupMenu(hRebarMenu,TPM_LEFTALIGN|TPM_RIGHTBUTTON,MousePos.x,MousePos.y,0,hOwner,NULL);
275}
276
277
278
279
280
281
282WNDPROC OldDocComboProc;
283WNDPROC OldStandardToolbarProc;
284WNDPROC OldDebuggerToolbarProc;
285WNDPROC OldSelectCompilerComboProc;
286WNDPROC OldWebSearchProc,OldWebSearchEditProc;
287
288void ResetRebarData(void){
289 SAVEREBAR *psr;
290 psr=pobj_nv->SaveRebar;
291 int num=0;
292
293#ifdef THETEXT
294
295 //スタンダードツールバー
296 psr[num].RebarID=ID_STANDARDTOOLBAR;
297 psr[num].RebarLength=BMPNUM_STANDARDTOOLBAR*23+SEPNUM_STANDARDTOOLBAR*8+15;
298 psr[num].IsBandBreak=0;
299 num++;
300
301 //WebSearchコンボボックス
302 psr[num].RebarID=ID_WEB_SEARCH;
303 psr[num].RebarLength=100;
304 psr[num].IsBandBreak=0;
305 num++;
306#else
307
308 //スタンダードツールバー
309 psr[num].RebarID=ID_STANDARDTOOLBAR;
310 psr[num].RebarLength=BMPNUM_STANDARDTOOLBAR*23+SEPNUM_STANDARDTOOLBAR*8+15;
311 psr[num].IsBandBreak=0;
312 num++;
313
314 //プラットフォーム選択ツールバー
315 psr[num].RebarID=ID_SELECTCOMPILERCOMBO;
316 psr[num].RebarLength=100;
317 psr[num].IsBandBreak=0;
318 num++;
319
320 //デバッガツールバー
321 psr[num].RebarID=ID_DEBUGGERTOOLBAR;
322 psr[num].RebarLength=BMPNUM_DEBUGGERTOOLBAR*23+SEPNUM_DEBUGGERTOOLBAR*8+15;
323 psr[num].IsBandBreak=0;
324 num++;
325
326 //リリースビルドツールバー
327 psr[num].RebarID=ID_RELEASETOOLBAR;
328 psr[num].RebarLength=2*23+15;
329 psr[num].IsBandBreak=0;
330 num++;
331#endif
332
333
334 psr[num].RebarID=0;
335
336 pobj_nv->bNoGripper=1;
337}
Note: See TracBrowser for help on using the repository browser.