From da8fdbb86a3d60f3a26f29125c1317e14eefab5c Mon Sep 17 00:00:00 2001 From: Don Ho Date: Sun, 4 Mar 2012 18:04:36 +0000 Subject: [PATCH] [NEW_FEATURE] Doc map: Processing text wrapping situation (in progress). git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@874 f5eea248-9336-0410-98b8-ebc06183d4e3 --- PowerEditor/src/Notepad_plus.cpp | 28 ++++- PowerEditor/src/NppCommands.cpp | 18 +-- .../WinControls/DocumentMap/documentMap.cpp | 114 ++++++++++++++++-- .../src/WinControls/DocumentMap/documentMap.h | 9 ++ PowerEditor/visual.net/notepadPlus.vcproj | 2 +- 5 files changed, 149 insertions(+), 22 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index edf186d4..c38639e8 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -2777,6 +2777,7 @@ int Notepad_plus::switchEditViewTo(int gid) } if (!viewVisible(gid)) return currentView(); //cannot activate invisible view + int oldView = currentView(); int newView = otherView(); @@ -2792,6 +2793,11 @@ int Notepad_plus::switchEditViewTo(int gid) _pEditView->beSwitched(); _pEditView->getFocus(); //set the focus + if (_pDocMap) + { + _pDocMap->initWrapMap(); + } + notifyBufferActivated(_pEditView->getCurrentBufferID(), currentView()); return oldView; } @@ -2941,7 +2947,6 @@ void Notepad_plus::docGotoAnotherEditView(FileTransferMode mode) bool Notepad_plus::activateBuffer(BufferID id, int whichOne) { //scnN.nmhdr.code = NPPN_DOCSWITCHINGOFF; //superseeded by NPPN_BUFFERACTIVATED - Buffer * pBuf = MainFileManager->getBufferByID(id); bool reload = pBuf->getNeedReload(); if (reload) @@ -2968,6 +2973,7 @@ bool Notepad_plus::activateBuffer(BufferID id, int whichOne) { performPostReload(whichOne); } + notifyBufferActivated(id, whichOne); //scnN.nmhdr.code = NPPN_DOCSWITCHINGIN; //superseeded by NPPN_BUFFERACTIVATED @@ -4763,10 +4769,15 @@ void Notepad_plus::launchProjectPanel(int cmdID, ProjectPanel ** pProjPanel, int void Notepad_plus::launchDocMap() { + if (!(NppParameters::getInstance())->isTransparentAvailable()) + { + ::MessageBox(NULL, TEXT("It seems you still use a prehistoric system, This feature works only on a modern system, sorry."), TEXT(""), MB_OK); + return; + } + if (!_pDocMap) { _pDocMap = new DocumentMap(); - _pDocMap->init(_pPublicInterface->getHinst(), _pPublicInterface->getHSelf(), &_pEditView); tTbData data = {0}; @@ -4783,7 +4794,20 @@ void Notepad_plus::launchDocMap() // In the case of Notepad++ internal function, it'll be the command ID which triggers this dialog data.dlgID = IDM_VIEW_DOC_MAP; ::SendMessage(_pPublicInterface->getHSelf(), NPPM_DMMREGASDCKDLG, 0, (LPARAM)&data); + + _pDocMap->setMainEditorWrap(_pEditView->isWrap()); } + else + { + // Disable wrap text + if (!_pDocMap->isVisible()) + { + _pDocMap->setMainEditorWrap(_pEditView->isWrap()); + } + } + //_mainEditView.wrap(false); + //_subEditView.wrap(false); + _pDocMap->display(); } diff --git a/PowerEditor/src/NppCommands.cpp b/PowerEditor/src/NppCommands.cpp index c2412857..300d963f 100644 --- a/PowerEditor/src/NppCommands.cpp +++ b/PowerEditor/src/NppCommands.cpp @@ -22,6 +22,7 @@ #include "TaskListDlg.h" #include "clipboardFormats.h" #include "VerticalFileSwitcher.h" +#include "documentMap.h" void Notepad_plus::macroPlayback(Macro macro) { @@ -1147,14 +1148,17 @@ void Notepad_plus::command(int id) case IDM_VIEW_WRAP: { - bool isWraped = !_pEditView->isWrap(); - _mainEditView.wrap(isWraped); - _subEditView.wrap(isWraped); - _toolBar.setCheck(IDM_VIEW_WRAP, isWraped); - checkMenuItem(IDM_VIEW_WRAP, isWraped); + //if (_pDocMap && !_pDocMap->isVisible()) + { + bool isWraped = !_pEditView->isWrap(); + _mainEditView.wrap(isWraped); + _subEditView.wrap(isWraped); + _toolBar.setCheck(IDM_VIEW_WRAP, isWraped); + checkMenuItem(IDM_VIEW_WRAP, isWraped); - ScintillaViewParams & svp1 = (ScintillaViewParams &)(NppParameters::getInstance())->getSVP(); - svp1._doWrap = isWraped; + ScintillaViewParams & svp1 = (ScintillaViewParams &)(NppParameters::getInstance())->getSVP(); + svp1._doWrap = isWraped; + } break; } case IDM_VIEW_WRAP_SYMBOL: diff --git a/PowerEditor/src/WinControls/DocumentMap/documentMap.cpp b/PowerEditor/src/WinControls/DocumentMap/documentMap.cpp index 8defa479..87c07f6c 100644 --- a/PowerEditor/src/WinControls/DocumentMap/documentMap.cpp +++ b/PowerEditor/src/WinControls/DocumentMap/documentMap.cpp @@ -38,11 +38,111 @@ void DocumentMap::reloadMap() // folding _pScintillaEditView->syncFoldStateWith((*_ppEditView)->getCurrentFoldStates()); + // Wrapping + //wrapMap(); + scrollMap(); } } +void DocumentMap::initWrapMap() +{ + if (_pScintillaEditView && _ppEditView) + { + RECT rect; + getClientRect(rect); + ::MoveWindow(_pScintillaEditView->getHSelf(), 0, 0, rect.right - rect.left, rect.bottom-rect.top, TRUE); + _pScintillaEditView->wrap(false); + _pScintillaEditView->redraw(true); + } +} + +void DocumentMap::wrapMap() +{ + RECT rect; + getClientRect(rect); + //::MoveWindow(_pScintillaEditView->getHSelf(), 0, 0, rect.right - rect.left, rect.bottom-rect.top, TRUE); + //_pScintillaEditView->wrap(false); + + //_pScintillaEditView->redraw(); + + if ((*_ppEditView)->isWrap()) + { + // get model line N from current document + /* + for each docline + nbline = SCI_WRAPCOUNT(int docLine) + if (nbline == 1) + if maxNbChar < nbChar(docline) + pLine = docLine + maxChar = nbChar(docline) + + return pLine + */ + int maxChar = 0; + int nbWrappedDocLine = 0; + int pLine = -1; + int nbDocLine = (*_ppEditView)->execute(SCI_GETLINECOUNT); + for (int i = 0; i < nbDocLine; i++) + { + int nbWrapLine = (*_ppEditView)->execute(SCI_WRAPCOUNT, i); + if (nbWrapLine == 1) + { + int charCount = (*_ppEditView)->execute(SCI_LINELENGTH, i); + if (charCount > maxChar) + { + maxChar = charCount; + pLine = i; + } + } + else + { + nbWrappedDocLine++; + } + } + if (pLine == -1 || !nbWrappedDocLine) + return; + + + // get Xlength1 (Xend - Xbegin) from current document line N + int posBegin = (*_ppEditView)->execute(SCI_POSITIONFROMLINE, pLine); + int posEnd = (*_ppEditView)->execute(SCI_GETLINEENDPOSITION, pLine); + + int xBegin = (*_ppEditView)->execute(SCI_POINTXFROMPOSITION, 0, posBegin); + int xEnd = (*_ppEditView)->execute(SCI_POINTXFROMPOSITION, 0, posEnd); + + int Xlength1 = xEnd - xBegin; + + // get Xlength2 (Xend - Xbegin) from map line N + int xBegin2 = _pScintillaEditView->execute(SCI_POINTXFROMPOSITION, 0, posBegin); + int xEnd2 = _pScintillaEditView->execute(SCI_POINTXFROMPOSITION, 0, posEnd); + + int Xlength2 = xEnd2 - xBegin2; + + // get current scintilla width W1 + RECT editorRect; + (*_ppEditView)->getClientRect(editorRect); + + int marginWidths = 0; + for (int m = 0; m < 4; m++) + { + marginWidths += (*_ppEditView)->execute(SCI_GETMARGINWIDTHN, m); + } + int w1 = editorRect.right - editorRect.left - marginWidths; + + // resize map width W2 according W1, Xlength1 and Xlength2 + int w2 = (w1 * Xlength2)/Xlength1; + + ::MoveWindow(_pScintillaEditView->getHSelf(), 0, 0, w2, rect.bottom-rect.top, TRUE); + _pScintillaEditView->wrap(true); + + // sync wrapping indent mode + _pScintillaEditView->execute(SCI_SETWRAPINDENTMODE, (*_ppEditView)->execute(SCI_GETWRAPINDENTMODE)); + } +} + + void DocumentMap::scrollMap() { if (_pScintillaEditView && _ppEditView) @@ -188,6 +288,7 @@ BOOL CALLBACK DocumentMap::run_dlgProc(UINT message, WPARAM wParam, LPARAM lPara { int width = LOWORD(lParam); int height = HIWORD(lParam); + /* if (_pScintillaEditView->isWrap()) { int mapStringWidth = _pScintillaEditView->execute(SCI_TEXTWIDTH, 0, (LPARAM)"aiueolW"); @@ -200,7 +301,7 @@ BOOL CALLBACK DocumentMap::run_dlgProc(UINT message, WPARAM wParam, LPARAM lPara { ::MoveWindow(_pScintillaEditView->getHSelf(), 0, 0, width , height, TRUE); } - + */ if (_vzDlg.isCreated()) { POINT pt = {0,0}; @@ -302,17 +403,6 @@ BOOL CALLBACK DocumentMap::run_dlgProc(UINT message, WPARAM wParam, LPARAM lPara (*_ppEditView)->execute(SCI_GOTOLINE, (*_ppEditView)->execute(SCI_DOCLINEFROMVISIBLE, lastVisibleDisplayLine)); } scrollMap(); - -/* - int newHigher = newPosY - (currentHeight / 2); - int newLower = newPosY + (currentHeight / 2); - - if (newHigher < 0) - { - newHigher = 0; - newLower = currentHeight; - } -*/ } return TRUE; diff --git a/PowerEditor/src/WinControls/DocumentMap/documentMap.h b/PowerEditor/src/WinControls/DocumentMap/documentMap.h index 784ff756..ee344244 100644 --- a/PowerEditor/src/WinControls/DocumentMap/documentMap.h +++ b/PowerEditor/src/WinControls/DocumentMap/documentMap.h @@ -102,10 +102,18 @@ public: //void wrapScintilla(bool doWrap); void reloadMap(); + void wrapMap(); + void initWrapMap(); void scrollMap(); void scrollMap(bool direction, moveMode whichMode); void doMove(); void fold(int line, bool foldOrNot); + void setMainEditorWrap(bool isWrap) { + _isMainEditorWrap = isWrap; + }; + bool isMainEditorWrap() const { + return _isMainEditorWrap; + }; protected: virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); @@ -115,6 +123,7 @@ private: ScintillaEditView *_pScintillaEditView; //HWND _glassHandle; ViewZoneDlg _vzDlg; + bool _isMainEditorWrap; }; diff --git a/PowerEditor/visual.net/notepadPlus.vcproj b/PowerEditor/visual.net/notepadPlus.vcproj index 0a78b495..28d48c31 100644 --- a/PowerEditor/visual.net/notepadPlus.vcproj +++ b/PowerEditor/visual.net/notepadPlus.vcproj @@ -325,7 +325,7 @@ FavorSizeOrSpeed="1" OmitFramePointers="false" WholeProgramOptimization="false" - AdditionalIncludeDirectories="..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\Win32Explr;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip;..\src\MISC\Exception;..\src\MISC\Common;..\src\tinyxml\tinyXmlA;..\src\WinControls\AnsiCharPanel;..\src\WinControls\FindCharsInRange;..\src\WinControls\ClipboardHistory;..\src\WinControls\VerticalFileSwitcher;..\src\WinControls\ProjectPanel" + AdditionalIncludeDirectories="..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\Win32Explr;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip;..\src\MISC\Exception;..\src\MISC\Common;..\src\tinyxml\tinyXmlA;..\src\WinControls\AnsiCharPanel;..\src\WinControls\FindCharsInRange;..\src\WinControls\ClipboardHistory;..\src\WinControls\VerticalFileSwitcher;..\src\WinControls\ProjectPanel;..\src\WinControls\DocumentMap" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USE_64BIT_TIME_T;TIXML_USE_STL;TIXMLA_USE_STL;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS=1" StringPooling="true" ExceptionHandling="2"