Skip to content

Commit

Permalink
Performance enhancement, disposed project fix #109
Browse files Browse the repository at this point in the history
  • Loading branch information
hsz committed Apr 16, 2015
1 parent 2149b96 commit 2a62ace
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 71 deletions.
156 changes: 86 additions & 70 deletions src/mobi/hsz/idea/gitignore/IgnoreManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -156,11 +156,40 @@ protected boolean isIgnoreFileType(VirtualFileEvent event) {
@Override
public void childrenChanged(@NotNull PsiTreeChangeEvent event) {
if (event.getParent() instanceof IgnoreFile) {
cache.hasChanged((IgnoreFile) event.getParent());
IgnoreFile ignoreFile = (IgnoreFile) event.getParent();
if (((IgnoreLanguage) ignoreFile.getLanguage()).isEnabled()) {
cache.hasChanged(ignoreFile);
}
}
}
};

private final IgnoreSettings.Listener settingsListener = new IgnoreSettings.Listener() {
@Override
public void onChange(@NotNull KEY key, Object value) {
switch (key) {

case IGNORED_FILE_STATUS:
toggle((Boolean) value);
break;

case OUTER_IGNORE_RULES:
case LANGUAGES:
if (isEnabled()) {
if (working) {
cache.clear();
retrieve();
} else {
enable();
}
}
break;

}
}
};


/**
* Returns {@link IgnoreManager} service instance.
*
Expand All @@ -178,32 +207,11 @@ public static IgnoreManager getInstance(@NotNull final Project project) {
*/
public IgnoreManager(@NotNull final Project project) {
super(project);
this.cache = new CacheMap(project);
this.psiManager = (PsiManagerImpl) PsiManager.getInstance(project);
this.virtualFileManager = VirtualFileManager.getInstance();
this.queue = new BackgroundTaskQueue(project, IgnoreBundle.message("cache.indexing"));
this.settings = IgnoreSettings.getInstance();

this.settings.addListener(new IgnoreSettings.Listener() {
@Override
public void onChange(@NotNull KEY key, Object value) {
switch (key) {

case IGNORED_FILE_STATUS:
toggle((Boolean) value);
break;

case OUTER_IGNORE_RULES:
case LANGUAGES:
if (isEnabled()) {
cache.clear();
enable();
}
break;

}
}
});
cache = new CacheMap(project);
psiManager = (PsiManagerImpl) PsiManager.getInstance(project);
virtualFileManager = VirtualFileManager.getInstance();
queue = new BackgroundTaskQueue(project, IgnoreBundle.message("cache.indexing"));
settings = IgnoreSettings.getInstance();
}

/**
Expand Down Expand Up @@ -240,13 +248,7 @@ public boolean isFileIgnored(final VirtualFile file) {
* @return enabled
*/
private boolean isEnabled() {
boolean enabled = settings.isIgnoredFileStatus();
if (enabled && !working) {
enable();
} else if (!enabled && working) {
disable();
}
return enabled;
return settings.isIgnoredFileStatus();
}

/**
Expand All @@ -265,10 +267,57 @@ public void projectOpened() {
* Enable manager.
*/
private void enable() {
this.virtualFileManager.addVirtualFileListener(virtualFileListener);
this.psiManager.addPsiTreeChangeListener(psiTreeChangeListener);
this.working = true;
if (working) {
return;
}

virtualFileManager.addVirtualFileListener(virtualFileListener);
psiManager.addPsiTreeChangeListener(psiTreeChangeListener);
settings.addListener(settingsListener);
working = true;

retrieve();
}

/**
* Invoked when the project corresponding to this component instance is closed.<p>
* Note that components may be created for even unopened projects and this method can be never
* invoked for a particular component instance (for example for default project).
*/
@Override
public void projectClosed() {
disable();
}

/**
* Disable manager.
*/
private void disable() {
alarm.cancelAllRequests();
virtualFileManager.removeVirtualFileListener(virtualFileListener);
psiManager.removePsiTreeChangeListener(psiTreeChangeListener);
settings.removeListener(settingsListener);
cache.clear();
working = false;
}

/**
* Runs {@link #enable()} or {@link #disable()} depending on the passed value.
*
* @param enable or disable
*/
private void toggle(Boolean enable) {
if (enable) {
enable();
} else {
disable();
}
}

/**
* Triggers caching actions.
*/
private void retrieve() {
alarm.cancelAllRequests();
alarm.addRequest(new Runnable() {
@Override
Expand Down Expand Up @@ -324,39 +373,6 @@ public void run(@NotNull ProgressIndicator indicator) {
}, 200);
}

/**
* Invoked when the project corresponding to this component instance is closed.<p>
* Note that components may be created for even unopened projects and this method can be never
* invoked for a particular component instance (for example for default project).
*/
@Override
public void projectClosed() {
disable();
}

/**
* Disable manager.
*/
private void disable() {
this.virtualFileManager.removeVirtualFileListener(virtualFileListener);
this.psiManager.removePsiTreeChangeListener(psiTreeChangeListener);
this.cache.clear();
this.working = false;
}

/**
* Runs {@link #enable()} or {@link #disable()} depending on the passed value.
*
* @param enable or disable
*/
private void toggle(Boolean enable) {
if (enable) {
enable();
} else {
disable();
}
}

/**
* Unique name of this component. If there is another component with the same name or
* name is null internal assertion will occur.
Expand Down
2 changes: 1 addition & 1 deletion src/mobi/hsz/idea/gitignore/settings/IgnoreSettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ public String toString() {
/**
* Listeners list.
*/
private final List<Listener> listeners = ContainerUtil.newArrayList();
private final List<Listener> listeners = ContainerUtil.createLockFreeCopyOnWriteList();

/**
* Get the instance of this service.
Expand Down

0 comments on commit 2a62ace

Please sign in to comment.