View Issue Details

IDProjectCategoryView StatusLast Update
0002664Ham Radio DeluxeBugpublic2018-05-13 15:26
ReporterWA9PIE 
Assigned ToK7ZCZ 
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Product Version 
Target VersionFixed in Version6.4.0.840 
Summary0002664: Receive misspelled in DM-780
DescriptionThe word "Receive" is misspelled in DM-780 on a tab at the bottom (see attached).
TagsNo tags attached.
ModuleDM780
Sub-ModuleAppearance/UI
Testing Beta Successful

Relationships

related to 0002667 closedK7ZCZ DM780: Quick Log tab has incorrect name 

Activities

WA9PIE

2018-04-08 02:08

administrator  

ReceiveSpelledWrong.png (68,612 bytes)
ReceiveSpelledWrong.png (68,612 bytes)

K7ZCZ

2018-04-08 13:28

manager   ~0004774

Here are repro steps:

1) Fire up DM780. Connect to DemoMatic or your favorite radio
2) Use the "Waterfall" command in the "View" menu to make sure there's a Waterfall window displayed
3) The Waterfall window might be pinned; if it is, click the pin and un-pin it
4) The Waterfall's tab is labelled "Recieve", should be "Receive".

K7ZCZ

2018-04-08 21:18

manager   ~0004776

This bug is caused by an impressive constellation of problems.

The docking panes are implemented by the CodeJock library, which is a third-party library we use for lots of the UI features in the apps.

A docking pane turns out to have three relevant attributes. One is an ID, which is an integer that uniquely identifies the pane -- most controls have this, and a pane is no different. The next is the title, which appears in the title bar of the pane. The third is a tab caption, which provides the text in the tab when the tab is visible. For reference, the complaint in this issue is that the tab caption has a misspelling.

Curiously, the control's SetTitle() method parses the string passed. If that string has a newline in it, the control assumes the newline separates two string; one is the title and the other is the tab caption. Like this: "Title\nTabCaption". If there's no tab caption, the title is used instead.

For the waterfall, then, the string is "Waterfall\nRecieved". We can see this in the running application: the title bar and tool tip of the pane is "Waterfall", and the text on the tab (when shown) is "Recieved".

Further, the CodeJock code will look for a string resource in the application when the ID of the control is set. That string resource is loaded, and passed to SetTitle(), wihch tries to parse it.

The very root cause of the bug is that a string resource exists in the DM780 application with the same numerical ID as the ID chosen for the Waterfall pane. That string resource looks like this:

    IDC_MODEMRECEIVE "Put the modem in receive mode\nRecieve"

This is a typical string resource for for MFC aplications which have a toolbar. The text (before the newline) is used to put help in the status bar; the second string (after the newline) is used to provide a tooltip for the button with the same ID.

Since the Waterfall has a different symbolic name defined to be the same integer value as IDC_MODEMRECEIVE, when the Waterfall pane is created it's actuall the above string that's loaded. So, for a moment, the title of the window is "Put the modem in receive mode", and the tab caption is "Recieve".

When the main frame in DM780 is created, the application sets a new title for the pane, but it does not set a new caption. At that point, we end up with "Waterfall\nReceived".

I'm sure that customers assume that this issue is a simple misspelling, but it turns out to be far more involved than that.

K7ZCZ

2018-04-09 22:57

manager   ~0004788

OK, I've got a fix for this coded.

For most scenarios, the caption on the tab will correct itself.

There are some cases where it wont; in those cases, closing the pane and re-pinning it will reset the caption.

There might be way to make the configuratoin resistent to resetting the caption even in the re-pinning case. Those cases can't be fixed without heroic measure (completely re-writing pane persistence and overriding the behaviour in the CodeJock library). I'm not willing to take those measures; users plagued at this level can either delete their settings XML file, or edit it to repair the bad caption.

K7ZCZ

2018-04-09 23:00

manager   ~0004789

fixed with this checkin:
https://hrdsoftware.visualstudio.com/HRD/_versionControl/changeset/4040

