Как добавить контекстное меню копирования / вставки в элемент браузера в XULRunner? - PullRequest
1 голос
/ 08 апреля 2011

Я бы хотел, чтобы пользователь моего приложения на XULRunner мог выполнять копирование / вставку через контекстное меню. Сочетания клавиш Ctrl-C и Ctrl-V уже работают нормально

Ответы [ 3 ]

1 голос
/ 04 октября 2013

Вот оно без вспышки.Функция getInputSelection отсюда: Существует ли одобренная Internet Explorer замена для selectionStart и selectionEnd? .

<?xml version="1.0"?>

<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>

<window id="mywin" title="my app" 
    width="800" height="600" persist="screenX screenY width height sizemode" 
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

    <popupset>
        <menupopup id="clipmenu">
      <menuitem label="Copy" oncommand="copy()"/>
      <menuitem label="Paste" oncommand="paste();"/>
        </menupopup>
    </popupset>

    <browser
          type="content-primary"
      src="http://127.0.0.1/"
      flex="1"
      disablehistory="true"
      id="browserId"
      context="clipmenu"
      />
<script>
<![CDATA[

    function copy()
{
    var tabBrowser = document.getElementById("browserId");
    var selectedTagName = tabBrowser.contentWindow.document.activeElement.tagName;
    var windowObj;
    if(selectedTagName == "IFRAME")
{
  windowObj = tabBrowser.contentWindow.frames[tabBrowser.contentWindow.document.activeElement.name]; 
}
else
{
    windowObj = document.getElementById("browserId").contentWindow;
}

var selectedText = windowObj.getSelection();

if(!selectedText || selectedText == "")
{
    var focused = windowObj.document.activeElement;
    if(focused && focused.value)
    {
        selectedText = getSelectionFromInput(focused);
    }
}

//alert(selectedText + "---");

const clipHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
    clipHelper.copyString(selectedText);
}

function getSelectionFromInput(focused)
{
var focusedValue = focused.value;
var sel = getInputSelection(focused);
var selectedText = "";
if(focusedValue.length == (sel.end))
{
    selectedText = focusedValue.substring(sel.start);
}
else
{
    selectedText = focusedValue.substring(sel.start, (sel.end));
}

return selectedText;
}

  function paste()
  {
        var clip = Components.classes["@mozilla.org/widget/clipboard;1"].getService(Components.interfaces.nsIClipboard); 
    var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable); 
        trans.addDataFlavor("text/unicode"); 
        clip.getData(trans, clip.kGlobalClipboard); 
        var str = new Object(); 
        var len = new Object(); 
        trans.getTransferData("text/unicode",str,len); 
        str = str.value.QueryInterface(Components.interfaces.nsISupportsString); 
        str = str.data.substring(0, len.value / 2);

        var focused = document.commandDispatcher.focusedElement;
var focusedValue = focused.value; 
var sel = getInputSelection(focused);
focused.value = focusedValue.substring(0,sel.start) + str + focusedValue.substring(sel.end);
 }

function getInputSelection(el) {
var start = 0, end = 0, normalizedValue, range,
    textInputRange, len, endRange;

if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") {
    start = el.selectionStart;
    end = el.selectionEnd;
} else {
    range = document.selection.createRange();

    if (range && range.parentElement() == el) {
        len = el.value.length;
        normalizedValue = el.value.replace(/\r\n/g, "\n");

        // Create a working TextRange that lives only in the input
        textInputRange = el.createTextRange();
        textInputRange.moveToBookmark(range.getBookmark());

        // Check if the start and end of the selection are at the very end
        // of the input, since moveStart/moveEnd doesn't return what we want
        // in those cases
        endRange = el.createTextRange();
        endRange.collapse(false);

        if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
            start = end = len;
        } else {
            start = -textInputRange.moveStart("character", -len);
            start += normalizedValue.slice(0, start).split("\n").length - 1;

            if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
                end = len;
            } else {
                end = -textInputRange.moveEnd("character", -len);
                end += normalizedValue.slice(0, end).split("\n").length - 1;
            }
        }
    }
}

return {
    start: start,
    end: end
};
}
]]>
</script>   
</window>

Обновлено для поддержки фреймов.

1 голос
/ 05 декабря 2013

Еще один пример для контекстного меню «Копировать» в XULRunner в браузере SWT (код был реализован для Eclipse v3.5.1, XULRunner v1.8.1.3):

Browser browser = new Browser(parent, style | SWT.MOZILLA);

Menu menu = new Menu(browser);
MenuItem item = new MenuItem(menu, SWT.NONE);
item.setText("Copy");
item.addSelectionListener(new SelectionListener() {
   @Override
   public void widgetSelected(SelectionEvent e) {
      nsIWebBrowser webBrowser = (nsIWebBrowser) browser.getWebBrowser();
      nsIInterfaceRequestor req = (nsIInterfaceRequestor) webBrowser.queryInterface(nsIInterfaceRequestor.NS_IINTERFACEREQUESTOR_IID);
      nsIDocShell docShell = (nsIDocShell) req.getInterface(nsIDocShell.NS_IDOCSHELL_IID);
      nsIClipboardCommands cmds = (nsIClipboardCommands) docShell.queryInterface(nsIClipboardCommands.NS_ICLIPBOARDCOMMANDS_IID);
      cmds.copySelection();
   }

   @Override
   public void widgetDefaultSelected(SelectionEvent e) {
   }
});
browser.setMenu(menu);
1 голос
/ 13 февраля 2012

Создать меню, используя код ниже.

<popupset>
<menupopup id="clipmenu">

      <menuitem label="Copy" oncommand="copy();"/>
     <menuseparator/>
     <menuitem label="paste" oncommand="paste();"/>
</menupopup>
</popupset>

 <browser type="content" src="chrome://myapp/content/theme1/index.html" flex="1" context="clipmenu"/>

Подключите его к тому, что вы хотите, здесь я делаю его контекстным меню элемента браузера, задав идентификатор меню в атрибуте context элемента browser.

Затем дляВ каждом меню вы можете дать команду для выполнения в событии oncommand.Мы дали функцию копирования и вставки.

Затем напишите код для копирования текста с любого элемента, который вы хотите, или если вы хотите скопировать только выбранные данные.

См. Ссылку ниже для копированиякоманда.

http://www.deluxeblogtips.com/2010/06/javascript-copy-to-clipboard.html

...