问题描述
我尝试使用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;
}
}
要激活侦听器,我在主要方法中使用以下代码:
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;
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)