K7ZCZ

2018-04-25 21:34

manager   ~0004886

This issue will linger, since we have no control over the CodeJock layout serialization. Along this code path, bad values are still reset.

I've added code that slams the title after the window is created; without rewriting all the layout, I think this is the best that can be done.

     Digital Master.exe!CXTPDockingPane::Copy(CXTPDockingPane * pClone) Line 216	C++
     Digital Master.exe!CXTPDockingPane::Copy(CXTPDockingPaneBase * pCloneBase, CMap<CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *> * __formal, unsigned long __formal) Line 205	C++
     Digital Master.exe!CXTPDockingPaneBase::Clone(CXTPDockingPaneLayout * pLayout, CMap<CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *> * pMap, unsigned long dwIgnoredOptions) Line 191	C++
     Digital Master.exe!CXTPDockingPaneTabbedContainer::Copy(CXTPDockingPaneBase * pCloneBase, CMap<CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *> * pMap, unsigned long dwIgnoredOptions) Line 1129	C++
     Digital Master.exe!CXTPDockingPaneBase::Clone(CXTPDockingPaneLayout * pLayout, CMap<CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *> * pMap, unsigned long dwIgnoredOptions) Line 191	C++
     Digital Master.exe!CXTPDockingPaneSplitterContainer::Copy(CXTPDockingPaneBase * pCloneBase, CMap<CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *> * pMap, unsigned long __formal) Line 649	C++
     Digital Master.exe!CXTPDockingPaneBase::Clone(CXTPDockingPaneLayout * pLayout, CMap<CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *> * pMap, unsigned long dwIgnoredOptions) Line 191	C++
     Digital Master.exe!CXTPDockingPaneSplitterContainer::Copy(CXTPDockingPaneBase * pCloneBase, CMap<CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *> * pMap, unsigned long __formal) Line 649	C++
     Digital Master.exe!CXTPDockingPaneBase::Clone(CXTPDockingPaneLayout * pLayout, CMap<CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *> * pMap, unsigned long dwIgnoredOptions) Line 191	C++
     Digital Master.exe!CXTPDockingPaneSplitterContainer::Copy(CXTPDockingPaneBase * pCloneBase, CMap<CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *> * pMap, unsigned long __formal) Line 649	C++
     Digital Master.exe!CXTPDockingPaneBase::Clone(CXTPDockingPaneLayout * pLayout, CMap<CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *,CXTPDockingPaneBase *> * pMap, unsigned long dwIgnoredOptions) Line 191	C++
     Digital Master.exe!CXTPDockingPaneLayout::Copy(const CXTPDockingPaneLayout * pLayout) Line 679	C++
     Digital Master.exe!CXTPDockingPaneManager::SetLayout(const CXTPDockingPaneLayout * pLayout) Line 1133	C++
     Digital Master.exe!CXTPDockingPaneManager::DoPropExchange(CXTPPropExchange * pPX) Line 1385	C++
     Digital Master.exe!CMainFrame::ExchangeLayout(CXTPPropExchange * pPX, int bSerializeControls, int bCommandBars, int bDockingPanes, int bShowStatusBar) Line 580	C++
     Digital Master.exe!CMainFrame::SetFrameLayout(const int bLoad, const int bHidePanes, int & bLayout, const wchar_t * lpszSection, CXTPPropExchangeXMLNode * & pNode) Line 385	C++
