Как определить, было ли что-то скопировано или вырезано в буфер обмена

#eclipse #swt #jface #rcp #e4

#eclipse #swt #jface #rcp #e4

Вопрос:

в моем методе @execute я могу получить выделение из буфера обмена / LocalSelectionTransfer. Но я понятия не имею, как реагировать на это, основываясь на том, как пользователь поместил содержимое в буфер обмена. Я должен решить, дублировать ли я содержимое или нет. Это то, что у меня есть:

 @Execute
public void execute(@Named(IServiceConstants.ACTIVE_SHELL) Shell shell, @Named(IServiceConstants.ACTIVE_PART) MPart activePart) {
    Clipboard clipboard = new Clipboard(shell.getDisplay());
    TransferData[] transferDatas = clipboard.getAvailableTypes();

    boolean weCanUseIt= false;
    for(int i=0; i<transferDatas.length; i  ) {
        if(LocalSelectionTransfer.getTransfer().isSupportedType(transferDatas[i])) {
            weCanUseIt = true;
            break;
        }
    }

    if (weCanUseIt) {
        @SuppressWarnings("unchecked")
        List<Object> objects = ((StructuredSelection)LocalSelectionTransfer.getTransfer().getSelection()).toList();
        for(Object o: objects) {
            System.out.println(o.getClass());
        }
    }
}
  

есть идеи???

Комментарии:

1. Что это за метод @Execute? Это не то, как вы обычно справляетесь с выделениями в других частях. Вы бы использовали это только для обработчика вставки.

Ответ №1:

Вы получаете что-то в буфер LocalSelectionTransfer обмена, только если вы кодируете часть в своем RCP, чтобы использовать этот тип передачи для операции копирования. Это обеспечивает способ прямой передачи выделения.

Этот тип передачи не будет использоваться, если что-то копируется в буфер обмена любым другим способом (в данном случае это может быть что-то вроде TextTransfer или FileTransfer ).

Таким образом, вы будете использовать только LocalSelectionTransfer для обработки выделения из другой части, и в этом случае вы, вероятно, знаете, как обращаться с объектами.

Если вы пытаетесь выполнить копирование и вырезание, вам следует выполнить вырезание в окне просмотра исходного кода, но это удалит выделение, поэтому вы не сможете использовать LocalSelectionTransfer его для этого. Используйте передачу, такую как FileTransfer или TextTransfer , которая не зависит от текущего выбора.

Комментарии:

1. Метод, который я опубликовал, предназначен для вставки. В то время, когда пользователь нажимает ctrl c или ctrl x, я выделяю treeviewer в этот LocalSelectionTransfer. Это работает. Но: в то время, когда пользователь вставляет с помощью ctrl v, я должен решить, дублировать или перемещать содержимое выделения. Нет информации о том, как пользователь помещал содержимое в буфер обмена / LocalSelectionTransfer.

2. Если вы хотите определить разницу, вы не можете использовать LocalSelectionTransfer. Используйте один из других классов передачи. Вам нужно будет выполнить копирование / вырезание в исходном представлении.