diff --git a/Version.ps1 b/Version.ps1 index aeae4aec1..15d0f56df 100644 --- a/Version.ps1 +++ b/Version.ps1 @@ -34,11 +34,15 @@ try $Major = 3 $Minor = [int]$(Get-Date -format yy) $Revis = [int]$(Get-Date -format MMdd) + $BetaVer = 'L" "' + $BetaVerA = '" "' if ($AppVeyorEnv) { $Build = [int]($env:appveyor_build_number) } else { $Build = [int](Get-Content "Versions\build.txt") + 1 + #$BetaVer = 'L" beta "' + #$BetaVerA = '" beta "' } if (!$Build) { $Build = 0 } $SciVer = [int](Get-Content "scintilla\version.txt") @@ -56,6 +60,9 @@ try (Get-Content "src\VersionEx.h") | ForEach-Object { $_ -replace '\$BUILD\$', "$Build" } | Set-Content "src\VersionEx.h" (Get-Content "src\VersionEx.h") | ForEach-Object { $_ -replace '\$SCIVER\$', "$SciVer" } | Set-Content "src\VersionEx.h" (Get-Content "src\VersionEx.h") | ForEach-Object { $_ -replace '\$ONIGMOVER\$', "$OnigmoVer" } | Set-Content "src\VersionEx.h" + (Get-Content "src\VersionEx.h") | ForEach-Object { $_ -replace '\$BETAVER\$', "$BetaVer" } | Set-Content "src\VersionEx.h" + (Get-Content "src\VersionEx.h") | ForEach-Object { $_ -replace '\$BETAVERA\$', "$BetaVerA" } | Set-Content "src\VersionEx.h" + Copy-Item -LiteralPath "Versions\Notepad3.exe.manifest.tpl" -Destination "res\Notepad3.exe.manifest.conf" -Force (Get-Content "res\Notepad3.exe.manifest.conf") | ForEach-Object { $_ -replace '\$VERSION\$', $CompleteVer } | Set-Content "res\Notepad3.exe.manifest.conf" if ($AppVeyorEnv) { diff --git a/Versions/VersionEx.h.tpl b/Versions/VersionEx.h.tpl index 1f4a8eab1..319d1f967 100644 Binary files a/Versions/VersionEx.h.tpl and b/Versions/VersionEx.h.tpl differ diff --git a/res/AboutInfo.rtf b/res/AboutInfo.rtf new file mode 100644 index 000000000..88c46ff09 Binary files /dev/null and b/res/AboutInfo.rtf differ diff --git a/res/Notepad3.ico b/res/Notepad3.ico index 33e98eb1a..e2246d191 100644 Binary files a/res/Notepad3.ico and b/res/Notepad3.ico differ diff --git a/res/Notepad3_128.ico b/res/Notepad3_128.ico new file mode 100644 index 000000000..29431f8b1 Binary files /dev/null and b/res/Notepad3_128.ico differ diff --git a/res/rizonesoft.bmp b/res/rizonesoft.bmp new file mode 100644 index 000000000..958191f58 Binary files /dev/null and b/res/rizonesoft.bmp differ diff --git a/src/Dialogs.c b/src/Dialogs.c index d2d5073cf..778c7740d 100644 --- a/src/Dialogs.c +++ b/src/Dialogs.c @@ -31,6 +31,12 @@ #include #include #include + +#pragma warning( push ) +#pragma warning( disable : 4201) // union/struct w/o name +#include +#pragma warning( pop ) + #include "scintilla.h" #include "notepad3.h" #include "edit.h" @@ -60,7 +66,6 @@ extern int flagNoFileVariables; extern int flagUseSystemMRU; - //============================================================================= // // MsgBox() @@ -205,105 +210,261 @@ BOOL GetDirectory(HWND hwndParent,int iTitle,LPWSTR pszFolder,LPCWSTR pszBase,BO } +/* +//============================================================================= +// +// _LoadStringEx() +// +static DWORD _LoadStringEx(UINT nResId, LPCTSTR pszRsType, LPSTR strOut) +{ + LPTSTR pszResId = MAKEINTRESOURCE(nResId); + + if (g_hInstance == NULL) + return 0L; + + HRSRC hRsrc = FindResource(g_hInstance, pszResId, pszRsType); + + if (hRsrc == NULL) { + return 0L; + } + + HGLOBAL hGlobal = LoadResource(g_hInstance, hRsrc); + + if (hGlobal == NULL) { + return 0L; + } + + const BYTE* pData = (const BYTE*)LockResource(hGlobal); + + if (pData == NULL) { + FreeResource(hGlobal); + return 0L; + } + + DWORD dwSize = SizeofResource(g_hInstance, hRsrc); + + if (strOut) { + memcpy(strOut, (LPCSTR)pData, dwSize); + } + + UnlockResource(hGlobal); + + FreeResource(hGlobal); + + return dwSize; +} + +*/ + +//============================================================================= +// +// (EditStreamCallback) +// _LoadRtfCallback() RTF edit control StreamIn's callback function +// +static DWORD CALLBACK _LoadRtfCallback( + DWORD_PTR dwCookie, // (in) pointer to the string + LPBYTE pbBuff, // (in) pointer to the destination buffer + LONG cb, // (in) size in bytes of the destination buffer + LONG FAR* pcb // (out) number of bytes transfered +) +{ + LPSTR* pstr = (LPSTR*)dwCookie; + LONG len = (LONG)strlen(*pstr); + + if (len < cb) + { + *pcb = len; + memcpy(pbBuff, (LPCSTR)*pstr, *pcb); + *pstr += len; + //*pstr = '\0'; + } + else + { + *pcb = cb; + memcpy(pbBuff, (LPCSTR)*pstr, *pcb); + *pstr += cb; + } + return 0; +} +// ---------------------------------------------------------------------------- + + +static char* pAboutInfoResource = ABOUT_INFO_RTF; +static char* pAboutInfo; + //============================================================================= // // AboutDlgProc() // -INT_PTR CALLBACK AboutDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) +INT_PTR CALLBACK AboutDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) { - + WCHAR wch[256] = { L'\0' }; static HFONT hFontTitle; - - switch(umsg) + + switch (umsg) { - case WM_INITDIALOG: + case WM_INITDIALOG: + { + SetDlgItemText(hwnd, IDC_VERSION, VERSION_FILEVERSION_LONG); + SetDlgItemText(hwnd, IDC_SCI_VERSION, VERSION_SCIVERSION); + SetDlgItemText(hwnd, IDC_COPYRIGHT, VERSION_LEGALCOPYRIGHT); + SetDlgItemText(hwnd, IDC_AUTHORNAME, VERSION_AUTHORNAME); + SetDlgItemText(hwnd, IDC_COMPILER, VERSION_COMPILER); + + if (hFontTitle) + DeleteObject(hFontTitle); + if (NULL == (hFontTitle = (HFONT)SendDlgItemMessage(hwnd, IDC_VERSION, WM_GETFONT, 0, 0))) + hFontTitle = GetStockObject(DEFAULT_GUI_FONT); + LOGFONT lf; + GetObject(hFontTitle, sizeof(LOGFONT), &lf); + lf.lfWeight = FW_BOLD; + lf.lfWidth = 8; + lf.lfHeight = 22; + // lf.lfQuality = ANTIALIASED_QUALITY; + hFontTitle = CreateFontIndirect(&lf); + + SendDlgItemMessage(hwnd, IDC_VERSION, WM_SETFONT, (WPARAM)hFontTitle, TRUE); + + if (GetDlgItem(hwnd, IDC_WEBPAGE) == NULL) { + SetDlgItemText(hwnd, IDC_WEBPAGE2, VERSION_WEBPAGEDISPLAY); + ShowWindow(GetDlgItem(hwnd, IDC_WEBPAGE2), SW_SHOWNORMAL); + } + else { + StringCchPrintf(wch, COUNTOF(wch), L"%s", VERSION_WEBPAGEDISPLAY); + SetDlgItemText(hwnd, IDC_WEBPAGE, wch); + } + + // --- Rich Edit Control --- + //SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETBKGNDCOLOR, 0, (LPARAM)GetBackgroundColor(hwnd)); + SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETBKGNDCOLOR, 0, (LPARAM)GetSysColor(COLOR_3DFACE)); + + SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SHOWSCROLLBAR, SB_VERT, (LPARAM)TRUE); + SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SHOWSCROLLBAR, SB_HORZ, (LPARAM)FALSE); + + DWORD styleFlags = SES_EXTENDBACKCOLOR; // | SES_HYPERLINKTOOLTIPS; + SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETEDITSTYLE, (WPARAM)styleFlags, (LPARAM)styleFlags); + SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_AUTOURLDETECT, (WPARAM)1, (LPARAM)0); + + //CHARFORMAT2 cf2; + //ZeroMemory(&cf2, sizeof(CHARFORMAT2)); + //cf2.dwMask = CFM_LINK | CFM_UNDERLINE | CFM_COLOR | CFM_LINKPROTECTED; + //cf2.dwEffects = CFE_LINK | CFE_UNDERLINE | CFE_LINKPROTECTED; + //cf2.crTextColor = RGB(255, 0, 0); + //cf2.bUnderlineType = CFU_UNDERLINENONE; + //SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETEDITSTYLEEX, 0, (LPARAM)SES_EX_HANDLEFRIENDLYURL); + //SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf2); + + SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETEVENTMASK, 0, (LPARAM)(ENM_LINK)); // link click + + #if TRUE + EDITSTREAM editStreamIn = { (DWORD_PTR)&pAboutInfo, 0, _LoadRtfCallback }; + pAboutInfo = pAboutInfoResource; + SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_STREAMIN, SF_RTF, (LPARAM)&editStreamIn); + + //DWORD dwSize = _LoadStringEx(IDR_ABOUTINFO_RTF, L"RTF", NULL); + //if (dwSize != 0) { + // char* pchBuffer = LocalAlloc(LPTR, dwSize + 1); + // pAboutInfo = pchBuffer; + // _LoadStringEx(IDR_ABOUTINFO_RTF, L"RTF", pAboutInfo); + // SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_STREAMIN, SF_RTF, (LPARAM)&editStreamIn); + // LocalFree(pchBuffer); + //} + //else { + // pAboutInfo = chErrMsg; + // SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_STREAMIN, SF_RTF, (LPARAM)&editStreamIn); + //} + + #else + PARAFORMAT2 pf2; + ZeroMemory(&pf2, sizeof(PARAFORMAT2)); + pf2.cbSize = (UINT)sizeof(PARAFORMAT2); + pf2.dwMask = (PFM_SPACEBEFORE | PFM_SPACEAFTER | PFM_LINESPACING); + pf2.dySpaceBefore = 48; // paragraph + pf2.dySpaceAfter = 48; // paragraph + pf2.dyLineSpacing = 24; // [twips] + pf2.bLineSpacingRule = 5; // 5: dyLineSpacing/20 is the spacing, in lines, from one line to the next. + SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_SETPARAFORMAT, 0, (LPARAM)&pf2); + SetDlgItemText(hwnd, IDC_RICHEDITABOUT, ABOUT_INFO_PLAIN); + #endif + + CenterDlgInParent(hwnd); + } + return TRUE; + + case WM_NOTIFY: + { + LPNMHDR pnmhdr = (LPNMHDR)lParam; + switch (pnmhdr->code) + { + case NM_CLICK: + case NM_RETURN: { - WCHAR wch[256] = { L'\0' }; - LOGFONT lf; + switch (pnmhdr->idFrom) + { + case IDC_WEBPAGE: + ShellExecute(hwnd, L"open", L"https://www.rizonesoft.com", NULL, NULL, SW_SHOWNORMAL); + break; - SetDlgItemText(hwnd,IDC_VERSION,VERSION_FILEVERSION_LONG); - SetDlgItemText(hwnd,IDC_SCI_VERSION,VERSION_SCIVERSION); - SetDlgItemText(hwnd,IDC_COPYRIGHT,VERSION_LEGALCOPYRIGHT); - SetDlgItemText(hwnd,IDC_AUTHORNAME,VERSION_AUTHORNAME); - SetDlgItemText(hwnd,IDC_COMPILER,VERSION_COMPILER); - - if (hFontTitle) - DeleteObject(hFontTitle); - - if (NULL == (hFontTitle = (HFONT)SendDlgItemMessage(hwnd,IDC_VERSION,WM_GETFONT,0,0))) - hFontTitle = GetStockObject(DEFAULT_GUI_FONT); - GetObject(hFontTitle,sizeof(LOGFONT),&lf); - lf.lfWeight = FW_BOLD; - lf.lfWidth = 8; - lf.lfHeight = 22; - // lf.lfQuality = ANTIALIASED_QUALITY; - hFontTitle = CreateFontIndirect(&lf); - SendDlgItemMessage(hwnd,IDC_VERSION,WM_SETFONT,(WPARAM)hFontTitle,TRUE); - - if (GetDlgItem(hwnd,IDC_WEBPAGE) == NULL) { - SetDlgItemText(hwnd,IDC_WEBPAGE2,VERSION_WEBPAGEDISPLAY); - ShowWindow(GetDlgItem(hwnd,IDC_WEBPAGE2),SW_SHOWNORMAL); - } - else { - StringCchPrintf(wch,COUNTOF(wch),L"%s",VERSION_WEBPAGEDISPLAY); - SetDlgItemText(hwnd,IDC_WEBPAGE,wch); - } - - if (GetDlgItem(hwnd, IDC_MODWEBPAGE) == NULL) { - SetDlgItemText(hwnd, IDC_MODWEBPAGE2, VERSION_MODPAGEDISPLAY); - ShowWindow(GetDlgItem(hwnd, IDC_MODWEBPAGE2), SW_SHOWNORMAL); - } - else { - StringCchPrintf(wch,COUNTOF(wch),L"%s", VERSION_MODPAGEDISPLAY); - SetDlgItemText(hwnd, IDC_MODWEBPAGE, wch); - } - - if (GetDlgItem(hwnd, IDC_NOTE2WEBPAGE) == NULL) { - SetDlgItemText(hwnd, IDC_NOTE2WEBPAGE2, VERSION_WEBPAGE2DISPLAY); - ShowWindow(GetDlgItem(hwnd, IDC_NOTE2WEBPAGE2), SW_SHOWNORMAL); - } - else { - StringCchPrintf(wch,COUNTOF(wch),L"%s", VERSION_WEBPAGE2DISPLAY); - SetDlgItemText(hwnd, IDC_NOTE2WEBPAGE, wch); - } - - CenterDlgInParent(hwnd); - } - return TRUE; - - case WM_NOTIFY: - { - LPNMHDR pnmhdr = (LPNMHDR)lParam; - switch (pnmhdr->code) { - - case NM_CLICK: - case NM_RETURN: - { - if (pnmhdr->idFrom == IDC_WEBPAGE) { - ShellExecute(hwnd,L"open",L"https://rizonesoft.com",NULL,NULL,SW_SHOWNORMAL); - } - else if (pnmhdr->idFrom == IDC_MODWEBPAGE) { - ShellExecute(hwnd,L"open",L"https://xhmikosr.github.io/notepad2-mod/",NULL,NULL,SW_SHOWNORMAL); - } - else if (pnmhdr->idFrom == IDC_NOTE2WEBPAGE) { - ShellExecute(hwnd,L"open",L"http://www.flos-freeware.ch",NULL,NULL,SW_SHOWNORMAL); - } - } - break; + default: + break; } } break; - case WM_COMMAND: - - switch(LOWORD(wParam)) + case EN_LINK: // hyperlink from RichEdit Ctrl { - case IDOK: - case IDCANCEL: - EndDialog(hwnd,IDOK); - break; + ENLINK* penLink = (ENLINK *)lParam; + if (penLink->msg == WM_LBUTTONDOWN) + { + WCHAR hLink[256]; + TEXTRANGE txtRng; + txtRng.chrg = penLink->chrg; + txtRng.lpstrText = hLink; + SendDlgItemMessage(hwnd, IDC_RICHEDITABOUT, EM_GETTEXTRANGE, 0, (LPARAM)&txtRng); + ShellExecute(hwnd, L"open", hLink, NULL, NULL, SW_SHOWNORMAL); + } } - return TRUE; + break; + } + } + break; + + case WM_SETCURSOR: + { + if ((LOWORD(lParam) == HTCLIENT) && + (GetDlgCtrlID((HWND)wParam) == IDC_RIZONEBMP)) + { + SetCursor(LoadCursor(NULL, IDC_HAND)); + SetWindowLongPtr(hwnd, DWLP_MSGRESULT, TRUE); + return TRUE; + } + } + break; + + case WM_COMMAND: + + switch (LOWORD(wParam)) + { + case IDC_RIZONEBMP: + ShellExecute(hwnd, L"open", L"https://www.rizonesoft.com", NULL, NULL, SW_SHOWNORMAL); + break; + + case IDC_COPYVERSTRG: + { + WCHAR wchVerInfo[1024] = { L'\0' }; + StringCchCopy(wchVerInfo, COUNTOF(wchVerInfo), VERSION_FILEVERSION_LONG); + StringCchCat(wchVerInfo, COUNTOF(wchVerInfo), L"\n" VERSION_SCIVERSION); + StringCchCat(wchVerInfo, COUNTOF(wchVerInfo), L"\n" VERSION_COMPILER); + SetClipboardTextW(g_hwndMain, wchVerInfo); + } + break; + + case IDOK: + case IDCANCEL: + EndDialog(hwnd, IDOK); + break; + } + return TRUE; } return FALSE; } @@ -2601,6 +2762,4 @@ INT_PTR InfoBox(int iType,LPCWSTR lpstrSetting,int uidMessage,...) } - - // End of Dialogs.c diff --git a/src/Edit.c b/src/Edit.c index 34d567212..ca6355daa 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -647,7 +647,7 @@ BOOL EditSetClipboardText(HWND hwnd, const char* pszText) return TRUE; } - WCHAR* pszTextW = L""; + WCHAR* pszTextW = NULL; UINT uCodePage = Encoding_SciGetCodePage(hwnd); int cchTextW = MultiByteToWideChar(uCodePage, 0, pszText, -1, NULL, 0) + 1; if (cchTextW > 1) { @@ -655,21 +655,12 @@ BOOL EditSetClipboardText(HWND hwnd, const char* pszText) MultiByteToWideChar(uCodePage, 0, pszText, -1, pszTextW, cchTextW); } - if (!OpenClipboard(GetParent(hwnd))) { + if (pszTextW) { + SetClipboardTextW(GetParent(hwnd), pszTextW); LocalFree(pszTextW); - return FALSE; + return TRUE; } - - HANDLE hNew = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(WCHAR) * cchTextW); - WCHAR* pszNew = GlobalLock(hNew); - - StringCchCopy(pszNew, cchTextW, pszTextW); - GlobalUnlock(hNew); - - EmptyClipboard(); - SetClipboardData(CF_UNICODETEXT, hNew); - CloseClipboard(); - return TRUE; + return FALSE; } @@ -867,11 +858,6 @@ BOOL EditPasteClipboard(HWND hwnd, BOOL bSwapClipBoard) // BOOL EditCopyAppend(HWND hwnd, BOOL bAppend) { - if (!IsClipboardFormatAvailable(CF_UNICODETEXT)) { - SciCall_Copy(); - return TRUE; - } - int iCurPos = SciCall_GetCurrentPos(); int iAnchorPos = SciCall_GetAnchor(); @@ -892,7 +878,7 @@ BOOL EditCopyAppend(HWND hwnd, BOOL bAppend) pszText = LocalAlloc(LPTR,cchText + 1); SciCall_GetTextFromBegin((DocPos)LocalSize(pszText), pszText); } - WCHAR* pszTextW = L""; + WCHAR* pszTextW = NULL; UINT uCodePage = Encoding_SciGetCodePage(hwnd); int cchTextW = MultiByteToWideChar(uCodePage,0,pszText,-1,NULL,0); if (cchTextW > 0) { @@ -904,6 +890,14 @@ BOOL EditCopyAppend(HWND hwnd, BOOL bAppend) if (pszText) LocalFree(pszText); + if (!bAppend) { + BOOL res = (BOOL)SetClipboardTextW(GetParent(hwnd), pszTextW); + LocalFree(pszTextW); + return res; + } + + // --- Append to Clipboard --- + if (!OpenClipboard(GetParent(hwnd))) { LocalFree(pszTextW); return FALSE; @@ -912,29 +906,29 @@ BOOL EditCopyAppend(HWND hwnd, BOOL bAppend) HANDLE hOld = GetClipboardData(CF_UNICODETEXT); WCHAR* pszOld = GlobalLock(hOld); - int sizeNew = bAppend ? (lstrlen(pszOld) + lstrlen(pszTextW) + 1) : (lstrlen(pszTextW) + 1); - const WCHAR *pszSep = L"\r\n\r\n"; - sizeNew += bAppend ? (int)lstrlen(pszSep) : 0; + int sizeNew = lstrlen(pszOld) + lstrlen(pszTextW) + 1; - HANDLE hNew = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,sizeof(WCHAR) * sizeNew); - WCHAR* pszNew = GlobalLock(hNew); + const WCHAR *pszSep = L"\r\n"; + sizeNew += (int)lstrlen(pszSep); + + // Copy Clip + WCHAR* pszNewTextW = LocalAlloc(LPTR, sizeof(WCHAR) * sizeNew); - if (bAppend) { - StringCchCopy(pszNew, sizeNew, pszOld); - StringCchCat(pszNew, sizeNew, pszSep); - StringCchCat(pszNew, sizeNew, pszTextW); - } - else { - StringCchCopy(pszNew, sizeNew, pszTextW); - } - GlobalUnlock(hNew); - GlobalUnlock(hOld); + if (pszOld) + StringCchCopy(pszNewTextW, sizeNew, pszOld); - EmptyClipboard(); - SetClipboardData(CF_UNICODETEXT,hNew); + GlobalUnlock(hOld); CloseClipboard(); - return TRUE; + + // Add New + StringCchCat(pszNewTextW, sizeNew, pszSep); + StringCchCat(pszNewTextW, sizeNew, pszTextW); + + BOOL res = (BOOL)SetClipboardTextW(GetParent(hwnd), pszNewTextW); + + LocalFree(pszNewTextW); + return res; } diff --git a/src/Helpers.c b/src/Helpers.c index d9d31c8c7..37ee40e91 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -78,6 +78,30 @@ WCHAR* _StrCutIW(WCHAR* s,const WCHAR* pattern) } +//============================================================================= +// +// SetClipboardWchTextW() +// +bool SetClipboardTextW(HWND hwnd, LPCWSTR pszTextW) +{ + if (!OpenClipboard(hwnd)) { + return false; + } + + int cchTextW = lstrlen(pszTextW) + 1; + HANDLE hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(WCHAR) * cchTextW); + WCHAR* pszNew = GlobalLock(hData); + + StringCchCopy(pszNew, cchTextW, pszTextW); + GlobalUnlock(hData); + + EmptyClipboard(); + SetClipboardData(CF_UNICODETEXT, hData); + CloseClipboard(); + return true; +} + + //============================================================================= // // Manipulation of (cached) ini file sections @@ -189,16 +213,18 @@ BOOL IniSectionSetString(LPWSTR lpCachedIniSection,LPCWSTR lpName,LPCWSTR lpStri // PrivateIsAppThemed() // extern HMODULE hModUxTheme; + BOOL PrivateIsAppThemed() { - FARPROC pfnIsAppThemed; - BOOL bIsAppThemed = FALSE; + BOOL bIsAppThemed = IsWin8() ? TRUE : FALSE; - if (hModUxTheme) { - pfnIsAppThemed = GetProcAddress(hModUxTheme,"IsAppThemed"); + if (hModUxTheme && !bIsAppThemed) + { + FARPROC pfnIsAppThemed = GetProcAddress(hModUxTheme,"IsAppThemed"); - if (pfnIsAppThemed) + if (pfnIsAppThemed) { bIsAppThemed = (BOOL)pfnIsAppThemed(); + } } return bIsAppThemed; } @@ -941,6 +967,16 @@ BOOL StatusSetTextID(HWND hwnd,UINT nPart,UINT uID) } +//============================================================================= +// +// StatusCalcPaneWidth() +// +COLORREF GetBackgroundColor(HWND hwnd) +{ + return GetBkColor(GetDC(hwnd)); +} + + //============================================================================= // // StatusCalcPaneWidth() diff --git a/src/Helpers.h b/src/Helpers.h index 228dd753e..f63789cb7 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -108,6 +108,8 @@ __inline BOOL IniSectionSetBool(LPWSTR lpCachedIniSection, LPCWSTR lpName, BOOL #define IsWinServer() IsWindowsServer() // Indicates if the current OS is a Windows Server release. // Applications that need to distinguish between server and client versions of Windows should call this function. +bool SetClipboardTextW(HWND, LPCWSTR); + BOOL PrivateIsAppThemed(); HRESULT PrivateSetCurrentProcessExplicitAppUserModelID(PCWSTR); BOOL IsElevated(); @@ -143,6 +145,7 @@ void DeleteBitmapButton(HWND,int); #define StatusSetSimple(hwnd,b) SendMessage(hwnd,SB_SIMPLE,(WPARAM)b,0) BOOL StatusSetText(HWND,UINT,LPCWSTR); BOOL StatusSetTextID(HWND,UINT,UINT); +COLORREF GetBackgroundColor(HWND); int StatusCalcPaneWidth(HWND,LPCWSTR); int Toolbar_GetButtons(HWND,int,LPWSTR,int); diff --git a/src/Notepad3.c b/src/Notepad3.c index dbc156a42..7db816cff 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -280,6 +280,7 @@ WIN32_FIND_DATA fdCurFile; UINT msgTaskbarCreated = 0; HMODULE hModUxTheme = NULL; +HMODULE hRichEdit = NULL; EDITFINDREPLACE g_efrData = { "", "", "", "", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL }; UINT cpLastFind = 0; @@ -509,7 +510,11 @@ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,int n msgTaskbarCreated = RegisterWindowMessage(L"TaskbarCreated"); - hModUxTheme = LoadLibrary(L"uxtheme.dll"); + if (!IsWin8()) { + hModUxTheme = LoadLibrary(L"uxtheme.dll"); + } + hRichEdit = LoadLibrary(L"RICHED20.DLL"); // Use "RichEdit20W" for control in .rc + //hRichEdit = LoadLibrary(L"MSFTEDIT.DLL"); // Use "RichEdit50W" for control in .rc Scintilla_RegisterClasses(hInstance); @@ -1367,7 +1372,7 @@ void CreateBars(HWND hwnd,HINSTANCE hInstance) if (hbmp) bExternalBitmap = TRUE; else { - LPWSTR toolBarIntRes = (iHighDpiToolBar > 0) ? MAKEINTRESOURCE(IDR_MAINWND2) : MAKEINTRESOURCE(IDR_MAINWND); + LPWSTR toolBarIntRes = (iHighDpiToolBar > 0) ? MAKEINTRESOURCE(IDR_MAINWNDTB2) : MAKEINTRESOURCE(IDR_MAINWNDTB); hbmp = LoadImage(hInstance, toolBarIntRes, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); hbmpCopy = CopyImage(hbmp, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); } @@ -4349,13 +4354,12 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) break; - case IDM_HELP_ONLINEDOCUMENTATION: - ShellExecute(0, 0, ONLINE_HELP_WEBSITE, 0, 0, SW_SHOW); - break; + case IDM_HELP_ONLINEDOCUMENTATION: + ShellExecute(0, 0, ONLINE_HELP_WEBSITE, 0, 0, SW_SHOW); + break; - case IDM_HELP_ABOUT: - ThemedDialogBox(g_hInstance,MAKEINTRESOURCE(IDD_ABOUT), - hwnd,AboutDlgProc); + case IDM_HELP_ABOUT: + ThemedDialogBox(g_hInstance, MAKEINTRESOURCE(IDD_ABOUT), hwnd, AboutDlgProc); break; case IDM_SETPASS: @@ -4886,19 +4890,8 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) GetString(IDS_UNTITLED,tchUntitled,COUNTOF(tchUntitled)); pszCopy = tchUntitled; } - - if (OpenClipboard(hwnd)) { - HANDLE hData; - WCHAR *pData; - EmptyClipboard(); - int len = lstrlen(pszCopy); - hData = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,sizeof(WCHAR) * (len+1)); - pData = GlobalLock(hData); - StringCchCopyN(pData,(len+1),pszCopy,len); - GlobalUnlock(hData); - SetClipboardData(CF_UNICODETEXT,hData); - CloseClipboard(); - } + SetClipboardTextW(hwnd, pszCopy); + UpdateToolbar(); } break; @@ -4906,22 +4899,9 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) case CMD_COPYWINPOS: { WCHAR wszWinPos[MIDSZ_BUFFER]; - WININFO wi = GetMyWindowPlacement(g_hwndMain,NULL); StringCchPrintf(wszWinPos,COUNTOF(wszWinPos),L"/pos %i,%i,%i,%i,%i",wi.x,wi.y,wi.cx,wi.cy,wi.max); - - if (OpenClipboard(hwnd)) { - HANDLE hData; - WCHAR *pData; - EmptyClipboard(); - int len = StringCchLenW(wszWinPos,COUNTOF(wszWinPos)); - hData = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,sizeof(WCHAR) * (len+1)); - pData = GlobalLock(hData); - StringCchCopyN(pData,(len+1),wszWinPos,len); - GlobalUnlock(hData); - SetClipboardData(CF_UNICODETEXT,hData); - CloseClipboard(); - } + SetClipboardTextW(hwnd, wszWinPos); UpdateToolbar(); } break; @@ -8474,8 +8454,7 @@ void ShowNotifyIcon(HWND hwnd,BOOL bAdd) NOTIFYICONDATA nid; if (!hIcon) - hIcon = LoadImage(g_hInstance,MAKEINTRESOURCE(IDR_MAINWND), - IMAGE_ICON,16,16,LR_DEFAULTCOLOR); + hIcon = LoadImage(g_hInstance,MAKEINTRESOURCE(IDR_MAINWND),IMAGE_ICON,16,16,LR_DEFAULTCOLOR); ZeroMemory(&nid,sizeof(NOTIFYICONDATA)); nid.cbSize = sizeof(NOTIFYICONDATA); diff --git a/src/Notepad3.rc b/src/Notepad3.rc index 6e2598d39..6e145ffb6 100644 --- a/src/Notepad3.rc +++ b/src/Notepad3.rc @@ -25,9 +25,11 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. +IDI_RUN ICON "..\\res\\Run.ico" + IDR_MAINWND ICON "..\\res\\Notepad3.ico" -IDI_RUN ICON "..\\res\\Run.ico" +IDR_MAINWND128 ICON "..\\res\\Notepad3_128.ico" IDI_STYLES ICON "..\\res\\Styles.ico" @@ -37,7 +39,7 @@ IDI_STYLES ICON "..\\res\\Styles.ico" // Bitmap // -IDR_MAINWND BITMAP "..\\res\\Toolbar.bmp" +IDR_MAINWNDTB BITMAP "..\\res\\Toolbar.bmp" IDB_OPEN BITMAP "..\\res\\Open.bmp" @@ -49,7 +51,9 @@ IDB_PICK BITMAP "..\\res\\Pick.bmp" IDB_ENCODING BITMAP "..\\res\\Encoding.bmp" -IDR_MAINWND2 BITMAP "..\\res\\Toolbar2.bmp" +IDR_MAINWNDTB2 BITMAP "..\\res\\Toolbar2.bmp" + +IDR_RIZBITMAP BITMAP "..\\res\\rizonesoft.bmp" ///////////////////////////////////////////////////////////////////////////// @@ -179,8 +183,8 @@ BEGIN MENUITEM "&Fuse Lines\tCtrl+Alt+J", IDM_EDIT_JOINLN_NOSP MENUITEM "&Preserve Paragraphs\tCtrl+Shift+J", IDM_EDIT_JOINLINES_PARA MENUITEM SEPARATOR - MENUITEM "Merge &Blank Lines\tAlt+Y", IDM_EDIT_MERGEBLANKLINES - MENUITEM "&Remove Blank Lines\tAlt+R", IDM_EDIT_REMOVEBLANKLINES + MENUITEM "Merge &Blank Lines\tAlt+Y", IDM_EDIT_MERGEBLANKLINES + MENUITEM "&Remove Blank Lines\tAlt+R", IDM_EDIT_REMOVEBLANKLINES END POPUP "&Block" BEGIN @@ -634,27 +638,22 @@ END // Dialog // -IDD_ABOUT DIALOGEX 0, 0, 255, 227 +IDD_ABOUT DIALOGEX 0, 0, 400, 275 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_NOFAILCREATE | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Notepad3" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - DEFPUSHBUTTON "OK",IDOK,195,204,50,14 - ICON IDR_MAINWND,IDC_STATIC,7,7,21,20 - LTEXT "",IDC_VERSION,45,10,200,17 - LTEXT "Scintilla Library Version:",IDC_SCI_VERSION,45,24,200,8 - LTEXT "Compiled with:",IDC_COMPILER2,45,35,200,8 - LTEXT "",IDC_COMPILER,96,35,200,8 - LTEXT "",IDC_COPYRIGHT,45,55,200,8 - LTEXT "",IDC_WEBPAGE2,45,64,200,8,NOT WS_VISIBLE | WS_DISABLED - CONTROL "",IDC_WEBPAGE,"SysLink",WS_TABSTOP,45,64,200,10 - LTEXT "XhmikosR ( Notepad2-mod )",IDC_STATIC,45,85,200,8 - LTEXT "",IDC_MODWEBPAGE2,45,94,200,8,NOT WS_VISIBLE | WS_DISABLED - CONTROL "",IDC_MODWEBPAGE,"SysLink",WS_TABSTOP,45,94,200,10 - LTEXT "Florian Balmer et al. ( Notepad2 )",IDC_STATIC,45,110,200,8 - LTEXT "",IDC_NOTE2WEBPAGE2,45,119,200,8,NOT WS_VISIBLE | WS_DISABLED - CONTROL "",IDC_NOTE2WEBPAGE,"SysLink",WS_TABSTOP,45,119,200,10 - LTEXT "Contributors: Derick Payne (Rizonesoft), Flo Balmer (Notepad2), N.Hodgson (Scintilla), XhmikosR (Notepad2-mod), Kai Liu, RL Vision, A.Lekov, B.Barbieri, M.Ellis (MinimizeToTray), D.Dyer (crypt), T.D.Hanson (uthash), RaiKoHoff",IDC_STATIC,45,150,200,44 + DEFPUSHBUTTON "OK",IDOK,330,256,50,14 + ICON IDR_MAINWND128,IDC_STATIC,4,5,20,20,SS_REALSIZEIMAGE,WS_EX_TRANSPARENT + LTEXT "IDC_VERSION",IDC_VERSION,80,7,288,15 + LTEXT "Scintilla Library Version:",IDC_SCI_VERSION,80,24,280,8 + LTEXT "Build with:",IDC_COMPILER,80,35,210,8 + LTEXT "IDC_COPYRIGHT",IDC_COPYRIGHT,80,55,180,8 + LTEXT "",IDC_WEBPAGE2,190,55,100,8,NOT WS_VISIBLE | WS_DISABLED + CONTROL "",IDC_WEBPAGE,"SysLink",WS_TABSTOP,190,55,100,10 + CONTROL IDR_RIZBITMAP,IDC_RIZONEBMP,"Static",SS_BITMAP | SS_NOTIFY | SS_REALSIZEIMAGE,305,7,130,20,WS_EX_TRANSPARENT + PUSHBUTTON "Copy Version Text",IDC_COPYVERSTRG,304,35,76,14,BS_FLAT + CONTROL "",IDC_RICHEDITABOUT,"RichEdit20W",WS_VSCROLL | WS_HSCROLL | WS_TABSTOP | 0x29c4,20,80,360,170 END IDD_FIND DIALOGEX 0, 0, 273, 129 @@ -669,7 +668,7 @@ BEGIN CONTROL "Match &beginning of word only",IDC_FINDSTART,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,61,110,10 CONTROL "&Transform backslashes",IDC_FINDTRANSFORMBS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,73,85,10 CONTROL "Regular &expression search",IDC_FINDREGEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,85,96,10 - CONTROL "Dot matches &all",IDC_DOT_MATCH_ALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,96,65,10 + CONTROL "Dot &matches all",IDC_DOT_MATCH_ALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,96,65,10 CONTROL "&Don't wrap around",IDC_NOWRAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,125,37,75,10 CONTROL "C&lose after find",IDC_FINDCLOSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,125,49,65,10 CONTROL "Mark &Occurrences",IDC_ALL_OCCURRENCES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,125,61,73,10 @@ -699,7 +698,7 @@ BEGIN CONTROL "Match &beginning of word only",IDC_FINDSTART,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,90,110,10 CONTROL "&Transform backslashes",IDC_FINDTRANSFORMBS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,102,89,10 CONTROL "Regular &expression search",IDC_FINDREGEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,114,97,10 - CONTROL "Dot matches &all",IDC_DOT_MATCH_ALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,125,65,10 + CONTROL "Dot &matches all",IDC_DOT_MATCH_ALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,125,65,10 CONTROL "&Don't wrap around",IDC_NOWRAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,125,66,75,10 CONTROL "C&lose after replace",IDC_FINDCLOSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,125,78,77,10 CONTROL "Mark &Occurrences",IDC_ALL_OCCURRENCES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,125,90,73,10 @@ -1167,11 +1166,11 @@ GUIDELINES DESIGNINFO BEGIN IDD_ABOUT, DIALOG BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 245 - VERTGUIDE, 45 + LEFTMARGIN, 4 + VERTGUIDE, 19 + VERTGUIDE, 340 TOPMARGIN, 7 - BOTTOMMARGIN, 218 + BOTTOMMARGIN, 270 END IDD_FIND, DIALOG diff --git a/src/Notepad3.vcxproj b/src/Notepad3.vcxproj index 54fe39b6f..72f78cdba 100644 --- a/src/Notepad3.vcxproj +++ b/src/Notepad3.vcxproj @@ -110,6 +110,7 @@ StreamingSIMDExtensions2 Fast stdcpp17 + false msimg32.lib;comctl32.lib;imm32.lib;shlwapi.lib;scintilla.lib;%(AdditionalDependencies) @@ -163,6 +164,7 @@ true Fast stdcpp17 + false msimg32.lib;comctl32.lib;imm32.lib;shlwapi.lib;scintilla.lib;%(AdditionalDependencies) @@ -215,6 +217,7 @@ stdcpp17 Size true + false msimg32.lib;comctl32.lib;imm32.lib;shlwapi.lib;scintilla.lib;%(AdditionalDependencies) @@ -269,6 +272,7 @@ stdcpp17 Size true + false msimg32.lib;comctl32.lib;imm32.lib;shlwapi.lib;scintilla.lib;%(AdditionalDependencies) @@ -369,6 +373,8 @@ + + diff --git a/src/Notepad3.vcxproj.filters b/src/Notepad3.vcxproj.filters index ccc41378c..a70098f45 100644 --- a/src/Notepad3.vcxproj.filters +++ b/src/Notepad3.vcxproj.filters @@ -150,6 +150,12 @@ Resource Files + + Resource Files + + + Resource Files + diff --git a/src/Notepad3.ver b/src/Notepad3.ver index 7dcebb5d3..c10ee4639 100644 --- a/src/Notepad3.ver +++ b/src/Notepad3.ver @@ -37,15 +37,15 @@ BEGIN BEGIN BLOCK "040904b0" BEGIN - VALUE "Comments", MY_APPNAME - VALUE "FileDescription", MY_APPNAME - VALUE "InternalName", MY_APPNAME - VALUE "ProductName", MY_APPNAME + VALUE "Comments", APPNAMEA + VALUE "FileDescription", APPNAMEA + VALUE "InternalName", APPNAMEA + VALUE "ProductName", APPNAMEA VALUE "CompanyName", VERSION_COMPANYNAME VALUE "FileVersion", VERSION_FILEVERSION VALUE "ProductVersion", VERSION_FILEVERSION VALUE "LegalCopyright", VERSION_LEGALCOPYRIGHT - VALUE "OriginalFilename", "Notepad3.exe" + VALUE "OriginalFilename", APPNAMEA ".exe" END END BLOCK "VarFileInfo" diff --git a/src/Version.h b/src/Version.h index ca33c6d1b..f4303a44e 100644 Binary files a/src/Version.h and b/src/Version.h differ diff --git a/src/VersionEx.h b/src/VersionEx.h index 8e7154a31..ef0a7542b 100644 --- a/src/VersionEx.h +++ b/src/VersionEx.h @@ -5,7 +5,9 @@ // ////////////////////////////////////////////////////////// #define VERSION_MAJOR 3 #define VERSION_MINOR 18 -#define VERSION_REV 222 -#define VERSION_BUILD 905 +#define VERSION_REV 227 +#define VERSION_BUILD 911 #define SCINTILLA_VER 403 #define ONIGMO_REGEX_VER 6.1.3 +#define VERSION_BETA L" beta " +#define VERSIONA_BETA " beta " diff --git a/src/resource.h b/src/resource.h index 9ae45d802..60ad0f250 100644 --- a/src/resource.h +++ b/src/resource.h @@ -88,7 +88,6 @@ #define IDD_ADDTOFAV 182 #define IDC_FINDCLOSE 183 #define IDC_EMAIL3 184 -#define IDC_VERSION2 185 #define IDD_FILEMRU 186 #define IDC_FINDPREV 187 #define IDD_CHANGENOTIFY 188 @@ -130,7 +129,7 @@ #define IDC_WILDCARDHELP 225 #define IDC_WILDCARDSEARCH 226 #define IDC_SCI_VERSION 227 -#define IDR_MAINWND2 228 +#define IDR_MAINWNDTB 228 #define IDC_REMOVE 229 #define IDC_SWAPSTRG 230 #define IDC_CHECK_OCC 231 @@ -147,7 +146,6 @@ #define IDACC_SELTOPREV 311 #define IDC_NFOASOEM 400 #define IDC_COMPILER 401 -#define IDC_COMPILER2 402 #define IDD_READPW 501 #define IDC_CHECK1 502 #define IDC_EDIT1 503 @@ -163,6 +161,12 @@ #define IDM_HELP_UPDATEINSTALLER 513 #define IDM_HELP_UPDATEWEBSITE 514 #define IDS_FR_STATUS_TEXT 515 +#define IDR_MAINWNDTB2 550 +#define IDR_MAINWND128 551 +#define IDC_RICHEDITABOUT 552 +#define IDC_COPYVERSTRG 553 +#define IDR_RIZBITMAP 554 +#define IDC_RIZONEBMP 555 #define IDS_APPTITLE 10000 #define IDS_APPTITLE_ELEVATED 10001 #define IDS_APPTITLE_PASTEBOARD 10002