blob: 788fbe6e9344a083b1b8e40813fd8872ff6fa840 [file] [log] [blame]
/*
* 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.
*/
package org.netbeans.modules.gradle;
import java.beans.PropertyChangeListener;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;
import java.util.prefs.Preferences;
import javax.swing.event.ChangeListener;
import org.netbeans.api.project.Project;
import org.netbeans.modules.gradle.api.GradleBaseProject;
import org.netbeans.modules.gradle.api.GradleTask;
import org.netbeans.modules.gradle.api.NbGradleProject;
import org.netbeans.spi.project.ProjectServiceProvider;
import org.openide.util.ChangeSupport;
import org.openide.util.WeakListeners;
/**
*
* @author lkishalmi
*/
@ProjectServiceProvider(service = FavoriteTaskManager.class, projectType = NbGradleProject.GRADLE_PROJECT_TYPE)
public final class FavoriteTaskManager {
Set<GradleTask> favorites;
private static final String FAVORITE_TASKS_PROP = "favorite.tasks"; //NOI18N
ChangeSupport support;
PropertyChangeListener listener;
private boolean loaded;
final Project project;
public FavoriteTaskManager(Project p) {
project = p;
listener = (e) -> updateFavorites(p);
NbGradleProject.addPropertyChangeListener(p, WeakListeners.propertyChange(listener, NbGradleProject.get(p)));
}
public boolean isFavorite(GradleTask task) {
return favorites() != null ? favorites().contains(task) : false;
}
public void setFavorite(GradleTask task, boolean favorite) {
boolean changed = false;
if (favorites == null) {
changed = true;
favorites = new TreeSet<>(Comparator.comparing(GradleTask::getName));
}
changed = favorite ? favorites.add(task) : favorites.remove(task);
if (changed) {
StringBuilder sb = new StringBuilder();
String separator = "";
for (GradleTask t : favorites) {
sb.append(separator).append(t.getName());
separator = ",";
}
Preferences prefs = NbGradleProject.getPreferences(project, false);
prefs.put(FAVORITE_TASKS_PROP, sb.toString());
fireChange();
}
}
public Set<GradleTask> getFavoriteTasks() {
return favorites() != null ? new LinkedHashSet<>(favorites) : Collections.emptySet();
}
public void addChangeListener(ChangeListener l) {
if (support == null) {
support = new ChangeSupport(this);
}
support.addChangeListener(l);
}
public void removeChangeListener(ChangeListener l) {
if (support != null) {
support.removeChangeListener(l);
if (!support.hasListeners()) {
support = null;
}
}
}
private void fireChange() {
if (support != null) {
support.fireChange();
}
}
private void updateFavorites(Project project) {
Preferences prefs = NbGradleProject.getPreferences(project, false);
String favoriteProp = prefs.get(FAVORITE_TASKS_PROP, ""); //NOI18N
GradleBaseProject gbp = GradleBaseProject.get(project);
if (gbp != null) {
Set<GradleTask> newFavorites = new TreeSet<>(Comparator.comparing(GradleTask::getName));
for (String taskName : favoriteProp.split(",")) {
GradleTask task = gbp.getTaskByName(taskName);
if (task != null) {
newFavorites.add(task);
}
}
if (!Objects.equals(favorites, newFavorites)) {
favorites = newFavorites;
fireChange();
}
} else {
if (favorites != null) {
favorites = null;
fireChange();
}
}
}
private Set<GradleTask> favorites() {
if (!loaded) {
updateFavorites(project);
loaded = true;
}
return favorites;
}
}