Java 我想为任何文件覆盖eclipse现有的粘贴功能。如果有人已经做了这种改变,那么请帮助我

Java 我想为任何文件覆盖eclipse现有的粘贴功能。如果有人已经做了这种改变,那么请帮助我,java,eclipse,swt,eclipse-rcp,rcp,Java,Eclipse,Swt,Eclipse Rcp,Rcp,我尝试过使用IResourceChangeListener和IResourceDeltaVisitor,粘贴文件后,我使用IResourceDelta获取文件。如果该文件夹中已存在文件,则使用此选项打开“重命名选项”对话框。我将原始文件内容复制到新文件中,新文件的名称通过对话框给出,在文件夹中创建此文件后,我将删除旧文件。但是我想要eclipse现有粘贴功能的代码,这样如果可能的话,我将重写代码并根据需要进行更改 以下是IResourceChangeListener和IResourceDelta

我尝试过使用IResourceChangeListener和IResourceDeltaVisitor,粘贴文件后,我使用IResourceDelta获取文件。如果该文件夹中已存在文件,则使用此选项打开“重命名选项”对话框。我将原始文件内容复制到新文件中,新文件的名称通过对话框给出,在文件夹中创建此文件后,我将删除旧文件。但是我想要eclipse现有粘贴功能的代码,这样如果可能的话,我将重写代码并根据需要进行更改

以下是IResourceChangeListener和IResourceDeltaVisitor的代码:

public class ResourceChangeListener implements IResourceChangeListener {

    @Override
    public void resourceChanged(IResourceChangeEvent event) {
        if (event.getType() == IResourceChangeEvent.POST_BUILD || event.getType() == IResourceChangeEvent.PRE_BUILD) {
            try {
                event.getDelta().accept(new DeltaPrinter());
            } catch (CoreException e) {
                e.printStackTrace();
            }
        }
    }
}


public class DeltaPrinter implements IResourceDeltaVisitor {

    Integer fileCount = 0;

    @Override
    public boolean visit(IResourceDelta delta) {

        Display.getDefault().syncExec(new Runnable() {
            public void run() {
                IResource resource = delta.getResource();
                if ((delta.getKind() == IResourceDelta.ADDED) && resource != null) {
                    IProject project = resource.getProject();
                    if (project != null && resource.getProjectRelativePath() != null) {
                        IFile file = project.getFile(resource.getProjectRelativePath());
                        String projectLocation = project.getLocation().toString();
                        IPath projectFolder = new Path(projectLocation);
                        IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(projectFolder);
                        fileCount = 0;
                        if (file.exists() && file.getName().contains(".job")
                                && traverseToCheckIfFileAlreadyExists(folder.getFullPath().toString(), file.getName(),
                                        false) > 1) {
                            if (OSValidator.isWindows() && !file.getFullPath().toOSString()
                                    .startsWith("\\" + file.getProject().getName() + "\\jobs\\")) {
                                MessageBox messageBox = new MessageBox(new Shell(), SWT.ICON_ERROR | SWT.OK);
                                messageBox.setText("Error");
                                messageBox.setMessage("The Job File can be created only inside Jobs folder");
                                messageBox.open();

                            } else if (OSValidator.isMac() && !file.getFullPath().toOSString()
                                    .startsWith("/" + file.getProject().getName() + "/jobs/")) {
                                MessageBox messageBox = new MessageBox(new Shell(), SWT.ICON_ERROR | SWT.OK);
                                messageBox.setText("Error");
                                messageBox.setMessage("The Job File can be created only inside Jobs folder");
                                messageBox.open();

                            } else {
                                System.out.println(file.getName() + " file already exist");
                                JobNameChangeDialog dialog = new JobNameChangeDialog(
                                        new Shell(), file.getName());
                                int returnCode = dialog.open();
                                if (returnCode == 0 && !file.getName().equals(dialog.getJobName())) {
                                    String newFullPath = file.getLocation().toString().replace(file.getName(), "")
                                            + dialog.getJobName();
                                    File oldFile = new File(file.getLocation().toString());
                                    File newFile = new File(newFullPath);
                                    try {
                                        FileUtils.copyFile(oldFile, newFile);
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                            try {
                                file.delete(true, null);
                            } catch (CoreException e) {
                                e.printStackTrace();
                            }
                        }
                    }

                }

            }
        });
        return true;// visit the children
    }

    public Integer traverseToCheckIfFileAlreadyExists(String path, String currentFileName, boolean fileAlreadyExists) {

        if (!fileAlreadyExists) {
            File rootFolder = new File(path);
            File[] listOfAvailableFiles = rootFolder.listFiles();
            if (listOfAvailableFiles != null) {
                for (File file : listOfAvailableFiles) {
                    if (file.getName().equals(currentFileName)) {
                        fileCount = fileCount + 1;
                    } else if (!fileAlreadyExists && file.isDirectory()) {
                        traverseToCheckIfFileAlreadyExists(file.getAbsolutePath(), currentFileName, fileAlreadyExists);
                    }
                }
            }
        }
        return fileCount;
    }

}
要激活侦听器,我在main方法中使用以下代码:

IResourceChangeListener listener = new ResourceChangeListener();
    ResourcesPlugin.getWorkspace().addResourceChangeListener(listener, IResourceChangeEvent.POST_BUILD
             | IResourceChangeEvent.PRE_BUILD);
用于打开重命名选项(如果文件已存在)的对话框类:

public class JobNameChangeDialog extends TitleAreaDialog {

    private Text txtJobName;
    private String jobName;
    private String existingJobName;

    public JobNameChangeDialog(Shell parentShell, String existingJobName) {
        super(parentShell);
        this.existingJobName = existingJobName;
    }

    @Override
    public void create() {
        super.create();
        setTitle("Name Conflict");
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite area = (Composite) super.createDialogArea(parent);
        Composite container = new Composite(area, SWT.NONE);
        container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        GridLayout layout = new GridLayout(2, false);
        container.setLayout(layout);
        createJobName(container);
        return area;
    }

    private void createJobName(Composite container) {
        Label lbtJobName = new Label(container, SWT.NONE);
        lbtJobName.setText("Enter a new name for " + "'" + existingJobName + "'" + ":");

        GridData dataJobName = new GridData();
        dataJobName.grabExcessHorizontalSpace = true;
        dataJobName.horizontalAlignment = GridData.FILL;

        txtJobName = new Text(container, SWT.BORDER);
        txtJobName.setText(existingJobName);
        txtJobName.setLayoutData(dataJobName);
    }

    @Override
    protected boolean isResizable() {
        return true;
    }

    private void saveInput() {
        jobName = txtJobName.getText();
    }

    @Override
    protected void okPressed() {
        saveInput();
        if (jobName.equals(existingJobName)) {
            setErrorMessage("Job with this name already exists");
        } else {
            super.okPressed();
        }

    }

    public String getJobName() {
        return jobName;
    }
}

每个视图或编辑器都有自己单独的粘贴处理程序,因此这并不简单。您可能可以使用
org.eclipse.ltk.core.refactoring.xxxxParticipant
复制/创建/删除/重命名/移动的扩展点来执行某些操作