📄 draganddrop.cc
字号:
rv = event->GetTarget(getter_AddRefs(target)); if (NS_FAILED(rv)) return rv; if(target == nsnull) return NS_OK; nsCOMPtr<nsIDOMNode> node (do_QueryInterface(target, &rv)); if (NS_FAILED(rv)) return rv; nsAutoString dragDestTypeString = NS_ConvertUTF8toUTF16( nsDependentCString("dragdesttype")); nsAutoString dragDestType; nsCOMPtr <nsIDOMElement> currentElement; PRBool supported; while(1) { rv = searchUpForElementWithAttribute(node, dragDestTypeString, getter_AddRefs(currentElement)); if(NS_FAILED(rv)) return rv; if(currentElement == nsnull) return NS_OK; rv = currentElement->GetAttribute(dragDestTypeString, dragDestType); if(NS_FAILED(rv)) return rv; rv = isDragTypeSupported(dragDestType, &supported, &singleDragType); if(NS_FAILED(rv)) return rv; if(supported) { *element = currentElement; (*element)->AddRef(); return NS_OK; } nsCOMPtr<nsIDOMNode> parent; rv = node->GetParentNode(getter_AddRefs(parent)); if(NS_FAILED(rv)) return rv; if(parent == nsnull) return NS_OK; node = parent; }}class DemocracyDNDHook : public nsIClipboardDragDropHooks, nsIDOMEventListener {protected: GtkMozEmbed* embed;public: DemocracyDNDHook(GtkMozEmbed* embed) { this->embed = embed; } NS_DECL_ISUPPORTS nsresult AllowDrop(nsIDOMEvent *event, nsIDragSession *session, PRBool* retval) { nsresult rv; *retval = false; rv = removeCurrentHighlight(); if(NS_FAILED(rv)) return rv; nsCOMPtr<nsIDOMElement> element; nsString singleDragType; rv = findDropElement(event, getter_AddRefs(element), singleDragType); if(NS_FAILED(rv)) return rv; if(element) { nsAutoString dragEffectStr = NS_ConvertUTF8toUTF16( nsDependentCString("drageffect")); dragEffectStr.Append(singleDragType); nsAutoString dragEffect; rv = element->GetAttribute(dragEffectStr, dragEffect); if(NS_FAILED(rv)) return rv; *retval = true; rv = session->SetDragAction(stringToDragAction(dragEffect)); if(NS_FAILED(rv)) return rv; rv = setNewHighlight(element, singleDragType); if(NS_FAILED(rv)) return rv; } else { PRBool hasURLs; rv = checkForURLs(&hasURLs); if(NS_FAILED(rv)) return rv; if(hasURLs) { rv = session->SetDragAction( nsIDragService::DRAGDROP_ACTION_COPY); if(NS_FAILED(rv)) return rv; *retval = true; return NS_OK; } } return NS_OK; } nsresult AllowStartDrag(nsIDOMEvent *event, PRBool* retval) { *retval = true; nsCOMPtr<nsIDOMElement> element; nsAutoString dragSourceTypeStr = NS_ConvertUTF8toUTF16( nsDependentCString("dragsourcetype")); nsresult rv = searchUpForElementWithAttribute(event, dragSourceTypeStr, getter_AddRefs(element)); if (NS_FAILED(rv)) return rv; if(element) { nsCOMPtr<nsISupportsArray> dragArray(do_CreateInstance( "@mozilla.org/supports-array;1", &rv)); if (NS_FAILED(rv)) return rv; makeDragData(element, dragArray); rv = startDrag(dragArray); if (NS_FAILED(rv)) { printf("WARNING: startDrag failed\n"); return rv; } else { event->StopPropagation(); event->PreventDefault(); *retval = false; } } return NS_OK; } nsresult OnCopyOrDrag(nsIDOMEvent *event, nsITransferable *trans, PRBool* retval) { /* This gets called when the default drop handler needs to copy * something. Don't mess with things in this case. */ *retval = true; return NS_OK; } nsresult OnPasteOrDrop(nsIDOMEvent *event, nsITransferable *trans, PRBool* retval) { if(event == nsnull) { // Event was a paste, let mozilla handle it. *retval = true; return NS_OK; } *retval = false; nsresult rv; rv = removeCurrentHighlight(); if(NS_FAILED(rv)) return rv; nsCOMPtr<nsIDOMElement> element; nsString singleDragType; rv = findDropElement(event, getter_AddRefs(element), singleDragType); if(NS_FAILED(rv)) return rv; if(element) { nsAutoString dragDestDataString = NS_ConvertUTF8toUTF16( nsDependentCString("dragdestdata")); nsAutoString dragDestData; rv = element->GetAttribute(dragDestDataString, dragDestData); if(NS_FAILED(rv)) return rv; nsAutoString sourceData; rv = getDragSourceData(singleDragType, sourceData); if(NS_FAILED(rv)) return rv; *retval = true; nsCAutoString url = NS_ConvertUTF16toUTF8(dragDestData); url.Insert("action:handleDrop?data=", 0); url.Append("&type="); url.Append(NS_ConvertUTF16toUTF8(singleDragType)); url.Append("&sourcedata="); url.Append(NS_ConvertUTF16toUTF8(sourceData)); gtk_moz_embed_load_url(this->embed, PromiseFlatCString(url).get()); return rv; } else { PRBool hasURLs; rv = checkForURLs(&hasURLs); if(NS_FAILED(rv)) return rv; if(hasURLs) { nsCOMPtr<nsIDragService> dragService(do_GetService( "@mozilla.org/widget/dragservice;1", &rv)); if(NS_FAILED(rv)) return rv; nsCOMPtr<nsIDragSession> dragSession; rv = dragService->GetCurrentSession(getter_AddRefs(dragSession)); if(NS_FAILED(rv)) return rv; PRUint32 urlCount; rv = dragSession->GetNumDropItems(&urlCount); if(NS_FAILED(rv)) return rv; nsAutoString data; nsCAutoString utf8Data, escapedData; if(NS_FAILED(rv)) return rv; nsCAutoString url("action:handleURIDrop?data="); for(int i = 0; i < urlCount; i++) { rv = extractDragData(kURLMime, data, i); if(NS_FAILED(rv)) return rv; utf8Data = NS_ConvertUTF16toUTF8(data); NS_EscapeURL(PromiseFlatCString(utf8Data).get(), utf8Data.Length(), esc_Query | esc_Forced | esc_AlwaysCopy, escapedData); url.Append(escapedData); url.Append("%0A"); // "\n" } gtk_moz_embed_load_url(this->embed, PromiseFlatCString(url).get()); } return NS_OK; } } nsresult HandleEvent(nsIDOMEvent *event) { // This fires for dragexit events PRInt32 screenX, screenY; nsresult rv; nsCOMPtr<nsIDOMMouseEvent> mouseEvent(do_QueryInterface(event, &rv)); if(NS_FAILED(rv)) return rv; rv = mouseEvent->GetScreenX(&screenX); if(NS_FAILED(rv)) return rv; rv = mouseEvent->GetScreenY(&screenY); if(NS_FAILED(rv)) return rv; if(screenX == 0 && screenY == 0) { rv = removeCurrentHighlight(); if(NS_FAILED(rv)) return rv; } return NS_OK; }};NS_IMPL_ISUPPORTS2(DemocracyDNDHook, nsIClipboardDragDropHooks, nsIDOMEventListener)nsresult setupDragAndDrop(GtkMozEmbed* gtkembed){ nsresult rv; nsCOMPtr<nsIWebBrowser> browser; nsCOMPtr<nsIDOMWindow> domWindow; gtk_moz_embed_get_nsIWebBrowser(gtkembed, getter_AddRefs(browser)); rv = browser->GetContentDOMWindow(getter_AddRefs(domWindow)); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsICommandManager> commandManager(do_GetService( "@mozilla.org/embedcomp/command-manager;1", &rv)); if (NS_FAILED(rv)) return rv; nsIClipboardDragDropHooks *rawPtr = new DemocracyDNDHook(gtkembed); if (!rawPtr) return NS_ERROR_OUT_OF_MEMORY; nsCOMPtr<nsIClipboardDragDropHooks> democracyDNDHook(do_QueryInterface( rawPtr, &rv)); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsICommandParams> params(do_CreateInstance( "@mozilla.org/embedcomp/command-params;1", &rv)); if (NS_FAILED(rv)) return rv; rv = params->SetISupportsValue("addhook", democracyDNDHook); if (NS_FAILED(rv)) return rv; rv = commandManager->DoCommand("cmd_clipboardDragDropHook", params, domWindow); nsCOMPtr<nsIDOMEventTarget> eventTarget( do_QueryInterface(domWindow, &rv)); if(NS_FAILED(rv)) return rv; nsCOMPtr<nsIDOMEventListener> dndEventListener( do_QueryInterface(democracyDNDHook, &rv)); if(NS_FAILED(rv)) return rv; nsAutoString type = NS_ConvertUTF8toUTF16( nsDependentCString("dragexit")); rv = eventTarget->AddEventListener(type, dndEventListener, true); if(NS_FAILED(rv)) return rv; return rv;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -