package limitedwip.common;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.extensions.ExtensionPoint;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vcs.CheckinProjectPanel;
import com.intellij.openapi.vcs.changes.ChangeListManager;
import com.intellij.openapi.vcs.changes.CommitContext;
import com.intellij.openapi.vcs.checkin.CheckinHandler;
import com.intellij.openapi.vcs.checkin.CheckinHandlerFactory;
import org.jetbrains.annotations.NotNull;
public class LimitedWipCheckin extends CheckinHandlerFactory {
private static final String EXTENSION_POINT_NAME = "LimitedWIP.checkinListener";
@NotNull @Override public CheckinHandler createHandler(@NotNull final CheckinProjectPanel panel, @NotNull CommitContext commitContext) {
return new CheckinHandler() {
@Override public void checkinSuccessful() {
Project project = panel.getProject();
ChangeListManager changeListManager = ChangeListManager.getInstance(project);
int uncommittedFileCount = changeListManager.getDefaultChangeList().getChanges().size() - panel.getSelectedChanges().size();
boolean allFileAreCommitted = uncommittedFileCount == 0;
notifySettingsListeners(allFileAreCommitted);
}
};
}
private void notifySettingsListeners(boolean allFileAreCommitted) {
final ExtensionPoint<Listener> extensionPoint = Extensions.getRootArea().getExtensionPoint(EXTENSION_POINT_NAME);
for (Listener listener : extensionPoint.getExtensions()) {
listener.onSuccessfulCheckin(allFileAreCommitted);
}
}
public static void registerListener(Disposable disposable, final Listener listener) {
final ExtensionPoint<Listener> extensionPoint = Extensions.getRootArea().getExtensionPoint(EXTENSION_POINT_NAME);
extensionPoint.registerExtension(listener);
Disposer.register(disposable, new Disposable() {
@Override public void dispose() {
extensionPoint.unregisterExtension(listener);
}
});
}
public interface Listener {
void onSuccessfulCheckin(boolean allFileAreCommitted);
}
}