Skip to content

Commit 3be2b0f

Browse files
committed
0.10.0.56: Basic undo in editor, still with unresolved quirks, but enough to undo the latest addition or deletion from the text buffer. Will be revised in later releases.
1 parent cbe3381 commit 3be2b0f

5 files changed

Lines changed: 110 additions & 12 deletions

File tree

src/sqlite-ce-edit/editor.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,15 @@ static void UpdateContextMenu(int mode) {
164164
/* Detach reusable submenus from old menu so DestroyMenu won't kill them */
165165
if (hOldMenu) {
166166
RemoveMenu(hOldMenu, 0, MF_BYPOSITION); /* File */
167+
RemoveMenu(hOldMenu, 0, MF_BYPOSITION); /* Edit */
167168
RemoveMenu(hOldMenu, 0, MF_BYPOSITION); /* Context (Query/Results/Schema) */
168169
RemoveMenu(hOldMenu, 0, MF_BYPOSITION); /* View */
169170
}
170171

171172
/* Build a fresh menu bar */
172173
hNewMenu = CreateMenu();
173174
AppendMenuW(hNewMenu, MF_POPUP, (UINT)g_hFileMenu, L"&File");
175+
AppendMenuW(hNewMenu, MF_POPUP, (UINT)g_hEditMenu, L"&Edit");
174176

175177
/* Add only the active context menu */
176178
if (mode == 0) {
@@ -190,6 +192,9 @@ static void UpdateContextMenu(int mode) {
190192
CheckMenuRadioItem(g_hViewMenu, IDM_VIEWQUERY, IDM_VIEWSCHEMA,
191193
mode == 0 ? IDM_VIEWQUERY : (mode == 1 ? IDM_VIEWRESULT : IDM_VIEWSCHEMA), MF_BYCOMMAND);
192194

195+
/* Update Edit menu state - basic state on view switch, WM_INITMENUPOPUP refines */
196+
EnableMenuItem(g_hEditMenu, IDM_REPLACE, (mode == VIEW_QUERY) ? MF_ENABLED : MF_GRAYED);
197+
193198
/* Remove old menu from CommandBar (index 0) */
194199
SendMessage(g_hwndCB, TB_DELETEBUTTON, 0, 0);
195200

@@ -428,8 +433,8 @@ LRESULT CALLBACK QueryEditProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam
428433
SendMessage(hwnd, EM_SCROLLCARET, 0, 0);
429434
return 0;
430435
}
431-
/* Ctrl+C/V/X - pass through for edit operations */
432-
if (ctrl && (wParam == 'C' || wParam == 'V' || wParam == 'X'))
436+
/* Ctrl+C/V/X/Z - pass through for edit operations */
437+
if (ctrl && (wParam == 'C' || wParam == 'V' || wParam == 'X' || wParam == 'Z'))
433438
return CallWindowProc(g_pfnQueryProc, hwnd, msg, wParam, lParam);
434439
}
435440
/* Update line count on keyup and scroll caret into view for navigation keys */
@@ -459,8 +464,8 @@ LRESULT CALLBACK QueryEditProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam
459464
UpdateLineNumbers();
460465
return r;
461466
}
462-
/* Ctrl+C=3, Ctrl+X=24 - pass through */
463-
if (wParam == 3 || wParam == 24)
467+
/* Ctrl+C=3, Ctrl+X=24, Ctrl+Z=26 - pass through */
468+
if (wParam == 3 || wParam == 24 || wParam == 26)
464469
return CallWindowProc(g_pfnQueryProc, hwnd, msg, wParam, lParam);
465470
return 0;
466471
}

src/sqlite-ce-edit/globals.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ HWND g_hwndCB;
1414
HWND g_hwndStatus;
1515
HMENU g_hMenu;
1616
HMENU g_hViewMenu;
17+
HMENU g_hEditMenu;
1718
HMENU g_hRecentDbMenu;
1819
HMENU g_hRecentQueryMenu;
1920
HMENU g_hQueryCtx;

src/sqlite-ce-edit/globals.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ BOOL WINAPI GetSaveFileNameW(CE_OPENFILENAME*);
8787
** Version
8888
**============================================================================*/
8989

90-
#define SQLITECEDIT_VERSION L"0.10.0.47"
90+
#define SQLITECEDIT_VERSION L"0.10.0.56"
9191

9292
/*============================================================================
9393
** Menu IDs
@@ -142,6 +142,14 @@ BOOL WINAPI GetSaveFileNameW(CE_OPENFILENAME*);
142142
#define IDM_STATUSBAR 706
143143
#define IDM_FULLSCREEN 707
144144

145+
/* Edit menu */
146+
#define IDM_UNDO 801
147+
#define IDM_CUT 802
148+
#define IDM_COPY 803
149+
#define IDM_PASTE 804
150+
#define IDM_SELECTALL 805
151+
#define IDM_DELETE 806
152+
145153
/* Timer IDs */
146154
#define IDT_TAPHOLD 1
147155

