// This file is part of Notepad++ project // Copyright (C)2021 Don HO // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // at your option any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "GoToLineDlg.h" intptr_t CALLBACK GoToLineDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM) { switch (message) { case WM_INITDIALOG : { NppDarkMode::autoSubclassAndThemeChildControls(_hSelf); setChecked(IDC_RADIO_GOTOLINE); goToCenter(SWP_SHOWWINDOW | SWP_NOSIZE); return TRUE; } case WM_CTLCOLOREDIT: { return NppDarkMode::onCtlColorSofter(reinterpret_cast(wParam)); } case WM_CTLCOLORDLG: case WM_CTLCOLORSTATIC: { return NppDarkMode::onCtlColorDarker(reinterpret_cast(wParam)); } case WM_PRINTCLIENT: { if (NppDarkMode::isEnabled()) { return TRUE; } break; } case WM_ERASEBKGND: { if (NppDarkMode::isEnabled()) { RECT rc{}; getClientRect(rc); ::FillRect(reinterpret_cast(wParam), &rc, NppDarkMode::getDarkerBackgroundBrush()); return TRUE; } break; } case NPPM_INTERNAL_REFRESHDARKMODE: { NppDarkMode::autoThemeChildControls(_hSelf); return TRUE; } case WM_COMMAND: { switch (wParam) { case IDCANCEL : // Close display(false); return TRUE; case IDOK : { long long line = getLine(); if (line != -1) { display(false); if (_mode == go2line) { (*_ppEditView)->execute(SCI_ENSUREVISIBLE, static_cast(line - 1)); (*_ppEditView)->execute(SCI_GOTOLINE, static_cast(line - 1)); } else { size_t posToGoto = 0; if (line > 0) { // make sure not jumping into the middle of a multibyte character // or into the middle of a CR/LF pair for Windows files auto before = (*_ppEditView)->execute(SCI_POSITIONBEFORE, static_cast(line)); posToGoto = (*_ppEditView)->execute(SCI_POSITIONAFTER, before); } auto sci_line = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, posToGoto); (*_ppEditView)->execute(SCI_ENSUREVISIBLE, sci_line); (*_ppEditView)->execute(SCI_GOTOPOS, posToGoto); } } SCNotification notification{}; notification.nmhdr.code = SCN_PAINTED; notification.nmhdr.hwndFrom = _hSelf; notification.nmhdr.idFrom = ::GetDlgCtrlID(_hSelf); ::SendMessage(_hParent, WM_NOTIFY, LINKTRIGGERED, reinterpret_cast(¬ification)); (*_ppEditView)->getFocus(); return TRUE; } case IDC_RADIO_GOTOLINE: case IDC_RADIO_GOTOOFFSET: { if (wParam == IDC_RADIO_GOTOLINE) { _mode = go2line; } else { _mode = go2offsset; } updateLinesNumbers(); return TRUE; } default: { break; } } } default : return FALSE; } return FALSE; } void GoToLineDlg::updateLinesNumbers() const { size_t current = 0; size_t limit = 0; if (_mode == go2line) { current = (*_ppEditView)->getCurrentLineNumber() + 1; limit = (*_ppEditView)->execute(SCI_GETLINECOUNT); } else { current = (*_ppEditView)->execute(SCI_GETCURRENTPOS); size_t currentDocLength = (*_ppEditView)->getCurrentDocLen(); limit = (currentDocLength > 0 ? currentDocLength - 1 : 0); } ::SetDlgItemTextA(_hSelf, ID_CURRLINE, std::to_string(current).c_str()); ::SetDlgItemTextA(_hSelf, ID_LASTLINE, std::to_string(limit).c_str()); }