Author: MarkieB
Date: Tue Sep 1 06:28:34 2009
New Revision: 9531
URL:
http://source.netsurf-browser.org?rev=9531&view=rev
Log:
edit menu items activation
Modified:
branches/MarkieB/windows/windows/gui.c
Modified: branches/MarkieB/windows/windows/gui.c
URL:
http://source.netsurf-browser.org/branches/MarkieB/windows/windows/gui.c?...
==============================================================================
--- branches/MarkieB/windows/windows/gui.c (original)
+++ branches/MarkieB/windows/windows/gui.c Tue Sep 1 06:28:34 2009
@@ -40,6 +40,7 @@
#include "desktop/plotters.h"
#include "desktop/netsurf.h"
#include "desktop/options.h"
+#include "desktop/selection.h"
#include "desktop/textinput.h"
#include "render/html.h"
#include "utils/log.h"
@@ -197,7 +198,9 @@
static void nsws_window_init_pointers(void);
static void redraw(void);
static void nsws_window_update_forward_back(struct gui_window *);
-
+static bool gui_selection_traverse_handler(const char *text, size_t length,
+ struct box *box, void *handle, const char *space_text,
+ size_t space_length);
static void *myrealloc(void *ptr, size_t len, void *pw)
{
return realloc(ptr, len);
@@ -808,6 +811,37 @@
return DefWindowProc(hwnd, msg, wparam, lparam);
break;
}
+ case WM_ENTERMENULOOP: {
+ bool paste, copy, del;
+ if (GetFocus() == w->urlbar) {
+ DWORD i, ii;
+ SendMessage(w->urlbar, EM_GETSEL, (WPARAM)&i,
+ (LPARAM)&ii);
+ paste = true;
+ copy = (i != ii);
+ del = (i != ii);
+
+ } else if ((w->bw != NULL) && (w->bw->sel != NULL)){
+ paste = (w->bw->paste_callback != NULL);
+ copy = w->bw->sel->defined;
+ del = ((w->bw->sel->defined) &&
+ (w->bw->caret_callback != NULL));
+ } else {
+ paste = false;
+ copy = false;
+ del = false;
+ }
+ EnableMenuItem(w->mainmenu, NSWS_ID_EDIT_PASTE, (paste ?
+ MF_ENABLED : MF_GRAYED));
+ EnableMenuItem(w->mainmenu, NSWS_ID_EDIT_COPY, (copy ?
+ MF_ENABLED : MF_GRAYED));
+ EnableMenuItem(w->mainmenu, NSWS_ID_EDIT_CUT, (del ?
+ MF_ENABLED : MF_GRAYED));
+ EnableMenuItem(w->mainmenu, NSWS_ID_EDIT_DELETE, (del ?
+ MF_ENABLED : MF_GRAYED));
+
+ return DefWindowProc(hwnd, msg, wparam, lparam);
+ }
case WM_COMMAND:
{
switch(LOWORD(wparam)) {
@@ -842,14 +876,51 @@
case NSWS_ID_FILE_PRINT:
break;
case NSWS_ID_EDIT_CUT:
+ OpenClipboard(hwnd);
+ EmptyClipboard();
+ CloseClipboard();
+ if (GetFocus() == w->urlbar)
+ SendMessage(w->urlbar, WM_CUT, 0, 0);
+ else if (w->bw != NULL)
+ browser_window_key_press(w->bw,
+ KEY_CUT_SELECTION);
break;
case NSWS_ID_EDIT_COPY:
- break;
- case NSWS_ID_EDIT_PASTE:
- break;
+ OpenClipboard(hwnd);
+ EmptyClipboard();
+ CloseClipboard();
+ if (GetFocus() == w->urlbar)
+ SendMessage(w->urlbar, WM_COPY, 0, 0);
+ else if (w->bw != NULL)
+ gui_copy_to_clipboard(w->bw->sel);
+ break;
+ case NSWS_ID_EDIT_PASTE: {
+ OpenClipboard(hwnd);
+ HANDLE h = GetClipboardData(CF_TEXT);
+ if (h != NULL) {
+ char *content = GlobalLock(h);
+ LOG(("pasting %s\n", content));
+ GlobalUnlock(h);
+ }
+ CloseClipboard();
+ if (GetFocus() == w->urlbar)
+ SendMessage(w->urlbar, WM_PASTE, 0, 0);
+ else
+ gui_paste_from_clipboard(w, 0, 0);
+ break;
+ }
case NSWS_ID_EDIT_DELETE:
+ if (GetFocus() == w->urlbar)
+ SendMessage(w->urlbar, WM_CUT, 0, 0);
+ else
+ browser_window_key_press(w->bw,
+ KEY_DELETE_RIGHT);
break;
case NSWS_ID_EDIT_SELECT_ALL:
+ if (GetFocus() == w->urlbar)
+ SendMessage(w->urlbar, EM_SETSEL, 0, -1);
+ else
+ selection_select_all(w->bw->sel);
break;
case NSWS_ID_EDIT_SEARCH:
break;
@@ -1403,7 +1474,7 @@
AppendMenu(hsubMenu, MF_STRING | MF_GRAYED, NSWS_ID_EDIT_DELETE,
"&delete");
AppendMenu(hsubMenu, MF_SEPARATOR, 0, NULL);
- AppendMenu(hsubMenu, MF_STRING | MF_GRAYED, NSWS_ID_EDIT_SELECT_ALL,
+ AppendMenu(hsubMenu, MF_STRING, NSWS_ID_EDIT_SELECT_ALL,
"Select &All");
AppendMenu(hsubMenu, MF_STRING | MF_GRAYED, NSWS_ID_EDIT_SEARCH,
"&search");
@@ -2212,6 +2283,12 @@
void gui_paste_from_clipboard(struct gui_window *w, int x, int y)
{
+ HANDLE h = GetClipboardData(CF_TEXT);
+ if (h == NULL)
+ return;
+ char *content = GlobalLock(h);
+ LOG(("pasting %s", content));
+ GlobalUnlock(h);
}
bool gui_empty_clipboard(void)
@@ -2221,17 +2298,65 @@
bool gui_add_to_clipboard(const char *text, size_t length, bool space)
{
+/* return true;
+*/
+ HANDLE hnew;
+ char *new;
+ HANDLE h = GetClipboardData(CF_TEXT);
+ if (h != NULL) {
+ char *original = GlobalLock(h);
+ size_t len = strlen(original) + 1;
+ hnew = GlobalAlloc(GHND, length + len);
+ new = (char *)GlobalLock(hnew);
+ snprintf(new, length + len, "%s%s", original, text);
+ GlobalUnlock(h);
+ GlobalUnlock(hnew);
+ EmptyClipboard();
+ SetClipboardData(CF_TEXT, hnew);
+ } else {
+ hnew = GlobalAlloc(GHND, length + 1);
+ new = (char *)GlobalLock(hnew);
+ snprintf(new, length + 1, "%s", text);
+ GlobalUnlock(hnew);
+ SetClipboardData(CF_TEXT, (HANDLE)hnew);
+ }
+ return true;
+}
+
+bool gui_commit_clipboard(void)
+{
return false;
}
-bool gui_commit_clipboard(void)
-{
+bool gui_copy_to_clipboard(struct selection *s)
+{
+ if ((s->defined) && (s->bw != NULL) && (s->bw->window !=
NULL) &&
+ (s->bw->window->main != NULL)) {
+ OpenClipboard(s->bw->window->main);
+ EmptyClipboard();
+ if (selection_traverse(s, gui_selection_traverse_handler,
+ NULL)) {
+ CloseClipboard();
+ return true;
+ }
+ }
return false;
}
-bool gui_copy_to_clipboard(struct selection *s)
-{
- return false;
+bool gui_selection_traverse_handler(const char *text, size_t length,
+ struct box *box, void *handle, const char *space_text,
+ size_t space_length)
+{
+ if (space_text) {
+ if (!gui_add_to_clipboard(space_text,
+ space_length, false)) {
+ return false;
+ }
+ }
+ if (!gui_add_to_clipboard(text, length, box->space))
+ return false;
+
+ return true;
}
void gui_create_form_select_menu(struct browser_window *bw,