Skip to content
This repository has been archived by the owner on Dec 30, 2022. It is now read-only.

Commit

Permalink
Closes #59: codefolding persistence on large files
Browse files Browse the repository at this point in the history
  • Loading branch information
denuno committed May 18, 2016
1 parent 5006069 commit 0722b52
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 9 deletions.
Expand Up @@ -126,6 +126,7 @@
import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
import org.eclipse.ui.texteditor.TextOperationAction;
import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
import org.cfeclipse.cfml.editors.codefolding.CodeFoldingResourceChangeReporter;

/**
* @author Rob
Expand Down Expand Up @@ -397,8 +398,11 @@ public CFMLEditor() {
// The following is to enable us to listen to changes. Mainly it's used
// for
// getting the document filename when a new document is opened.
IResourceChangeListener listener = new MyResourceChangeReporter();
IResourceChangeListener listener = new ResourceChangeReporter();

CFMLPlugin.getWorkspace().addResourceChangeListener(listener);
// add the code folding state file handling
CFMLPlugin.getWorkspace().addResourceChangeListener(new CodeFoldingResourceChangeReporter());

}

Expand Down
Expand Up @@ -29,7 +29,7 @@
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.runtime.CoreException;

public class MyResourceChangeReporter implements IResourceChangeListener {
public class ResourceChangeReporter implements IResourceChangeListener {

public void resourceChanged(IResourceChangeEvent event)
{
Expand All @@ -40,10 +40,10 @@ public void resourceChanged(IResourceChangeEvent event)
//System.out.println(" is about to close.");
break;
case IResourceChangeEvent.PRE_DELETE:
// delete the fold state file
//System.out.println(" is about to be deleted.");
break;
case IResourceChangeEvent.POST_CHANGE:
//System.out.println("Resources have changed." + event.getSource());
event.getDelta().accept(new DeltaPrinter());
break;
/* these two seem to be deprecated...
Expand All @@ -57,6 +57,7 @@ public void resourceChanged(IResourceChangeEvent event)
break;
*/
}

}catch(CoreException temp) {
System.err.println("Caught a CoreException");
}
Expand Down
@@ -0,0 +1,51 @@
package org.cfeclipse.cfml.editors.codefolding;

import java.io.File;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.runtime.CoreException;

public class CodeFoldingResourceChangeReporter implements IResourceChangeListener {

public void resourceChanged(IResourceChangeEvent event) {
try {
if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
IResourceDelta changes = event.getDelta();
changes.accept(new IResourceDeltaVisitor() {
public boolean visit(IResourceDelta change) {
if (change.getResource().getType() == IResource.FILE) {
// rename the fold state file
if (change.getMovedToPath() != null) {
File foldFile = CodeFoldingSetter.getFoldStateFile((IFile) change.getResource());
if (foldFile.exists()) {
String newName = change.getMovedToPath().toFile().getName() + "_folds";
String oldName = foldFile.toPath().toFile().getName();
String oldPath = foldFile.toPath().toFile().toString();
String newPath = oldPath.replace(oldName, newName);
foldFile.toPath().toFile().renameTo(new File(newPath));
}
}
if (change.getKind() == IResourceDelta.REMOVED && change.getMovedToPath() == null
&& change.getMovedFromPath() == null) {
File foldFile = CodeFoldingSetter.getFoldStateFile((IFile) change.getResource());
if (foldFile.exists()) {
foldFile.delete();
}
}
}
;
return true;
}
});
}

} catch (CoreException temp) {
System.err.println("Caught a CoreException");
}
}
}
Expand Up @@ -45,6 +45,11 @@
import org.cfeclipse.cfml.preferences.CFMLPreferenceManager;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.jface.text.BadLocationException;
Expand Down Expand Up @@ -616,17 +621,15 @@ private ITextSelection getSelection() {
* }
*/

private File getFoldStateFile(final IFile resource) {
public static File getFoldStateFile(final IFile resource) {
return resource.getProject().getWorkingLocation(CFMLPlugin.PLUGIN_ID).append(resource.getName() + "_folds").toFile();
}

public void persistFoldState() {
if (preferenceManager.persistFoldState() && resource != null && !resource.isPhantom()) {
if (preferenceManager.persistFoldState() && resource != null && !resource.isPhantom()) {
StringBuffer sb = new StringBuffer();
Iterator iter = model.getAnnotationIterator();
int positions = 0;
Iterator<?> iter = model.getAnnotationIterator();
while (iter.hasNext()) {
positions++;
ProjectionAnnotation annotation = (ProjectionAnnotation) iter.next();
Position position = model.getPosition(annotation);
sb.append(position.offset + "," + position.length + ",");
Expand Down

0 comments on commit 0722b52

Please sign in to comment.