>	Digital Master.exe!CMainFrame::SetQSOWindowLayout(const int bLoad) Line 469	C++
     Digital Master.exe!CStandardFormFrame::OnMDIActivate(int bActivate, CWnd * pActivateWnd, CWnd * pDeactivateWnd) Line 1570	C++
     Digital Master.exe!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2486	C++
     Digital Master.exe!CXTPCommandBarsSiteBase<CMDIChildWnd>::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 191	C++
     Digital Master.exe!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2094	C++
     Digital Master.exe!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 282	C++
     Digital Master.exe!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 435	C++
     [External Code]	
     [Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]	
     Digital Master.exe!CMDIChildWnd::DefWindowProcW(unsigned int nMsg, unsigned int wParam, long lParam) Line 418	C++
     Digital Master.exe!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2095	C++
     Digital Master.exe!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 282	C++
     Digital Master.exe!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 435	C++
     [External Code]	
     Digital Master.exe!CFrameWnd::BringToTop(int nCmdShow) Line 2429	C++
     Digital Master.exe!CFrameWnd::ActivateFrame(int nCmdShow) Line 2410	C++
     Digital Master.exe!CMDIChildWnd::ActivateFrame(int nCmdShow) Line 762	C++
     Digital Master.exe!CStandardFormFrame::ActivateFrame(int nCmdShow) Line 1821	C++
     Digital Master.exe!CFrameWnd::InitialUpdateFrame(CDocument * pDoc, int bMakeVisible) Line 829	C++
     Digital Master.exe!CDocTemplate::InitialUpdateFrame(CFrameWnd * pFrame, CDocument * pDoc, int bMakeVisible) Line 408	C++
     Digital Master.exe!CMultiDocTemplate::OpenDocumentFile(const wchar_t * lpszPathName, int bAddToMRU, int bMakeVisible) Line 170	C++
     Digital Master.exe!CMultiDocTemplate::OpenDocumentFile(const wchar_t * lpszPathName, int bMakeVisible) Line 109	C++
     Digital Master.exe!CMainFrame::LoadLayout() Line 9837	C++
     Digital Master.exe!CDigitalMasterApp::InitInstance() Line 1233	C++
     Digital Master.exe!AfxWinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, wchar_t * lpCmdLine, int nCmdShow) Line 37	C++
     Digital Master.exe!wWinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, wchar_t * lpCmdLine, int nCmdShow) Line 26	C++
     [External Code]	

K7ZCZ

2018-04-25 21:36

manager   ~0004887

Here's the fix for the above:
https://hrdsoftware.vssps.visualstudio.com//_signedin?realm=hrdsoftware.visualstudio.com&protocol=&reply_to=https%3A%2F%2Fhrdsoftware.visualstudio.com%2Fweb%2Fcs.aspx%3Fpcguid%3D024933d8-393e-4d7b-806f-280bdbd42f73%26cs%3D4066

WA9PIE

2018-05-12 00:49

administrator   ~0004994

Looks good to me!

WA9PIE

2018-05-12 01:08

administrator   ~0005010

Closed and waiting on May 2018 release.

Issue History

Date Modified Username Field Change
2018-04-08 02:08 WA9PIE New Issue
2018-04-08 02:08 WA9PIE Status new => assigned
2018-04-08 02:08 WA9PIE Assigned To => K7ZCZ
2018-04-08 02:08 WA9PIE File Added: ReceiveSpelledWrong.png
2018-04-08 13:28 K7ZCZ Note Added: 0004774
2018-04-08 18:30 K7ZCZ Relationship added related to 0002667
2018-04-08 21:18 K7ZCZ Note Added: 0004776
2018-04-09 22:57 K7ZCZ Note Added: 0004788
2018-04-09 23:00 K7ZCZ Status assigned => resolved
2018-04-09 23:00 K7ZCZ Resolution open => fixed
2018-04-09 23:00 K7ZCZ Note Added: 0004789
2018-04-25 21:34 K7ZCZ Note Added: 0004886
2018-04-25 21:36 K7ZCZ Note Added: 0004887
2018-05-03 20:10 K7ZCZ Fixed in Version => 6.4.0.837
2018-05-12 00:49 WA9PIE Testing Not Started => Beta Successful
2018-05-12 00:49 WA9PIE Note Added: 0004994
2018-05-12 01:08 WA9PIE Note Added: 0005010
2018-05-12 01:08 WA9PIE Status resolved => closed
2018-05-13 15:25 WA9PIE Fixed in Version 6.4.0.837 => 6.4.0.840
2018-05-13 15:26 WA9PIE Project 3 - Current Dev List => Ham Radio Deluxe