/*
* Copyright (c) 2015-2015 Vladimir Schneider <vladimir.schneider@gmail.com>
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*
* This file is based on the IntelliJ SimplePlugin tutorial
*
*/
package com.vladsch.idea.multimarkdown.settings;
import com.vladsch.idea.multimarkdown.util.ListenerNotifier;
public class SettingsNotifier<D> extends ListenerNotifier<SettingsListener<D>> {
private int groupNotifications;
private int suspendNotifications;
private boolean needToNotify;
private D settings;
public SettingsNotifier(D settings) {
this.settings = settings;
}
public int startSuspendNotifications() {
return suspendNotifications++;
}
public int endSuspendNotifications() {
if (suspendNotifications == 0) return 0;
suspendNotifications--;
return suspendNotifications;
}
public int startGroupNotifications() {
return groupNotifications++;
}
public int endGroupNotifications() {
if (groupNotifications == 0) return 0;
if (--groupNotifications == 0) {
if (needToNotify) {
needToNotify = false;
notifyListeners();
}
}
return groupNotifications;
}
public void notifyListeners() {
if (suspendNotifications > 0) return;
if (groupNotifications > 0) {
needToNotify = true;
} else {
super.notifyListeners(new RunnableNotifier<SettingsListener<D>>() {
@Override
public boolean notify(SettingsListener<D> listener) {
listener.handleSettingsChanged(settings);
return false;
}
});
}
}
}