00001
00002
00003
00004
00005 #include "stdafx.h"
00006 #include "FdmApp.h"
00007 #include "PlugToolBar.h"
00008 #include "MainFrm.h"
00009
00010 #ifdef _DEBUG
00011 #define new DEBUG_NEW
00012 #undef THIS_FILE
00013 static char THIS_FILE[] = __FILE__;
00014 #endif
00015
00016 fsPluginMgr _PluginMgr;
00017
00018 CPlugToolBar::CPlugToolBar()
00019 {
00020 m_clrBk = RGB (170, 170, 170);
00021 m_clrText = RGB (255, 255, 255);
00022
00023 m_font.CreateFont (15, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, "MS Sans Serif");
00024
00025 m_iMayBeSelected = m_iPressed = -1;
00026 m_iActivePlugin = -1;
00027 }
00028
00029 CPlugToolBar::~CPlugToolBar()
00030 {
00031 _App.ActivePlugin (m_iActivePlugin);
00032 }
00033
00034 BEGIN_MESSAGE_MAP(CPlugToolBar, CListBox)
00035
00036 ON_WM_MEASUREITEM_REFLECT()
00037 ON_WM_DRAWITEM_REFLECT()
00038 ON_WM_MOUSEMOVE()
00039 ON_WM_ERASEBKGND()
00040 ON_WM_LBUTTONUP()
00041 ON_WM_LBUTTONDOWN()
00042 ON_WM_CAPTURECHANGED()
00043
00044 END_MESSAGE_MAP()
00045
00046 BOOL CPlugToolBar::Create(CWnd *pParent)
00047 {
00048 CRect rc (0, 0, 100, 50);
00049
00050 if (FALSE == CListBox::Create (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS |
00051 LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VSCROLL | WS_HSCROLL, rc, pParent, 0x123))
00052 return FALSE;
00053
00054
00055
00056
00057
00058 if (FALSE == Initialize ())
00059 {
00060 DestroyWindow ();
00061 return FALSE;
00062 }
00063
00064 ShowWindow (SW_SHOW);
00065
00066 return TRUE;
00067 }
00068
00069 BOOL CPlugToolBar::Initialize()
00070 {
00071 m_pMainFrame = (CMainFrame*) AfxGetApp ()->m_pMainWnd;
00072
00073
00074 if (FALSE == _PluginMgr.LoadPlugins (m_pPlugFrame))
00075 return FALSE;
00076
00077 int cMenuImages;
00078
00079 for (int i = 0; i < _PluginMgr.GetPluginCount (); i++)
00080 {
00081 fsPluginInfo &plug = _PluginMgr.Plugin (i);
00082 AddString (plug.strName);
00083 ::ShowWindow (plug.hWnd, SW_HIDE);
00084
00085 if (plug.pbmpMenuImages)
00086 {
00087
00088 cMenuImages = m_pMainFrame->m_imgsTool.GetImageCount ();
00089 m_pMainFrame->m_imgsTool.Add (plug.pbmpMenuImages, RGB (255, 0, 255));
00090 m_pMainFrame->m_dimgsTool.Add (plug.pbmpMenuDImages, RGB (255, 0, 255));
00091 delete plug.pbmpMenuImages;
00092 delete plug.pbmpMenuDImages;
00093 plug.pbmpMenuImages = plug.pbmpMenuDImages = NULL;
00094
00095
00096
00097 for (int j = 0; j < plug.cMenuMainImages; j++)
00098 {
00099 plug.pMenuMainImages [j].iCheckImage += cMenuImages;
00100 plug.pMenuMainImages [j].iImage += cMenuImages;
00101 }
00102
00103 for (j = 0; j < plug.cMenuViewImages; j++)
00104 {
00105 plug.pMenuViewImages [j].iCheckImage += cMenuImages;
00106 plug.pMenuViewImages [j].iImage += cMenuImages;
00107 }
00108 }
00109 }
00110
00111 int iPlug = _App.ActivePlugin ();
00112 if (iPlug >= _PluginMgr.GetPluginCount () || iPlug < 0)
00113 iPlug = 0;
00114
00115 SetActivePlugin (iPlug);
00116
00117 return TRUE;
00118 }
00119
00120 void CPlugToolBar::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
00121 {
00122 lpMeasureItemStruct->itemHeight = 32 + 15 + 15;
00123 lpMeasureItemStruct->itemWidth = 100;
00124 }
00125
00126 void CPlugToolBar::DrawItem(LPDRAWITEMSTRUCT lpDraw)
00127 {
00128
00129
00130 CDC *pDC = CDC::FromHandle (lpDraw->hDC);
00131 CString strItem;
00132
00133 Erase (pDC, lpDraw->rcItem);
00134
00135 GetText (lpDraw->itemID, strItem);
00136
00137 CPoint pt (lpDraw->rcItem.left + (lpDraw->rcItem.right - lpDraw->rcItem.left) / 2 - 32/2, lpDraw->rcItem.top + 5);
00138
00139
00140 if (m_iPressed == (int)lpDraw->itemID)
00141 DrawPressed (pDC, pt);
00142 else if (m_iMayBeSelected == (int)lpDraw->itemID)
00143 DrawMayBeSelected (pDC, pt);
00144
00145 lpDraw->rcItem.top += 32+6+3;
00146 SetBkMode (lpDraw->hDC, TRANSPARENT);
00147 if (lpDraw->itemID == (UINT) m_iActivePlugin)
00148 pDC->SetTextColor (RGB (255, 255, 255));
00149 else
00150 SetTextColor (lpDraw->hDC, RGB (235, 235, 235));
00151
00152 HGDIOBJ oldFont = SelectObject (lpDraw->hDC, m_font.m_hObject);
00153
00154
00155 DrawText (lpDraw->hDC, strItem, strItem.GetLength (), &lpDraw->rcItem, DT_TOP | DT_CENTER);
00156
00157 SelectObject (lpDraw->hDC, oldFont);
00158
00159 if (m_iPressed == (int)lpDraw->itemID)
00160 {
00161 pt.x++;
00162 pt.y++;
00163 }
00164
00165
00166 _PluginMgr.GetImages ()->Draw (pDC, lpDraw->itemID, pt, ILD_TRANSPARENT);
00167 }
00168
00169 void CPlugToolBar::OnMouseMove(UINT nFlags, CPoint point)
00170 {
00171 BOOL bOutside;
00172 int i;
00173
00174 i = ItemFromPoint (point, bOutside);
00175
00176 if (bOutside)
00177 {
00178 if (m_iMayBeSelected != -1)
00179 {
00180 InvalidateItem (m_iMayBeSelected);
00181 ReleaseCapture ();
00182 }
00183
00184 m_iMayBeSelected = m_iPressed = -1;
00185 return;
00186 }
00187
00188 CRect rcItem;
00189 GetItemRect (i, &rcItem);
00190 CPoint pt (rcItem.left + (rcItem.right - rcItem.left) / 2 - 32/2, rcItem.top + 5);
00191
00192
00193 rcItem.left = pt.x;
00194 rcItem.top = pt.y;
00195 rcItem.right = pt.x + 32;
00196 rcItem.bottom = pt.y + 32;
00197
00198
00199 if (!PtInRect (&rcItem, point))
00200 {
00201 if (m_iMayBeSelected != -1)
00202 {
00203 InvalidateItem (m_iMayBeSelected);
00204 ReleaseCapture ();
00205 }
00206
00207 m_iMayBeSelected = m_iPressed = -1;
00208 return;
00209 }
00210
00211 if (m_iMayBeSelected == i)
00212 return;
00213 else if (m_iMayBeSelected != -1)
00214 {
00215 InvalidateItem (m_iMayBeSelected);
00216 ReleaseCapture ();
00217 }
00218
00219 m_iMayBeSelected = i;
00220 m_iPressed = -1;
00221
00222 InvalidateItem (i);
00223
00224 SetCapture ();
00225
00226 CListBox::OnMouseMove(nFlags, point);
00227 }
00228
00229 BOOL CPlugToolBar::OnEraseBkgnd(CDC* pDC)
00230 {
00231 CRect rc;
00232 GetClientRect (&rc);
00233
00234 Erase (pDC, rc);
00235
00236 return TRUE;
00237 }
00238
00239 void CPlugToolBar::Erase(CDC *pDC, RECT &rc)
00240 {
00241 CBrush br (m_clrBk);
00242 CPen pen (PS_NULL, 1, RGB (0,0,0));
00243
00244 CBrush *oldBr = pDC->SelectObject (&br);
00245 CPen *oldPen = pDC->SelectObject (&pen);
00246
00247 pDC->Rectangle (&rc);
00248
00249 pDC->SelectObject (oldBr);
00250 pDC->SelectObject (oldPen);
00251 }
00252
00253 void CPlugToolBar::DrawMayBeSelected(CDC *pDC, CPoint pt)
00254 {
00255 CPen penLight (PS_SOLID, 1, GetSysColor (COLOR_3DLIGHT));
00256 CPen penShadow (PS_SOLID, 1, GetSysColor (COLOR_3DDKSHADOW));
00257
00258 CPen *oldPen = pDC->SelectObject (&penLight);
00259 pDC->MoveTo (pt.x + 32 + 3, pt.y - 3);
00260 pDC->LineTo (pt.x - 3, pt.y - 3);
00261 pDC->LineTo (pt.x - 3, pt.y + 32 + 3);
00262
00263 pDC->SelectObject (&penShadow);
00264 pDC->MoveTo (pt.x + 32 + 3, pt.y - 3);
00265 pDC->LineTo (pt.x + 32 + 3, pt.y + 32 + 3);
00266 pDC->LineTo (pt.x - 3, pt.y + 32 + 3);
00267
00268 pDC->SelectObject (oldPen);
00269 }
00270
00271 void CPlugToolBar::InvalidateItem(int , BOOL bErase)
00272 {
00273 CRect rcItem;
00274 GetItemRect (m_iMayBeSelected, &rcItem);
00275 InvalidateRect (&rcItem, bErase);
00276 }
00277
00278 void CPlugToolBar::OnLButtonUp(UINT , CPoint )
00279 {
00280 if (m_iPressed != -1)
00281 {
00282 int i = m_iPressed;
00283 m_iPressed = -1;
00284 InvalidateItem (i);
00285 OnClickItem (i);
00286 }
00287 }
00288
00289 void CPlugToolBar::OnLButtonDown(UINT , CPoint )
00290 {
00291 if (m_iMayBeSelected != -1)
00292 {
00293 m_iPressed = m_iMayBeSelected;
00294 InvalidateItem (m_iPressed);
00295 }
00296 }
00297
00298 void CPlugToolBar::DrawPressed(CDC *pDC, CPoint pt)
00299 {
00300 CPen penLight (PS_SOLID, 1, GetSysColor (COLOR_3DLIGHT));
00301 CPen penShadow (PS_SOLID, 1, GetSysColor (COLOR_3DDKSHADOW));
00302
00303 CPen *oldPen = pDC->SelectObject (&penShadow);
00304 pDC->MoveTo (pt.x + 32 + 3, pt.y - 3);
00305 pDC->LineTo (pt.x - 3, pt.y - 3);
00306 pDC->LineTo (pt.x - 3, pt.y + 32 + 3);
00307
00308 pDC->SelectObject (&penLight);
00309 pDC->MoveTo (pt.x + 32 + 3, pt.y - 3);
00310 pDC->LineTo (pt.x + 32 + 3, pt.y + 32 + 3);
00311 pDC->LineTo (pt.x - 3, pt.y + 32 + 3);
00312
00313 pDC->SelectObject (oldPen);
00314 }
00315
00316 void CPlugToolBar::OnCaptureChanged(CWnd *pWnd)
00317 {
00318 int i = m_iMayBeSelected;
00319
00320 m_iPressed = m_iMayBeSelected = -1;
00321
00322 if (i != -1)
00323 InvalidateItem (i);
00324
00325 CListBox::OnCaptureChanged(pWnd);
00326 }
00327
00328 void CPlugToolBar::OnClickItem(int iItem)
00329 {
00330 SetActivePlugin (iItem);
00331 }
00332
00333 void CPlugToolBar::SetActivePlugin(int iPlugin)
00334 {
00335 if (m_iActivePlugin == iPlugin)
00336 return;
00337
00338 if (m_iActivePlugin != -1)
00339 {
00340
00341
00342
00343 ::ShowWindow (_PluginMgr.Plugin (m_iActivePlugin).hWnd, SW_HIDE);
00344 m_pMainFrame->RemovePluginMenu ();
00345 m_pMainFrame->RemovePluginMenuView ();
00346 _TBMgr.HideGroup (m_iActivePlugin + 1);
00347 }
00348
00349 int iOld = m_iActivePlugin;
00350 m_iActivePlugin = iPlugin;
00351
00352 CRect rc;
00353
00354 GetItemRect (iOld, &rc);
00355 InvalidateRect (&rc, FALSE);
00356 GetItemRect (iPlugin, &rc);
00357 InvalidateRect (&rc, FALSE);
00358
00359 fsPluginInfo &plug = _PluginMgr.Plugin (iPlugin);
00360 m_pMainFrame->AddPluginMenu (plug.hMenuMain, plug.pMenuMainImages, plug.cMenuMainImages);
00361 m_pMainFrame->AddPluginMenuView (plug.hMenuView, plug.pMenuViewImages, plug.cMenuViewImages, plug.pMenuViewItems, plug.cMenuViewItems);
00362 m_pPlugFrame->SetPluginWindow (plug.hWnd);
00363 m_pPlugFrame->SetFrameName (plug.strLongName);
00364 ::ShowWindow (plug.hWnd, SW_SHOW);
00365 ::SetFocus (plug.hWnd);
00366 _TBMgr.ShowGroup (m_iActivePlugin + 1, 6);
00367
00368 _PluginMgr.OnSetActivePlugin (iPlugin);
00369 }
00370
00371 void CPlugToolBar::SendPluginCommand(UINT uCmd)
00372 {
00373 ::SendMessage (_PluginMgr.Plugin (m_iActivePlugin).hWnd, WM_COMMAND, uCmd, 0);
00374 }
00375
00376 int CPlugToolBar::GetActivePlugin()
00377 {
00378 return m_iActivePlugin;
00379 }
00380
00381 void CPlugToolBar::OnNewLng()
00382 {
00383 ResetContent ();
00384
00385 for (int i = 0; i < _PluginMgr.GetPluginCount (); i++)
00386 {
00387 fsPluginInfo *plug = &_PluginMgr.Plugin (i);
00388 AddString (plug->strName);
00389 if (i == m_iActivePlugin)
00390 {
00391 m_pPlugFrame->SetFrameName (plug->strLongName);
00392 m_pMainFrame->AddPluginMenu (plug->hMenuMain, plug->pMenuMainImages, plug->cMenuMainImages);
00393 m_pMainFrame->AddPluginMenuView (plug->hMenuView, plug->pMenuViewImages, plug->cMenuViewImages, plug->pMenuViewItems, plug->cMenuViewItems);
00394 }
00395 }
00396 }