/** * Դ�������ƣ�JRESDefaultSyncnizeUnit.java * �������Ȩ���������ӹɷ����޹�˾ ��Ȩ���� * ϵͳ���ƣ�JRES Studio * ģ�����ƣ�com.hundsun.ares.studio.jres.ui * ����˵����$desc * ����ĵ��� * ���ߣ� */ package com.hundsun.ares.studio.ui.editor.sync; import org.apache.commons.lang.ObjectUtils; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.runtime.CoreException; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; import com.hundsun.ares.studio.ui.IARESResourceEditorInput; /** * @author lvgao * */ public class JRESDefaultSyncnizeUnit implements IFileSyncnizeUnit{ private IEditorPart editor; private long modifiedStamp = -1; public JRESDefaultSyncnizeUnit(IEditorPart editor){ this.editor = editor; } private void closeEditor() { //�رձ༭�� editor.getSite().getShell().getDisplay().asyncExec(new Runnable() { public void run() { editor.getSite().getWorkbenchWindow().getActivePage().closeEditor(editor, false); } }); } /* (non-Javadoc) * @see com.hundsun.ares.studio.jres.ui.util.IFileSyncnizeUnit#beforeSave() */ @Override public void beforeSave() { if (getFile() == null) { // û�ж�Ӧ����Դ�ļ��򲻴�����ǰ�¼� return; } modifiedStamp = getFile().getModificationStamp() + 1; } /* (non-Javadoc) * @see com.hundsun.ares.studio.jres.ui.util.IFileSyncnizeUnit#isSaveChange(org.eclipse.core.resources.IResourceDelta) */ private boolean isSaveChange(IResourceDelta delta) { switch (delta.getKind()) { case IResourceDelta.CHANGED: break; case IResourceDelta.REMOVED: //���Ϊɾ��ֱ�ӷ��� return false; } IFile resource = (IFile) delta.getResource(); if (resource.getModificationStamp() == modifiedStamp) { return true; } return false; } /* (non-Javadoc) * @see com.hundsun.ares.studio.jres.ui.util.IFileSyncnizeUnit#getFile() */ public IFile getFile() { IEditorInput editorInput = editor.getEditorInput(); if (editorInput instanceof IFileEditorInput) { return ((IFileEditorInput)editorInput).getFile(); } else if (editorInput instanceof IARESResourceEditorInput) { return (IFile) ((IARESResourceEditorInput)editorInput).getARESResource().getLib().getResource(); } return null; } /* (non-Javadoc) * @see com.hundsun.ares.studio.jres.ui.util.IFileSyncnizeUnit#handleAction(org.eclipse.core.resources.IResourceDelta) */ @Override public void handleAction(IResourceDelta delta) { try { delta.accept(new IResourceDeltaVisitor() { @Override public boolean visit(IResourceDelta delta) throws CoreException { IResource resource = delta.getResource(); IFile file = getFile(); if (resource instanceof IWorkspaceRoot) { return true; } else if (resource instanceof IProject) { if (resource.equals(file.getProject())) { // ��Ŀ��ɾ�����߹ر�ʱ�رձ༭�� switch (delta.getKind()) { case IResourceDelta.REMOVED: closeEditor(); return false; case IResourceDelta.CHANGED: // �رյ�ʱ��ҲҪ�ر� if ((delta.getFlags() & IResourceDelta.OPEN) != 0) { if ( !((IProject) resource).isOpen() ) { closeEditor(); return false; } } } return true; } else { return false; } } else if (resource instanceof IContainer) { if (resource.getFullPath().isPrefixOf(file.getFullPath())) { if (delta.getKind() == IResourceDelta.REMOVED ) { closeEditor(); return false; } return true; } else { return false; } } else if (resource instanceof IFile) { if (!ObjectUtils.equals(file, resource)) { return false; } switch (delta.getKind()) { case IResourceDelta.REMOVED: closeEditor(); return false; case IResourceDelta.CHANGED: if ((delta.getFlags() & IResourceDelta.CONTENT) != 0 && resource.getModificationStamp() != modifiedStamp) { closeEditor(); return false; } } } else { return false; } return true; } }); } catch (CoreException e) { } // IFile file = getFile(); // if(file != null) { // Map<Object, Object> context = new HashMap<Object, Object>(); // IResourceDelta tmpdelta = delta.findMember(file.getFullPath()); // if(tmpdelta != null ){ // // if(isSaveChange(tmpdelta)){ // //��������� // handleSaveChange(context); // }else{ // //����DZ������ // handleOutAction(context); // } // } else { // IResourceDelta[] children = delta.getAffectedChildren(IResourceDelta.REMOVED | IResourceDelta.CHANGED); // // for (IResourceDelta child : children) { // if (child.getResource() instanceof IContainer) { // IContainer container = (IContainer) child.getResource(); // if (container.getFullPath().isPrefixOf(file.getFullPath())) { // if ((child.getFlags() & IResourceDelta.OPEN) != 0 && container instanceof IProject) { // // ��Ŀ�Ĵ�״̬�仯�� // if ( !((IProject)container).isOpen() ) { // handleOutAction(context); // } // } else if (child.getKind() == IResourceDelta.REMOVED) { // handleOutAction(context); // } // } // } // } // } // } } }