mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[vcs]: add listener for Async update IgnoredHolder model changes
* refresh view when update mode changed;
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright 2000-2016 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.intellij.dvcs.repo;
|
||||
|
||||
import java.util.EventListener;
|
||||
|
||||
/**
|
||||
* The listener interface for handling async vcs files holder events.
|
||||
* When a files holder model starts/finishes to update itself -> updateStarted/Finished will be called for all subscribers.
|
||||
* e.g. vcs updates its ignored file model after that we should trigger ui update in ChangesView;
|
||||
* moreover, when long duration update starts we should also trigger some action;
|
||||
*/
|
||||
public interface AsyncFilesManagerListener extends EventListener {
|
||||
|
||||
void updateStarted();
|
||||
|
||||
void updateFinished();
|
||||
}
|
||||
+3
-1
@@ -46,6 +46,7 @@ public class IgnoredFilesCompositeHolder implements IgnoredFilesHolder {
|
||||
|
||||
@Override
|
||||
public void cleanAll() {
|
||||
myVcsIgnoredHolderMap.values().forEach(IgnoredFilesHolder::cleanAll);
|
||||
myVcsIgnoredHolderMap.clear();
|
||||
myIdeIgnoredFilesHolder.cleanAll();
|
||||
}
|
||||
@@ -97,7 +98,8 @@ public class IgnoredFilesCompositeHolder implements IgnoredFilesHolder {
|
||||
public Collection<VirtualFile> values() {
|
||||
final HashSet<VirtualFile> result = ContainerUtil.newHashSet();
|
||||
result.addAll(myIdeIgnoredFilesHolder.values());
|
||||
result.addAll(myVcsIgnoredHolderMap.values().stream().map(IgnoredFilesHolder::values).flatMap(set -> set.stream()).collect(Collectors.toSet()));
|
||||
result.addAll(
|
||||
myVcsIgnoredHolderMap.values().stream().map(IgnoredFilesHolder::values).flatMap(set -> set.stream()).collect(Collectors.toSet()));
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -15,12 +15,14 @@
|
||||
*/
|
||||
package org.zmlx.hg4idea.provider;
|
||||
|
||||
import com.intellij.dvcs.repo.AsyncFilesManagerListener;
|
||||
import com.intellij.openapi.Disposable;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.vcs.FilePath;
|
||||
import com.intellij.openapi.vcs.VcsException;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.util.Alarm;
|
||||
import com.intellij.util.EventDispatcher;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.ui.update.MergingUpdateQueue;
|
||||
import com.intellij.util.ui.update.Update;
|
||||
@@ -43,7 +45,7 @@ public class HgLocalIgnoredHolder implements Disposable {
|
||||
@NotNull private final HgRepository myRepository;
|
||||
@NotNull private final Set<VirtualFile> myIgnoredSet;
|
||||
@NotNull private final ReentrantReadWriteLock SET_LOCK = new ReentrantReadWriteLock();
|
||||
|
||||
private final EventDispatcher<AsyncFilesManagerListener> myListeners = EventDispatcher.create(AsyncFilesManagerListener.class);
|
||||
|
||||
public HgLocalIgnoredHolder(@NotNull HgRepository repository) {
|
||||
myRepository = repository;
|
||||
@@ -52,6 +54,10 @@ public class HgLocalIgnoredHolder implements Disposable {
|
||||
myUpdateQueue = new MergingUpdateQueue("HgIgnoreUpdate", 500, true, null, this, null, Alarm.ThreadToUse.POOLED_THREAD);
|
||||
}
|
||||
|
||||
public void addUpdateStateListener(@NotNull AsyncFilesManagerListener listener) {
|
||||
myListeners.addListener(listener, this);
|
||||
}
|
||||
|
||||
public void startRescan() {
|
||||
myUpdateQueue.queue(new Update("hgRescanIgnored") {
|
||||
@Override
|
||||
@@ -62,13 +68,23 @@ public class HgLocalIgnoredHolder implements Disposable {
|
||||
@Override
|
||||
public void run() {
|
||||
if (myInUpdateMode.compareAndSet(false, true)) {
|
||||
fireUpdateStarted();
|
||||
rescanAllIgnored();
|
||||
myInUpdateMode.set(false);
|
||||
fireUpdateFinished();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void fireUpdateStarted() {
|
||||
myListeners.getMulticaster().updateStarted();
|
||||
}
|
||||
|
||||
private void fireUpdateFinished() {
|
||||
myListeners.getMulticaster().updateFinished();
|
||||
}
|
||||
|
||||
private void rescanAllIgnored() {
|
||||
Set<VirtualFile> ignored = ContainerUtil.newHashSet();
|
||||
try {
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.zmlx.hg4idea.repo;
|
||||
|
||||
import com.intellij.dvcs.repo.AsyncFilesManagerListener;
|
||||
import com.intellij.dvcs.repo.RepositoryImpl;
|
||||
import com.intellij.openapi.Disposable;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
@@ -24,6 +25,8 @@ import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.openapi.util.Disposer;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.vcs.AbstractVcs;
|
||||
import com.intellij.openapi.vcs.changes.ChangesViewI;
|
||||
import com.intellij.openapi.vcs.changes.ChangesViewManager;
|
||||
import com.intellij.openapi.vfs.VfsUtilCore;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
@@ -65,6 +68,7 @@ public class HgRepositoryImpl extends RepositoryImpl implements HgRepository {
|
||||
myConfig = HgConfig.getInstance(getProject(), rootDir);
|
||||
myLocalIgnoredHolder = new HgLocalIgnoredHolder(this);
|
||||
Disposer.register(this, myLocalIgnoredHolder);
|
||||
myLocalIgnoredHolder.addUpdateStateListener(new MyIgnoredHolderAsyncListener(getProject()));
|
||||
update();
|
||||
}
|
||||
|
||||
@@ -265,4 +269,22 @@ public class HgRepositoryImpl extends RepositoryImpl implements HgRepository {
|
||||
public HgLocalIgnoredHolder getLocalIgnoredHolder() {
|
||||
return myLocalIgnoredHolder;
|
||||
}
|
||||
|
||||
private static class MyIgnoredHolderAsyncListener implements AsyncFilesManagerListener {
|
||||
@NotNull private final ChangesViewI myChangesViewI;
|
||||
|
||||
public MyIgnoredHolderAsyncListener(@NotNull Project project) {
|
||||
myChangesViewI = ChangesViewManager.getInstance(project);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateStarted() {
|
||||
myChangesViewI.scheduleRefresh();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateFinished() {
|
||||
myChangesViewI.scheduleRefresh();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user