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