From 7e66078bed5448af27386521fcf09d89431ddbe3 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Sat, 8 Jun 2013 23:17:59 +0000 Subject: [PATCH] [NEW_FEATURE] (Author: Andreas Jonsson) Delimiter select by ctrl + Double click. git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@1055 f5eea248-9336-0410-98b8-ebc06183d4e3 --- PowerEditor/src/NppNotification.cpp | 79 ++++++++++++++++++++++++++++- PowerEditor/src/Parameters.cpp | 37 ++++++++++++++ PowerEditor/src/Parameters.h | 5 +- 3 files changed, 119 insertions(+), 2 deletions(-) diff --git a/PowerEditor/src/NppNotification.cpp b/PowerEditor/src/NppNotification.cpp index d08af4d1..092c9ed6 100644 --- a/PowerEditor/src/NppNotification.cpp +++ b/PowerEditor/src/NppNotification.cpp @@ -433,7 +433,84 @@ BOOL Notepad_plus::notify(SCNotification *notification) case SCN_DOUBLECLICK : { - if (_isHotspotDblClicked) + if(notification->modifiers == SCMOD_CTRL) + { + const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI(); + + char *buf; + int length; + int position_of_click; + if(nppGUI._delimiterSelectionOnEntireDocument) + { + // Get entire document. + length = notifyView->execute(SCI_GETLENGTH); + buf = new char[length + 1]; + notifyView->execute(SCI_GETTEXT, (LPARAM)(length + 1), (WPARAM)buf); + + position_of_click = notification->position; + } + else + { + // Get single line. + length = notifyView->execute(SCI_GETCURLINE); + buf = new char[length + 1]; + notifyView->execute(SCI_GETCURLINE, (WPARAM)length, (LPARAM)buf); + + // Compute the position of the click (relative to the beginning of the line). + const int line_position = notifyView->execute(SCI_POSITIONFROMLINE, notifyView->getCurrentLineNumber()); + position_of_click = notification->position - line_position; + } + + // Scan for the left delimiter. + int leftmost_position = -1; + for(int i = position_of_click; i >= 0; --i) + { + if(buf[i] == nppGUI._leftmostDelimiter) + { + leftmost_position = i; + break; + } + } + + if(leftmost_position == -1) + { + delete [] buf; + break; + } + + // Scan for right delimiter. + int rightmost_position = -1; + for(int i = position_of_click; i <= length; ++i) + { + if(buf[i] == nppGUI._rightmostDelimiter) + { + rightmost_position = i; + break; + } + } + + if(rightmost_position == -1) + { + delete [] buf; + break; + } + + // Set selection to the position we found. + if(nppGUI._delimiterSelectionOnEntireDocument) + { + notifyView->execute(SCI_SETCURRENTPOS, rightmost_position); + notifyView->execute(SCI_SETANCHOR, leftmost_position + 1); + } + else + { + const int line_position = notifyView->execute(SCI_POSITIONFROMLINE, notifyView->getCurrentLineNumber()); + notifyView->execute(SCI_SETCURRENTPOS, line_position + rightmost_position); + notifyView->execute(SCI_SETANCHOR, line_position + leftmost_position + 1); + } + + delete [] buf; + } + else if (_isHotspotDblClicked) { int pos = notifyView->execute(SCI_GETCURRENTPOS); notifyView->execute(SCI_SETCURRENTPOS, pos); diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index 9718f496..de818d1a 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -3882,6 +3882,24 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) if (themePath != NULL && themePath[0]) _nppGUI._themeName.assign(themePath); } + else if (!lstrcmp(nm, TEXT("delimiterSelection"))) + { + int leftmost = 0; + element->Attribute(TEXT("leftmostDelimiter"), &leftmost); + if(leftmost > 0 && leftmost < 256) + _nppGUI._leftmostDelimiter = (char)leftmost; + + int rightmost = 0; + element->Attribute(TEXT("rightmostDelimiter"), &rightmost); + if(rightmost > 0 && rightmost < 256) + _nppGUI._rightmostDelimiter = (char)rightmost; + + const TCHAR *delimiterSelectionOnEntireDocument = element->Attribute(TEXT("delimiterSelectionOnEntireDocument")); + if(delimiterSelectionOnEntireDocument != NULL && !lstrcmp(delimiterSelectionOnEntireDocument, TEXT("yes"))) + _nppGUI._delimiterSelectionOnEntireDocument = true; + else + _nppGUI._delimiterSelectionOnEntireDocument = false; + } } } @@ -4216,6 +4234,7 @@ bool NppParameters::writeGUIParams() bool openSaveDirExist = false; bool titleBarExist = false; bool stylerThemeExist = false; + bool delimiterSelectionExist = false; TiXmlNode *dockingParamNode = NULL; @@ -4580,6 +4599,16 @@ bool NppParameters::writeGUIParams() stylerThemeExist = true; element->SetAttribute(TEXT("path"), _nppGUI._themeName.c_str()); } + else if (!lstrcmp(nm, TEXT("delimiterSelection"))) + { + element->SetAttribute(TEXT("leftmostDelimiter"), (int)_nppGUI._leftmostDelimiter); + element->SetAttribute(TEXT("rightmostDelimiter"), (int)_nppGUI._rightmostDelimiter); + if(_nppGUI._delimiterSelectionOnEntireDocument) + element->SetAttribute(TEXT("delimiterSelectionOnEntireDocument"), TEXT("yes")); + else + element->SetAttribute(TEXT("delimiterSelectionOnEntireDocument"), TEXT("no")); + delimiterSelectionExist = true; + } } if (!noUpdateExist) @@ -4779,6 +4808,14 @@ bool NppParameters::writeGUIParams() GUIConfigElement->SetAttribute(TEXT("name"), TEXT("stylerTheme")); GUIConfigElement->SetAttribute(TEXT("path"), _nppGUI._themeName.c_str()); } + if (!delimiterSelectionExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("delimiterSelection")); + GUIConfigElement->SetAttribute(TEXT("leftmostDelimiter"), _nppGUI._leftmostDelimiter); + GUIConfigElement->SetAttribute(TEXT("rightmostDelimiter"), _nppGUI._rightmostDelimiter); + GUIConfigElement->SetAttribute(TEXT("delimiterSelectionOnEntireDocument"), _nppGUI._delimiterSelectionOnEntireDocument); + } insertDockingParamNode(GUIRoot); return true; diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index 40a4ace2..5a33180b 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -682,7 +682,7 @@ struct NppGUI _doTaskList(true), _maitainIndent(true), _openSaveDir(dir_followCurrent), _styleMRU(true), _styleURL(0),\ _autocStatus(autoc_none), _autocFromLen(1), _funcParams(false), _definedSessionExt(TEXT("")),\ _doesExistUpdater(false), _caretBlinkRate(250), _caretWidth(1), _enableMultiSelection(false), _shortTitlebar(false), _themeName(TEXT("")), _isLangMenuCompact(false), - _smartHiliteCaseSensitive(false) { + _smartHiliteCaseSensitive(false), _leftmostDelimiter('('), _rightmostDelimiter(')'), _delimiterSelectionOnEntireDocument(false) { _appPos.left = 0; _appPos.top = 0; _appPos.right = 700; @@ -730,6 +730,9 @@ struct NppGUI bool _enableTagAttrsHilite; bool _enableHiliteNonHTMLZone; bool _styleMRU; + char _leftmostDelimiter, _rightmostDelimiter; + bool _delimiterSelectionOnEntireDocument; + // 0 : do nothing // 1 : don't draw underline