⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 draganddrop.cc

📁 属性sosuo算法
💻 CC
📖 第 1 页 / 共 2 页
字号:
    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 + -