@@ -185,6 +193,7 @@ extern HWND g_hwndCB;
185193
extern HWND g_hwndStatus;
186194
extern HMENU g_hMenu;
187195
extern HMENU g_hViewMenu;
196+
extern HMENU g_hEditMenu;
188197
extern HMENU g_hRecentDbMenu;
189198
extern HMENU g_hRecentQueryMenu;
190199
extern HMENU g_hQueryCtx;
@@ -323,6 +332,9 @@ void GridFindNext(void);
323332
LRESULT CALLBACK GridProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
324333
void OnGridDoubleClick(int row, int col);
325334
void ClearUndoStack(void);
335+
int CanUndo(void);
336+
void DoUndo(void);
337+
void DoDeleteRows(void);
326338
void OnSchemaDelete(void);
327339
int GetSelectedObjectType(void); /* Returns IMG_TABLE, IMG_VIEW, IMG_TRIGGER, or -1 */
328340
void GetSchemaStatus(wchar_t *buf, int bufLen);

src/sqlite-ce-edit/grid.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,11 @@ LRESULT CALLBACK GridProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
135135
CopySelectedRow();
136136
return 0;
137137
}
138+
/* Ctrl+A - Select all rows */
139+
if (ctrl && wParam == 'A') {
140+
ListView_SetItemState(g_hwndGrid, -1, LVIS_SELECTED, LVIS_SELECTED);
141+
return 0;
142+
}
138143
/* Ctrl+Z - Undo last delete (only in edit mode) */
139144
if (ctrl && wParam == 'Z' && g_editMode) {
140145
if (g_undoCount > 0) UndoDelete();
@@ -834,6 +839,18 @@ void ClearUndoStack(void) {
834839
g_undoBytes = 0;
835840
}
836841

842+
int CanUndo(void) {
843+
return g_undoCount > 0;
844+
}
845+
846+
void DoUndo(void) {
847+
if (g_undoCount > 0) UndoDelete();
848+
}
849+
850+
void DoDeleteRows(void) {
851+
if (g_editMode) DeleteSelectedRow();
852+
}
853+
837854
/* Check available memory before caching */
838855
static int CanCacheUndo(int bytesNeeded) {
839856
/* Drop oldest entries if over limit */

src/sqlite-ce-edit/main.c

Lines changed: 70 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,22 +69,32 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
6969
AppendMenuW(hMenu, MF_POPUP, (UINT)hFile, L"&File");
7070
g_hFileMenu = hFile;
7171

72+
/* Create Edit menu */
73+
g_hEditMenu = CreatePopupMenu();
74+
AppendMenuW(g_hEditMenu, MF_STRING, IDM_UNDO, L"&Undo\tCtrl+Z");
75+
AppendMenuW(g_hEditMenu, MF_SEPARATOR, 0, NULL);
76+
AppendMenuW(g_hEditMenu, MF_STRING, IDM_CUT, L"Cu&t\tCtrl+X");
77+
AppendMenuW(g_hEditMenu, MF_STRING, IDM_COPY, L"&Copy\tCtrl+C");
78+
AppendMenuW(g_hEditMenu, MF_STRING, IDM_PASTE, L"&Paste\tCtrl+V");
79+
AppendMenuW(g_hEditMenu, MF_SEPARATOR, 0, NULL);
80+
AppendMenuW(g_hEditMenu, MF_STRING, IDM_SELECTALL, L"Select &All\tCtrl+A");
81+
AppendMenuW(g_hEditMenu, MF_SEPARATOR, 0, NULL);
82+
AppendMenuW(g_hEditMenu, MF_STRING, IDM_DELETE, L"&Delete\tDel");
83+
AppendMenuW(g_hEditMenu, MF_SEPARATOR, 0, NULL);
84+
AppendMenuW(g_hEditMenu, MF_STRING, IDM_FIND, L"&Find...\tCtrl+F");
85+
AppendMenuW(g_hEditMenu, MF_STRING, IDM_FINDNEXT, L"Find &Next\tF3");
86+
AppendMenuW(g_hEditMenu, MF_STRING, IDM_REPLACE, L"&Replace...\tCtrl+H");
87+
AppendMenuW(hMenu, MF_POPUP, (UINT)g_hEditMenu, L"&Edit");
88+
7289
/* Create all three context menus upfront */
7390
g_hQueryCtx = CreatePopupMenu();
7491
AppendMenuW(g_hQueryCtx, MF_STRING, IDM_EXECUTE, L"&Execute\tCtrl+Enter");
75-
AppendMenuW(g_hQueryCtx, MF_SEPARATOR, 0, NULL);
76-
AppendMenuW(g_hQueryCtx, MF_STRING, IDM_FIND, L"&Find...\tCtrl+F");
77-
AppendMenuW(g_hQueryCtx, MF_STRING, IDM_FINDNEXT, L"Find &Next\tF3");
78-
AppendMenuW(g_hQueryCtx, MF_STRING, IDM_REPLACE, L"&Replace...\tCtrl+H");
7992

8093
g_hResultCtx = CreatePopupMenu();
8194
AppendMenuW(g_hResultCtx, MF_STRING, IDM_VIEWGRID, L"&Grid View\tCtrl+G");
8295
AppendMenuW(g_hResultCtx, MF_SEPARATOR, 0, NULL);
8396
AppendMenuW(g_hResultCtx, MF_STRING, IDM_EXPORTRESULTS, L"&Export Results...");
8497
AppendMenuW(g_hResultCtx, MF_STRING, IDM_EXPORTHTMLRES, L"Export &HTML...");
85-
AppendMenuW(g_hResultCtx, MF_SEPARATOR, 0, NULL);
86-
AppendMenuW(g_hResultCtx, MF_STRING, IDM_FIND, L"&Find...\tCtrl+F");
87-
AppendMenuW(g_hResultCtx, MF_STRING, IDM_FINDNEXT, L"Find &Next\tF3");
8898

8999
{
90100
HMENU hSelObj = CreatePopupMenu();
@@ -395,6 +405,42 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
395405
case IDM_FONTSIZE:
396406
CycleFontSize();
397407
break;
408+
/* Edit menu */
409+
case IDM_UNDO:
410+
if (g_viewMode == VIEW_QUERY)
411+
SendMessage(g_hwndQuery, EM_UNDO, 0, 0);
412+
else if (g_editMode && CanUndo())
413+
DoUndo();
414+
break;
415+
case IDM_CUT:
416+
if (g_viewMode == VIEW_QUERY)
417+
SendMessage(g_hwndQuery, WM_CUT, 0, 0);
418+
break;
419+
case IDM_COPY:
420+
if (g_viewMode == VIEW_QUERY)
421+
SendMessage(g_hwndQuery, WM_COPY, 0, 0);
422+
else if (g_viewMode == VIEW_RESULT && !g_gridView)
423+
SendMessage(g_hwndResult, WM_COPY, 0, 0);
424+
break;
425+
case IDM_PASTE:
426+
if (g_viewMode == VIEW_QUERY)
427+
SendMessage(g_hwndQuery, WM_PASTE, 0, 0);
428+
break;
429+
case IDM_SELECTALL:
430+
if (g_viewMode == VIEW_QUERY) {
431+
SetFocus(g_hwndQuery);
432+
SendMessage(g_hwndQuery, EM_SETSEL, 0, -1);
433+
} else if (g_viewMode == VIEW_RESULT && !g_gridView) {
434+
SetFocus(g_hwndResult);
435+
SendMessage(g_hwndResult, EM_SETSEL, 0, -1);
436+
} else if (g_viewMode == VIEW_RESULT && g_gridView && g_hwndGrid) {
437+
SetFocus(g_hwndGrid);
438+
ListView_SetItemState(g_hwndGrid, -1, LVIS_SELECTED, LVIS_SELECTED);
439+
}
440+
break;
441+
case IDM_DELETE:
442+
if (g_editMode && g_viewMode == VIEW_RESULT) DoDeleteRows();
443+
break;
398444
case IDOK: SendMessage(hwnd, WM_CLOSE, 0, 0); break;
399445
case 1001:
400446
if (HIWORD(wParam) == EN_CHANGE && g_viewMode == 0) {
@@ -540,6 +586,23 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
540586

541587
case WM_INITMENUPOPUP: {
542588
HMENU hMenu = (HMENU)wParam;
589+
/* Update Edit menu state */
590+
if (hMenu == g_hEditMenu) {
591+
int canUndo = 0;
592+
int hasSelection = 0;
593+
int canCut = (g_viewMode == VIEW_QUERY);
594+
if (g_viewMode == VIEW_QUERY)
595+
canUndo = SendMessage(g_hwndQuery, EM_CANUNDO, 0, 0);
596+
else if (g_editMode)
597+
canUndo = CanUndo();
598+
if (g_viewMode == VIEW_RESULT && g_gridView && g_hwndGrid)
599+
hasSelection = ListView_GetNextItem(g_hwndGrid, -1, LVNI_SELECTED) >= 0;
600+
EnableMenuItem(hMenu, IDM_UNDO, canUndo ? MF_ENABLED : MF_GRAYED);
601+
EnableMenuItem(hMenu, IDM_CUT, canCut ? MF_ENABLED : MF_GRAYED);
602+
EnableMenuItem(hMenu, IDM_DELETE, (g_editMode && g_viewMode == VIEW_RESULT && hasSelection) ? MF_ENABLED : MF_GRAYED);
603+
EnableMenuItem(hMenu, IDM_REPLACE, (g_viewMode == VIEW_QUERY) ? MF_ENABLED : MF_GRAYED);
604+
EnableMenuItem(hMenu, IDM_FINDNEXT, g_findText[0] ? MF_ENABLED : MF_GRAYED);
605+
}
543606
/* Check if this is the Selected Object submenu */
544607
if (g_viewMode == 2) {
545608
int objType = GetSelectedObjectType();

0 commit comments

Comments
 (0)