[NEW_FEATURE] Make column editor work in multi-selection mode.

[BUG_FIXED] Fix column editor inserting octal number broken issue.

git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@537 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
Don Ho 2009-09-13 19:31:40 +00:00
parent 2b9ddf1816
commit 6a022cdb9a
6 changed files with 37 additions and 223 deletions

View File

@ -40,6 +40,7 @@
#define generic_fopen _wfopen #define generic_fopen _wfopen
#define generic_fgets fgetws #define generic_fgets fgetws
#define generic_stat _wstat #define generic_stat _wstat
#define generic_sprintf swprintf
#define COPYDATA_FILENAMES COPYDATA_FILENAMESW #define COPYDATA_FILENAMES COPYDATA_FILENAMESW
#else #else
#define NppMainEntry WinMain #define NppMainEntry WinMain
@ -60,6 +61,7 @@
#define generic_fopen fopen #define generic_fopen fopen
#define generic_fgets fgets #define generic_fgets fgets
#define generic_stat _stat #define generic_stat _stat
#define generic_sprintf sprintf
#define COPYDATA_FILENAMES COPYDATA_FILENAMESA #define COPYDATA_FILENAMES COPYDATA_FILENAMESA
#endif #endif

View File

@ -2299,8 +2299,10 @@ TCHAR * int2str(TCHAR *str, int strLen, int number, int base, int nbChiffre, boo
} }
else else
{ {
wsprintf(f, TEXT("%%%s"), fStr); // use sprintf or swprintf instead of wsprintf
wsprintf(str, f, number); // to make octal format work
generic_sprintf(f, TEXT("%%%s"), fStr);
generic_sprintf(str, f, number);
} }
int i = lstrlen(str); int i = lstrlen(str);
for ( ; i < nbChiffre ; i++) for ( ; i < nbChiffre ; i++)
@ -2311,8 +2313,10 @@ TCHAR * int2str(TCHAR *str, int strLen, int number, int base, int nbChiffre, boo
{ {
if (base != 2) if (base != 2)
{ {
wsprintf(f, TEXT("%%.%d%s"), nbChiffre, fStr); // use sprintf or swprintf instead of wsprintf
wsprintf(str, f, number); // to make octal format work
generic_sprintf(f, TEXT("%%.%d%s"), nbChiffre, fStr);
generic_sprintf(str, f, number);
} }
// else already done. // else already done.
} }

View File

@ -154,11 +154,24 @@ struct ColumnModeInfo {
bool isValid() const { bool isValid() const {
return (_order >= 0 && _selLpos >= 0 && _selRpos >= 0 && _selLpos <= _selRpos); return (_order >= 0 && _selLpos >= 0 && _selRpos >= 0 && _selLpos <= _selRpos);
}; };
/*
bool hasVirtualSpace() const {
return (_nbVirtualCaretSpc >= 0 && _nbVirtualAnchorSpc >= 0);
}; };
*/
//
// SortClass for vector<ColumnModeInfo>
// sort in _order : increased order
struct SortInSelectOrder {
bool operator() (ColumnModeInfo & l, ColumnModeInfo & r) {
return (l._order < r._order);
}
};
//
// SortClass for vector<ColumnModeInfo>
// sort in _selLpos : increased order
struct SortInPositionOrder {
bool operator() (ColumnModeInfo & l, ColumnModeInfo & r) {
return (l._selLpos < r._selLpos);
}
}; };
typedef vector<ColumnModeInfo> ColumnModeInfos; typedef vector<ColumnModeInfo> ColumnModeInfos;

View File

@ -20,214 +20,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "columnEditor.h" #include "columnEditor.h"
#include "ScintillaEditView.h" #include "ScintillaEditView.h"
/*
BOOL CALLBACK ColumnEditorDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM)
{
switch (message)
{
case WM_INITDIALOG :
{
switchTo(activeText);
::SendDlgItemMessage(_hSelf, IDC_COL_DEC_RADIO, BM_SETCHECK, TRUE, 0);
goToCenter();
NppParameters *pNppParam = NppParameters::getInstance();
ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture();
if (enableDlgTheme)
{
enableDlgTheme(_hSelf, ETDT_ENABLETAB);
redraw();
}
return TRUE;
}
case WM_COMMAND :
{
switch (wParam)
{
case IDCANCEL : // Close
display(false);
return TRUE;
case IDOK :
{
(*_ppEditView)->execute(SCI_BEGINUNDOACTION);
const int stringSize = 1024;
TCHAR str[stringSize];
bool isTextMode = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_COL_TEXT_RADIO, BM_GETCHECK, 0, 0));
if (isTextMode)
{
::SendDlgItemMessage(_hSelf, IDC_COL_TEXT_EDIT, WM_GETTEXT, stringSize, (LPARAM)str);
display(false);
if ((*_ppEditView)->execute(SCI_SELECTIONISRECTANGLE))
{
ColumnModeInfos colInfos = (*_ppEditView)->getColumnModeSelectInfo();
(*_ppEditView)->columnReplace(colInfos, str);
(*_ppEditView)->execute(SCI_SETCURRENTPOS,colInfos[colInfos.size()-1]._selRpos);
}
else
{
int cursorPos = (*_ppEditView)->execute(SCI_GETCURRENTPOS);
int cursorCol = (*_ppEditView)->execute(SCI_GETCOLUMN, cursorPos);
int cursorLine = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, cursorPos);
int endPos = (*_ppEditView)->execute(SCI_GETLENGTH);
int endLine = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, endPos);
int lineAllocatedLen = 1024;
TCHAR *line = new TCHAR[lineAllocatedLen];
for (int i = cursorLine ; i <= endLine ; i++)
{
int lineBegin = (*_ppEditView)->execute(SCI_POSITIONFROMLINE, i);
int lineEnd = (*_ppEditView)->execute(SCI_GETLINEENDPOSITION, i);
int lineEndCol = (*_ppEditView)->execute(SCI_GETCOLUMN, lineEnd);
int lineLen = lineEnd - lineBegin + 1;
if (lineLen > lineAllocatedLen)
{
delete [] line;
line = new TCHAR[lineLen];
}
(*_ppEditView)->getGenericText(line, lineBegin, lineEnd);
generic_string s2r(line);
if (lineEndCol < cursorCol)
{
generic_string s_space(cursorCol - lineEndCol, ' ');
s2r.append(s_space);
s2r.append(str);
}
else
{
int posAbs2Start = (*_ppEditView)->execute(SCI_FINDCOLUMN, i, cursorCol);
int posRelative2Start = posAbs2Start - lineBegin;
s2r.insert(posRelative2Start, str);
}
(*_ppEditView)->replaceTarget(s2r.c_str(), lineBegin, lineEnd);
}
delete [] line;
}
}
else
{
int initialNumber = ::GetDlgItemInt(_hSelf, IDC_COL_INITNUM_EDIT, NULL, TRUE);
int increaseNumber = ::GetDlgItemInt(_hSelf, IDC_COL_INCREASENUM_EDIT, NULL, TRUE);
UCHAR format = getFormat();
display(false);
if ((*_ppEditView)->execute(SCI_SELECTIONISRECTANGLE))
{
ColumnModeInfos colInfos = (*_ppEditView)->getColumnModeSelectInfo();
(*_ppEditView)->columnReplace(colInfos, initialNumber, increaseNumber, format);
(*_ppEditView)->execute(SCI_SETCURRENTPOS,colInfos[colInfos.size()-1]._selRpos);
}
else
{
int cursorPos = (*_ppEditView)->execute(SCI_GETCURRENTPOS);
int cursorCol = (*_ppEditView)->execute(SCI_GETCOLUMN, cursorPos);
int cursorLine = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, cursorPos);
int endPos = (*_ppEditView)->execute(SCI_GETLENGTH);
int endLine = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, endPos);
int lineAllocatedLen = 1024;
TCHAR *line = new TCHAR[lineAllocatedLen];
UCHAR f = format & MASK_FORMAT;
bool isZeroLeading = (MASK_ZERO_LEADING & format) != 0;
int base = 10;
if (f == BASE_16)
base = 16;
else if (f == BASE_08)
base = 8;
else if (f == BASE_02)
base = 2;
int nbLine = endLine - cursorLine + 1;
int endNumber = initialNumber + increaseNumber * (nbLine - 1);
int nbEnd = getNbDigits(endNumber, base);
int nbInit = getNbDigits(initialNumber, base);
int nb = max(nbInit, nbEnd);
for (int i = cursorLine ; i <= endLine ; i++)
{
int lineBegin = (*_ppEditView)->execute(SCI_POSITIONFROMLINE, i);
int lineEnd = (*_ppEditView)->execute(SCI_GETLINEENDPOSITION, i);
int lineEndCol = (*_ppEditView)->execute(SCI_GETCOLUMN, lineEnd);
int lineLen = lineEnd - lineBegin + 1;
if (lineLen > lineAllocatedLen)
{
delete [] line;
line = new TCHAR[lineLen];
}
(*_ppEditView)->getGenericText(line, lineBegin, lineEnd);
generic_string s2r(line);
//Calcule generic_string
int2str(str, stringSize, initialNumber, base, nb, isZeroLeading);
initialNumber += increaseNumber;
if (lineEndCol < cursorCol)
{
generic_string s_space(cursorCol - lineEndCol, ' ');
s2r.append(s_space);
s2r.append(str);
}
else
{
int posAbs2Start = (*_ppEditView)->execute(SCI_FINDCOLUMN, i, cursorCol);
int posRelative2Start = posAbs2Start - lineBegin;
s2r.insert(posRelative2Start, str);
}
(*_ppEditView)->replaceTarget(s2r.c_str(), lineBegin, lineEnd);
}
delete [] line;
}
}
(*_ppEditView)->execute(SCI_ENDUNDOACTION);
(*_ppEditView)->getFocus();
return TRUE;
}
case IDC_COL_TEXT_RADIO :
case IDC_COL_NUM_RADIO :
{
switchTo((wParam == IDC_COL_TEXT_RADIO)? activeText : activeNumeric);
return TRUE;
}
default :
{
switch (HIWORD(wParam))
{
case EN_SETFOCUS :
case BN_SETFOCUS :
//updateLinesNumbers();
return TRUE;
default :
return TRUE;
}
break;
}
}
}
default :
return FALSE;
}
//return FALSE;
}
*/
void ColumnEditorDlg::display(bool toShow) const void ColumnEditorDlg::display(bool toShow) const
{ {
@ -278,10 +70,12 @@ BOOL CALLBACK ColumnEditorDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM)
display(false); display(false);
if ((*_ppEditView)->execute(SCI_SELECTIONISRECTANGLE)) if ((*_ppEditView)->execute(SCI_SELECTIONISRECTANGLE) || (*_ppEditView)->execute(SCI_GETSELECTIONS) > 1)
{ {
ColumnModeInfos colInfos = (*_ppEditView)->getColumnModeSelectInfo(); ColumnModeInfos colInfos = (*_ppEditView)->getColumnModeSelectInfo();
std::sort(colInfos.begin(), colInfos.end(), SortInPositionOrder());
(*_ppEditView)->columnReplace(colInfos, str); (*_ppEditView)->columnReplace(colInfos, str);
std::sort(colInfos.begin(), colInfos.end(), SortInSelectOrder());
(*_ppEditView)->setMultiSelections(colInfos); (*_ppEditView)->setMultiSelections(colInfos);
} }
else else
@ -335,11 +129,12 @@ BOOL CALLBACK ColumnEditorDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM)
UCHAR format = getFormat(); UCHAR format = getFormat();
display(false); display(false);
if ((*_ppEditView)->execute(SCI_SELECTIONISRECTANGLE)) if ((*_ppEditView)->execute(SCI_SELECTIONISRECTANGLE) || (*_ppEditView)->execute(SCI_GETSELECTIONS) > 1)
{ {
ColumnModeInfos colInfos = (*_ppEditView)->getColumnModeSelectInfo(); ColumnModeInfos colInfos = (*_ppEditView)->getColumnModeSelectInfo();
std::sort(colInfos.begin(), colInfos.end(), SortInPositionOrder());
(*_ppEditView)->columnReplace(colInfos, initialNumber, increaseNumber, format); (*_ppEditView)->columnReplace(colInfos, initialNumber, increaseNumber, format);
//(*_ppEditView)->execute(SCI_SETCURRENTPOS,colInfos[colInfos.size()-1]._selRpos); std::sort(colInfos.begin(), colInfos.end(), SortInSelectOrder());
(*_ppEditView)->setMultiSelections(colInfos); (*_ppEditView)->setMultiSelections(colInfos);
} }
else else

View File

@ -24,7 +24,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
IDD_COLUMNEDIT DIALOGEX 26, 41, 223, 206 IDD_COLUMNEDIT DIALOGEX 26, 41, 223, 206
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE EXSTYLE WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE
CAPTION "Column Editor" CAPTION "Column / Multi-Selection Editor"
FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x0 FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x0
BEGIN BEGIN
GROUPBOX "Text to Insert",IDC_COL_TEXT_GRP_STATIC,12,10,124,54 GROUPBOX "Text to Insert",IDC_COL_TEXT_GRP_STATIC,12,10,124,54

View File

@ -91,8 +91,8 @@ BEGIN
CONTROL "",IDC_CARETBLINKRATE_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,161,29,67,13 CONTROL "",IDC_CARETBLINKRATE_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,161,29,67,13
LTEXT "S",IDC_CARETBLINKRATE_S_STATIC,230,29,12,8 LTEXT "S",IDC_CARETBLINKRATE_S_STATIC,230,29,12,8
LTEXT "F",IDC_CARETBLINKRATE_F_STATIC,149,29,12,8,0,WS_EX_RIGHT LTEXT "F",IDC_CARETBLINKRATE_F_STATIC,149,29,12,8,0,WS_EX_RIGHT
GROUPBOX "Multi-Editing Setting",IDC_MULTISELECTION_GB_STATIC,258,5,130,40,BS_CENTER GROUPBOX "Multi-Editing Setting",IDC_MULTISELECTION_GB_STATIC,258,5,140,40,BS_CENTER
CONTROL "Enable (Ctrl + Mouse click/selection)",IDC_CHECK_MULTISELECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,276,22,100,10 CONTROL "Enable (Ctrl+Mouse click/selection)",IDC_CHECK_MULTISELECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,266,22,130,10
END END