import com.intellij.util.Alarm;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
+import com.intellij.util.SmartList;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.*;
public abstract class DiffViewerBase implements DiffViewer, DataProvider {
protected static final Logger LOG = Logger.getInstance(DiffViewerBase.class);
+ @NotNull private final List<DiffViewerListener> myListeners = new SmartList<DiffViewerListener>();
+
@Nullable protected final Project myProject;
@NotNull protected final DiffContext myContext;
@NotNull protected final ContentDiffRequest myRequest;
components.popupActions = createPopupActions();
components.statusPanel = getStatusPanel();
+ fireEvent(EventType.INIT);
+
rediff(true);
return components;
}
abortRediff();
updateContextHints();
+ fireEvent(EventType.DISPOSE);
+
onDispose();
}
};
public final void abortRediff() {
myTaskExecutor.abort();
myTaskAlarm.cancelAllRequests();
+ fireEvent(EventType.REDIFF_ABORTED);
}
@CalledInAwt
if (isDisposed()) return;
abortRediff();
+ fireEvent(EventType.BEFORE_REDIFF);
onBeforeRediff();
// most of performRediff implementations take ReadLock inside. If EDT is holding write lock - this will never happen,
myTaskExecutor.executeAndTryWait(
new Function<ProgressIndicator, Runnable>() {
@Override
- public Runnable fun(ProgressIndicator indicator) {
- return performRediff(indicator);
+ public Runnable fun(final ProgressIndicator indicator) {
+ final Runnable callback = performRediff(indicator);
+ return new Runnable() {
+ @Override
+ public void run() {
+ callback.run();
+ onAfterRediff();
+ fireEvent(EventType.AFTER_REDIFF);
+ }
+ };
}
},
new Runnable() {
protected void onBeforeRediff() {
}
+ @CalledInAwt
+ protected void onAfterRediff() {
+ }
+
@CalledInBackground
@NotNull
protected abstract Runnable performRediff(@NotNull ProgressIndicator indicator);
return null;
}
+ //
+ // Listeners
+ //
+
+ @CalledInAwt
+ public void addListener(@NotNull DiffViewerListener listener) {
+ myListeners.add(listener);
+ }
+
+ @CalledInAwt
+ public void removeListener(@NotNull DiffViewerListener listener) {
+ myListeners.remove(listener);
+ }
+
+ @NotNull
+ @CalledInAwt
+ protected List<DiffViewerListener> getListeners() {
+ return myListeners;
+ }
+
+ @CalledInAwt
+ private void fireEvent(@NotNull EventType type) {
+ for (DiffViewerListener listener : myListeners) {
+ switch (type) {
+ case INIT:
+ listener.onInit();
+ break;
+ case DISPOSE:
+ listener.onDispose();
+ break;
+ case BEFORE_REDIFF:
+ listener.onBeforeRediff();
+ break;
+ case AFTER_REDIFF:
+ listener.onAfterRediff();
+ break;
+ case REDIFF_ABORTED:
+ listener.onRediffAborted();
+ break;
+ }
+ }
+ }
//
// Helpers
return null;
}
}
+
+ private enum EventType {
+ INIT, DISPOSE, BEFORE_REDIFF, AFTER_REDIFF, REDIFF_ABORTED,
+ }
}
--- /dev/null
+/*
+ * Copyright 2000-2015 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.diff.tools.util.base;
+
+import org.jetbrains.annotations.CalledInAwt;
+
+public class DiffViewerListener {
+ @CalledInAwt
+ protected void onInit() {
+ }
+
+ @CalledInAwt
+ protected void onDispose() {
+ }
+
+ @CalledInAwt
+ protected void onBeforeRediff() {
+ }
+
+ @CalledInAwt
+ protected void onAfterRediff() {
+ }
+
+ @CalledInAwt
+ protected void onRediffAborted() {
+ }
+}