| OLD | NEW |
| 1 #include "PluginStdAfx.h" | 1 #include "PluginStdAfx.h" |
| 2 | 2 |
| 3 #include "PluginClass.h" | 3 #include "PluginClass.h" |
| 4 #include "PluginSettings.h" | 4 #include "PluginSettings.h" |
| 5 #include "PluginSystem.h" | 5 #include "PluginSystem.h" |
| 6 #include "PluginFilter.h" | 6 #include "PluginFilter.h" |
| 7 #include "PluginMimeFilterClient.h" | 7 #include "PluginMimeFilterClient.h" |
| 8 #include "PluginClient.h" | 8 #include "PluginClient.h" |
| 9 #include "PluginClientFactory.h" | 9 #include "PluginClientFactory.h" |
| 10 #include "PluginMutex.h" | 10 #include "PluginMutex.h" |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 | 195 |
| 196 s_criticalSectionLocal.Lock(); | 196 s_criticalSectionLocal.Lock(); |
| 197 { | 197 { |
| 198 browser = s_asyncWebBrowser2; | 198 browser = s_asyncWebBrowser2; |
| 199 } | 199 } |
| 200 s_criticalSectionLocal.Unlock(); | 200 s_criticalSectionLocal.Unlock(); |
| 201 | 201 |
| 202 return browser; | 202 return browser; |
| 203 } | 203 } |
| 204 | 204 |
| 205 CString CPluginClass::GetBrowserUrl() const | 205 std::wstring CPluginClass::GetBrowserUrl() const |
| 206 { | 206 { |
| 207 CString url; | 207 std::wstring url; |
| 208 | |
| 209 CComQIPtr<IWebBrowser2> browser = GetBrowser(); | 208 CComQIPtr<IWebBrowser2> browser = GetBrowser(); |
| 210 if (browser) | 209 if (browser) |
| 211 { | 210 { |
| 212 CComBSTR bstrURL; | 211 BSTR bstrURL; |
| 213 | 212 if (SUCCEEDED(browser->get_LocationURL(&bstrURL)) && bstrURL) |
| 214 if (SUCCEEDED(browser->get_LocationURL(&bstrURL))) | |
| 215 { | 213 { |
| 216 url = bstrURL; | 214 url = std::wstring(bstrURL, SysStringLen(bstrURL)); |
| 217 CPluginClient::UnescapeUrl(url); | 215 SysFreeString(bstrURL); |
| 216 UnescapeUrl(url); |
| 218 } | 217 } |
| 219 } | 218 } |
| 220 else | 219 else |
| 221 { | 220 { |
| 222 url = m_tab->GetDocumentUrl(); | 221 url = m_tab->GetDocumentUrl(); |
| 223 } | 222 } |
| 224 | |
| 225 return url; | 223 return url; |
| 226 } | 224 } |
| 227 | 225 |
| 228 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) | 226 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) |
| 229 { | 227 { |
| 230 if (thisPtr == NULL) | 228 if (thisPtr == NULL) |
| 231 return 0; | 229 return 0; |
| 232 if (!((CPluginClass*)thisPtr)->InitObject(true)) | 230 if (!((CPluginClass*)thisPtr)->InitObject(true)) |
| 233 { | 231 { |
| 234 ((CPluginClass*)thisPtr)->Unadvice(); | 232 ((CPluginClass*)thisPtr)->Unadvice(); |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 { | 540 { |
| 543 WebBrowser2Ptr = pDispParams->rgvarg[6].pdispVal; | 541 WebBrowser2Ptr = pDispParams->rgvarg[6].pdispVal; |
| 544 } | 542 } |
| 545 else | 543 else |
| 546 { | 544 { |
| 547 // Wrong type, return. | 545 // Wrong type, return. |
| 548 return; | 546 return; |
| 549 } | 547 } |
| 550 | 548 |
| 551 // Get the URL | 549 // Get the URL |
| 552 CString url; | 550 std::wstring url; |
| 553 vt = pDispParams->rgvarg[5].vt; | 551 const auto& arg = pDispParams->rgvarg[5]; |
| 554 if (vt == VT_BYREF + VT_VARIANT) | 552 vt = arg.vt; |
| 553 if (vt == (VT_BYREF | VT_VARIANT) && arg.pvarVal->vt == VT_BSTR) |
| 555 { | 554 { |
| 556 url = pDispParams->rgvarg[5].pvarVal->bstrVal; | 555 BSTR b = arg.pvarVal->bstrVal; |
| 557 | 556 if (b) { |
| 558 CPluginClient::UnescapeUrl(url); | 557 url = std::wstring(b, SysStringLen(b)); |
| 558 UnescapeUrl(url); |
| 559 } |
| 559 } | 560 } |
| 560 else | 561 else |
| 561 { | 562 { |
| 562 // Wrong type, return. | 563 // Wrong type, return. |
| 563 return; | 564 return; |
| 564 } | 565 } |
| 565 | 566 |
| 566 // If webbrowser2 is equal to top level browser (as set in SetSite), we are na
vigating new page | 567 // If webbrowser2 is equal to top level browser (as set in SetSite), we are na
vigating new page |
| 567 CPluginClient* client = CPluginClient::GetInstance(); | 568 CPluginClient* client = CPluginClient::GetInstance(); |
| 568 | 569 CString urlLegacy = ToCString(url); |
| 569 if (url.Find(L"javascript") == 0) | 570 if (urlLegacy.Find(L"javascript") == 0) |
| 570 { | 571 { |
| 571 } | 572 } |
| 572 else if (GetBrowser().IsEqualObject(WebBrowser2Ptr)) | 573 else if (GetBrowser().IsEqualObject(WebBrowser2Ptr)) |
| 573 { | 574 { |
| 574 m_tab->OnNavigate(url); | 575 m_tab->OnNavigate(url); |
| 575 | 576 |
| 576 DEBUG_GENERAL(L"============================================================
====================\nBegin main navigation url:" + url + "\n===================
=============================================================") | 577 DEBUG_GENERAL(L"============================================================
====================\nBegin main navigation url:" + urlLegacy + "\n=============
===================================================================") |
| 577 | 578 |
| 578 #ifdef ENABLE_DEBUG_RESULT | 579 #ifdef ENABLE_DEBUG_RESULT |
| 579 CPluginDebug::DebugResultDomain(url); | 580 CPluginDebug::DebugResultDomain(urlLegacy); |
| 580 #endif | 581 #endif |
| 581 | 582 |
| 582 UpdateStatusBar(); | 583 UpdateStatusBar(); |
| 583 } | 584 } |
| 584 else | 585 else |
| 585 { | 586 { |
| 586 DEBUG_NAVI(L"Navi::Begin navigation url:" + url) | 587 DEBUG_NAVI(L"Navi::Begin navigation url:" + urlLegacy) |
| 587 m_tab->CacheFrame(url); | 588 m_tab->CacheFrame(url); |
| 588 } | 589 } |
| 589 } | 590 } |
| 591 |
| 590 STDMETHODIMP CPluginClass::OnTabChanged(DISPPARAMS* pDispParams, WORD wFlags) | 592 STDMETHODIMP CPluginClass::OnTabChanged(DISPPARAMS* pDispParams, WORD wFlags) |
| 591 { | 593 { |
| 592 DEBUG_GENERAL("Tab changed"); | 594 DEBUG_GENERAL("Tab changed"); |
| 593 bool newtabshown = pDispParams->rgvarg[1].intVal==3; | 595 bool newtabshown = pDispParams->rgvarg[1].intVal==3; |
| 594 if (newtabshown) | 596 if (newtabshown) |
| 595 { | 597 { |
| 596 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(Ge
tCurrentThreadId()); | 598 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(Ge
tCurrentThreadId()); |
| 597 if (it == s_threadInstances.end()) | 599 if (it == s_threadInstances.end()) |
| 598 { | 600 { |
| 599 s_threadInstances[::GetCurrentThreadId()] = this; | 601 s_threadInstances[::GetCurrentThreadId()] = this; |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 712 { | 714 { |
| 713 DEBUG_NAVI("Navi::Document Complete") | 715 DEBUG_NAVI("Navi::Document Complete") |
| 714 | 716 |
| 715 CComQIPtr<IWebBrowser2> browser = GetBrowser(); | 717 CComQIPtr<IWebBrowser2> browser = GetBrowser(); |
| 716 | 718 |
| 717 if (browser && pDispParams->cArgs >= 2 && pDispParams->rgvarg[1].vt == VT_
DISPATCH) | 719 if (browser && pDispParams->cArgs >= 2 && pDispParams->rgvarg[1].vt == VT_
DISPATCH) |
| 718 { | 720 { |
| 719 CComQIPtr<IWebBrowser2> pBrowser = pDispParams->rgvarg[1].pdispVal; | 721 CComQIPtr<IWebBrowser2> pBrowser = pDispParams->rgvarg[1].pdispVal; |
| 720 if (pBrowser) | 722 if (pBrowser) |
| 721 { | 723 { |
| 722 CString url; | 724 BSTR bstrUrl; |
| 723 CComBSTR bstrUrl; | |
| 724 if (SUCCEEDED(pBrowser->get_LocationURL(&bstrUrl)) && ::SysStringLen(b
strUrl) > 0) | 725 if (SUCCEEDED(pBrowser->get_LocationURL(&bstrUrl)) && ::SysStringLen(b
strUrl) > 0) |
| 725 { | 726 { |
| 726 url = bstrUrl; | 727 std::wstring url(bstrUrl, SysStringLen(bstrUrl)); |
| 727 | 728 SysFreeString(bstrUrl); |
| 728 CPluginClient::UnescapeUrl(url); | 729 UnescapeUrl(url); |
| 729 | |
| 730 m_tab->OnDocumentComplete(browser, url, browser.IsEqualObject(pBrows
er)); | 730 m_tab->OnDocumentComplete(browser, url, browser.IsEqualObject(pBrows
er)); |
| 731 } | 731 } |
| 732 } | 732 } |
| 733 } | 733 } |
| 734 } | 734 } |
| 735 break; | 735 break; |
| 736 | 736 |
| 737 case DISPID_ONQUIT: | 737 case DISPID_ONQUIT: |
| 738 case DISPID_QUIT: | 738 case DISPID_QUIT: |
| 739 { | 739 { |
| (...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1133 STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, O
LECMD prgCmds[], OLECMDTEXT* pCmdText) | 1133 STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, O
LECMD prgCmds[], OLECMDTEXT* pCmdText) |
| 1134 { | 1134 { |
| 1135 if (cCmds == 0) return E_INVALIDARG; | 1135 if (cCmds == 0) return E_INVALIDARG; |
| 1136 if (prgCmds == 0) return E_POINTER; | 1136 if (prgCmds == 0) return E_POINTER; |
| 1137 | 1137 |
| 1138 prgCmds[0].cmdf = OLECMDF_ENABLED; | 1138 prgCmds[0].cmdf = OLECMDF_ENABLED; |
| 1139 | 1139 |
| 1140 return S_OK; | 1140 return S_OK; |
| 1141 } | 1141 } |
| 1142 | 1142 |
| 1143 HMENU CPluginClass::CreatePluginMenu(const CString& url) | 1143 HMENU CPluginClass::CreatePluginMenu(const std::wstring& url) |
| 1144 { | 1144 { |
| 1145 DEBUG_GENERAL("CreatePluginMenu"); | 1145 DEBUG_GENERAL("CreatePluginMenu"); |
| 1146 HINSTANCE hInstance = _AtlBaseModule.GetModuleInstance(); | 1146 HINSTANCE hInstance = _AtlBaseModule.GetModuleInstance(); |
| 1147 | 1147 |
| 1148 HMENU hMenu = ::LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1)); | 1148 HMENU hMenu = ::LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1)); |
| 1149 | 1149 |
| 1150 HMENU hMenuTrackPopup = GetSubMenu(hMenu, 0); | 1150 HMENU hMenuTrackPopup = GetSubMenu(hMenu, 0); |
| 1151 | 1151 |
| 1152 SetMenuBar(hMenuTrackPopup, url); | 1152 SetMenuBar(hMenuTrackPopup, url); |
| 1153 | 1153 |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1350 { | 1350 { |
| 1351 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_NAVIGATION, PLUGIN_ERROR_NAVIGATION
_SETTINGS, "Navigation::Failed") | 1351 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_NAVIGATION, PLUGIN_ERROR_NAVIGATION
_SETTINGS, "Navigation::Failed") |
| 1352 } | 1352 } |
| 1353 } | 1353 } |
| 1354 } | 1354 } |
| 1355 break; | 1355 break; |
| 1356 } | 1356 } |
| 1357 case ID_MENU_DISABLE_ON_SITE: | 1357 case ID_MENU_DISABLE_ON_SITE: |
| 1358 { | 1358 { |
| 1359 CPluginSettings* settings = CPluginSettings::GetInstance(); | 1359 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 1360 CString urlString = GetTab()->GetDocumentUrl(); | 1360 std::wstring urlString = GetTab()->GetDocumentUrl(); |
| 1361 if (client->IsWhitelistedUrl(to_wstring(urlString))) | 1361 if (client->IsWhitelistedUrl(urlString)) |
| 1362 { | 1362 { |
| 1363 settings->RemoveWhiteListedDomain(to_CString(client->GetHostFromUrl(to_w
string(urlString)))); | 1363 settings->RemoveWhiteListedDomain(to_CString(client->GetHostFromUrl(urlS
tring))); |
| 1364 } | 1364 } |
| 1365 else | 1365 else |
| 1366 { | 1366 { |
| 1367 settings->AddWhiteListedDomain(to_CString(client->GetHostFromUrl(to_wstr
ing(urlString)))); | 1367 settings->AddWhiteListedDomain(to_CString(client->GetHostFromUrl(urlStri
ng))); |
| 1368 } | 1368 } |
| 1369 GetBrowser()->Refresh(); | 1369 GetBrowser()->Refresh(); |
| 1370 } | 1370 } |
| 1371 default: | 1371 default: |
| 1372 break; | 1372 break; |
| 1373 } | 1373 } |
| 1374 | 1374 |
| 1375 // Invalidate and redraw the control | 1375 // Invalidate and redraw the control |
| 1376 UpdateStatusBar(); | 1376 UpdateStatusBar(); |
| 1377 } | 1377 } |
| 1378 | 1378 |
| 1379 | 1379 |
| 1380 bool CPluginClass::SetMenuBar(HMENU hMenu, const CString& url) | 1380 bool CPluginClass::SetMenuBar(HMENU hMenu, const std::wstring& url) |
| 1381 { | 1381 { |
| 1382 DEBUG_GENERAL("SetMenuBar"); | 1382 DEBUG_GENERAL("SetMenuBar"); |
| 1383 | 1383 |
| 1384 std::wstring ctext; | 1384 std::wstring ctext; |
| 1385 | 1385 |
| 1386 s_criticalSectionLocal.Lock(); | 1386 s_criticalSectionLocal.Lock(); |
| 1387 { | 1387 { |
| 1388 s_menuDomains.clear(); | 1388 s_menuDomains.clear(); |
| 1389 } | 1389 } |
| 1390 s_criticalSectionLocal.Unlock(); | 1390 s_criticalSectionLocal.Unlock(); |
| 1391 | 1391 |
| 1392 Dictionary* dictionary = Dictionary::GetInstance(); | 1392 Dictionary* dictionary = Dictionary::GetInstance(); |
| 1393 | 1393 |
| 1394 MENUITEMINFOW fmii; | 1394 MENUITEMINFOW fmii; |
| 1395 memset(&fmii, 0, sizeof(MENUITEMINFO)); | 1395 memset(&fmii, 0, sizeof(MENUITEMINFO)); |
| 1396 fmii.cbSize = sizeof(MENUITEMINFO); | 1396 fmii.cbSize = sizeof(MENUITEMINFO); |
| 1397 | 1397 |
| 1398 MENUITEMINFOW miiSep; | 1398 MENUITEMINFOW miiSep; |
| 1399 memset(&miiSep, 0, sizeof(MENUITEMINFO)); | 1399 memset(&miiSep, 0, sizeof(MENUITEMINFO)); |
| 1400 miiSep.cbSize = sizeof(MENUITEMINFO); | 1400 miiSep.cbSize = sizeof(MENUITEMINFO); |
| 1401 miiSep.fMask = MIIM_TYPE | MIIM_FTYPE; | 1401 miiSep.fMask = MIIM_TYPE | MIIM_FTYPE; |
| 1402 miiSep.fType = MFT_SEPARATOR; | 1402 miiSep.fType = MFT_SEPARATOR; |
| 1403 | 1403 |
| 1404 CPluginClient* client = CPluginClient::GetInstance(); | 1404 CPluginClient* client = CPluginClient::GetInstance(); |
| 1405 CPluginSettings* settings = CPluginSettings::GetInstance(); | 1405 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 1406 { | 1406 { |
| 1407 ctext = dictionary->Lookup("menu", "menu-disable-on-site"); | 1407 ctext = dictionary->Lookup("menu", "menu-disable-on-site"); |
| 1408 // Is domain in white list? | 1408 // Is domain in white list? |
| 1409 ReplaceString(ctext, L"?1?", client->GetHostFromUrl(to_wstring(url))); | 1409 ReplaceString(ctext, L"?1?", client->GetHostFromUrl(url)); |
| 1410 if (client->IsWhitelistedUrl(to_wstring(GetTab()->GetDocumentUrl()))) | 1410 if (client->IsWhitelistedUrl(GetTab()->GetDocumentUrl())) |
| 1411 { | 1411 { |
| 1412 fmii.fState = MFS_CHECKED | MFS_ENABLED; | 1412 fmii.fState = MFS_CHECKED | MFS_ENABLED; |
| 1413 } | 1413 } |
| 1414 else | 1414 else |
| 1415 { | 1415 { |
| 1416 fmii.fState = MFS_UNCHECKED | MFS_ENABLED; | 1416 fmii.fState = MFS_UNCHECKED | MFS_ENABLED; |
| 1417 } | 1417 } |
| 1418 fmii.fMask = MIIM_STRING | MIIM_STATE; | 1418 fmii.fMask = MIIM_STRING | MIIM_STATE; |
| 1419 fmii.dwTypeData = const_cast<LPWSTR>(ctext.c_str()); | 1419 fmii.dwTypeData = const_cast<LPWSTR>(ctext.c_str()); |
| 1420 fmii.cch = static_cast<UINT>(ctext.size()); | 1420 fmii.cch = static_cast<UINT>(ctext.size()); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1615 } | 1615 } |
| 1616 | 1616 |
| 1617 LRESULT result = CallWindowProc(pClass->m_pWndProcStatus, hWnd, message, wPara
m, lParam); | 1617 LRESULT result = CallWindowProc(pClass->m_pWndProcStatus, hWnd, message, wPara
m, lParam); |
| 1618 | 1618 |
| 1619 | 1619 |
| 1620 return result; | 1620 return result; |
| 1621 | 1621 |
| 1622 } | 1622 } |
| 1623 | 1623 |
| 1624 | 1624 |
| 1625 HICON CPluginClass::GetStatusBarIcon(const CString& url) | 1625 HICON CPluginClass::GetStatusBarIcon(const std::wstring& url) |
| 1626 { | 1626 { |
| 1627 // use the disable icon as defualt, if the client doesn't exists | 1627 // use the disable icon as defualt, if the client doesn't exists |
| 1628 HICON hIcon = GetIcon(ICON_PLUGIN_DEACTIVATED); | 1628 HICON hIcon = GetIcon(ICON_PLUGIN_DEACTIVATED); |
| 1629 | 1629 |
| 1630 CPluginTab* tab = GetTab(::GetCurrentThreadId()); | 1630 CPluginTab* tab = GetTab(::GetCurrentThreadId()); |
| 1631 if (tab) | 1631 if (tab) |
| 1632 { | 1632 { |
| 1633 CPluginClient* client = CPluginClient::GetInstance(); | 1633 CPluginClient* client = CPluginClient::GetInstance(); |
| 1634 if (!CPluginSettings::GetInstance()->IsPluginEnabled()) | 1634 if (!CPluginSettings::GetInstance()->IsPluginEnabled()) |
| 1635 { | 1635 { |
| 1636 } | 1636 } |
| 1637 else if (client->IsWhitelistedUrl(to_wstring(url))) | 1637 else if (client->IsWhitelistedUrl(url)) |
| 1638 { | 1638 { |
| 1639 hIcon = GetIcon(ICON_PLUGIN_DISABLED); | 1639 hIcon = GetIcon(ICON_PLUGIN_DISABLED); |
| 1640 } | 1640 } |
| 1641 else | 1641 else |
| 1642 { | 1642 { |
| 1643 CPluginSettings* settings = CPluginSettings::GetInstance(); | 1643 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 1644 hIcon = GetIcon(ICON_PLUGIN_ENABLED); | 1644 hIcon = GetIcon(ICON_PLUGIN_ENABLED); |
| 1645 } | 1645 } |
| 1646 } | 1646 } |
| 1647 return hIcon; | 1647 return hIcon; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1744 | 1744 |
| 1745 // Done! | 1745 // Done! |
| 1746 EndPaint(hWnd, &ps); | 1746 EndPaint(hWnd, &ps); |
| 1747 | 1747 |
| 1748 return 0; | 1748 return 0; |
| 1749 } | 1749 } |
| 1750 | 1750 |
| 1751 case WM_LBUTTONUP: | 1751 case WM_LBUTTONUP: |
| 1752 case WM_RBUTTONUP: | 1752 case WM_RBUTTONUP: |
| 1753 { | 1753 { |
| 1754 CString strURL = pClass->GetBrowserUrl(); | 1754 std::wstring url = pClass->GetBrowserUrl(); |
| 1755 if (strURL != pClass->GetTab()->GetDocumentUrl()) | 1755 if (url != pClass->GetTab()->GetDocumentUrl()) |
| 1756 { | 1756 { |
| 1757 pClass->GetTab()->SetDocumentUrl(strURL); | 1757 pClass->GetTab()->SetDocumentUrl(url); |
| 1758 } | 1758 } |
| 1759 | 1759 |
| 1760 // Create menu | 1760 // Create menu |
| 1761 HMENU hMenu = pClass->CreatePluginMenu(strURL); | 1761 HMENU hMenu = pClass->CreatePluginMenu(url); |
| 1762 if (!hMenu) | 1762 if (!hMenu) |
| 1763 { | 1763 { |
| 1764 return 0; | 1764 return 0; |
| 1765 } | 1765 } |
| 1766 | 1766 |
| 1767 // Display menu | 1767 // Display menu |
| 1768 POINT pt; | 1768 POINT pt; |
| 1769 ::GetCursorPos(&pt); | 1769 ::GetCursorPos(&pt); |
| 1770 | 1770 |
| 1771 RECT rc; | 1771 RECT rc; |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1975 } | 1975 } |
| 1976 } | 1976 } |
| 1977 } | 1977 } |
| 1978 | 1978 |
| 1979 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); | 1979 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); |
| 1980 } | 1980 } |
| 1981 | 1981 |
| 1982 return hTabWnd; | 1982 return hTabWnd; |
| 1983 | 1983 |
| 1984 } | 1984 } |
| OLD | NEW |