Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import java.net.URL;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import javax.swing.Action;
import javax.swing.Icon;
import org.netbeans.api.project.Project;
Expand All @@ -34,7 +33,6 @@
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.filesystems.URLMapper;
import org.openide.loaders.DataObject;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
Expand All @@ -55,6 +53,7 @@ final class LazyProject implements
URL url;
String displayName;
ExtIcon icon;
private FileObject fo;

public LazyProject(URL url, String displayName, ExtIcon icon) {
super();
Expand All @@ -65,7 +64,10 @@ public LazyProject(URL url, String displayName, ExtIcon icon) {

@Override
public FileObject getProjectDirectory() {
FileObject fo = URLMapper.findFileObject(url);
if (fo != null) {
return fo;
}
fo = URLMapper.findFileObject(url);
if (fo == null) {
OpenProjectList.LOGGER.warning("Project dir with " + url + " not found!");
fo = FileUtil.createMemoryFileSystem().getRoot();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@
import org.netbeans.api.project.ui.ProjectGroup;
import org.netbeans.api.project.ui.ProjectGroupChangeEvent;
import org.netbeans.api.project.ui.ProjectGroupChangeListener;
import static org.netbeans.modules.project.ui.Bundle.*;
import org.netbeans.modules.project.ui.api.UnloadedProjectInformation;
import org.netbeans.modules.project.ui.groups.Group;
import org.netbeans.modules.project.uiapi.ProjectOpenedTrampoline;
Expand Down Expand Up @@ -109,6 +108,8 @@
import org.openide.util.lookup.ProxyLookup;
import org.openide.windows.WindowManager;

import static org.netbeans.modules.project.ui.Bundle.*;

/**
* List of projects open in the GUI.
* @author Petr Hrebejk
Expand Down Expand Up @@ -378,7 +379,7 @@ public void run() {
action = 2;
try {
progress.start();
loadOnBackground();
loadInBackground();
} finally {
progress.finish();
}
Expand Down Expand Up @@ -458,14 +459,14 @@ boolean closeBeforeOpen(final Project[] arr) {
"#NOI18N",
"LOAD_PROJECTS_ON_START=true"
})
private void loadOnBackground() {
private void loadInBackground() {
lazilyOpenedProjects = new ArrayList<>();
final boolean loadProjectsOnStart = "true".equals(Bundle.LOAD_PROJECTS_ON_START());
List<URL> urls = loadProjectsOnStart ?
OpenProjectListSettings.getInstance().getOpenProjectsURLs() :
Collections.emptyList();
final List<Project> initial = new ArrayList<>();
final LinkedList<Project> projects = URLs2Projects(urls);
final Collection<Project> projects = URLs2Projects(urls);
OpenProjectList.MUTEX.writeAccess(new Mutex.Action<Void>() {
public @Override Void run() {
toOpenProjects.addAll(projects);
Expand Down Expand Up @@ -1269,47 +1270,28 @@ public static Project fileToProject( File projectDir ) {

// Private methods ---------------------------------------------------------

private static LinkedList<Project> URLs2Projects( Collection<URL> URLs ) {
LinkedList<Project> result = new LinkedList<Project>();
for(URL url: URLs) {
FileObject dir = URLMapper.findFileObject( url );
if ( dir != null && dir.isFolder() ) {
private static Set<Project> URLs2Projects(Collection<URL> urls) {
Set<Project> result = new LinkedHashSet<>();

for (URL url : urls) {
FileObject dir = URLMapper.findFileObject(url);
if (dir != null && dir.isFolder()) {
try {
Project p = ProjectManager.getDefault().findProject( dir );
if ( p != null && !result.contains(p)) { //#238093, #238811 if multiple entries point to the same project we end up with the same instance multiple times in the linked list. That's wrong.
result.add( p );
Project p = ProjectManager.getDefault().findProject(dir);
if (p != null && !result.contains(p)) { //#238093, #238811 if multiple entries point to the same project we end up with the same instance multiple times in the linked list. That's wrong.
result.add(p);
}
}
catch ( Throwable t ) {
} catch (Throwable t) {
//something bad happened during loading the project.
//log the problem, but allow the other projects to be load
//see issue #65900
if (t instanceof ThreadDeath) {
throw (ThreadDeath) t;
}

//see issue #65900
ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, t);
}
}
}

return result;
}

private static List<URL> projects2URLs( Collection<Project> projects ) {
ArrayList<URL> URLs = new ArrayList<URL>( projects.size() );
for(Project p: projects) {
URL root = p.getProjectDirectory().toURL();
if ( root != null ) {
URLs.add( root );
}
}

return URLs;
}


private static boolean notifyOpened(Project p) {
boolean ok = true;
for (ProjectOpenedHook hook : p.getLookup().lookupAll(ProjectOpenedHook.class)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -412,19 +412,12 @@ final Node logicalViewForProject(
// PropertyChangeListener & NodeListener impl -----------------------------------------

@Override
public void propertyChange( PropertyChangeEvent e ) {
if ( OpenProjectList.PROPERTY_OPEN_PROJECTS.equals( e.getPropertyName() ) ) {
RP.post(new Runnable() {
public @Override void run() {
setKeys(getKeys());
}
});
} else if( PROP_DISPLAY_NAME.equals(e.getPropertyName()) ) {
RP.schedule(new Runnable() {
public @Override void run() {
setKeys( getKeys() );
}
}, 500, TimeUnit.MILLISECONDS);
public void propertyChange(PropertyChangeEvent e) {
switch (e.getPropertyName()) {
case OpenProjectList.PROPERTY_OPEN_PROJECTS ->
RP.post(() -> setKeys(getKeys()));
case PROP_DISPLAY_NAME ->
RP.schedule(() -> setKeys(getKeys()), 500, TimeUnit.MILLISECONDS);
}
}

Expand Down Expand Up @@ -627,10 +620,14 @@ public BadgingNode(ProjectChildren ch, ProjectChildren.Pair p, Node n, boolean l
this.ch = ch;
this.pair = p;
this.logicalView = logicalView;
OpenProjectList.log(Level.FINER, "BadgingNode init {0}", toStringForLog()); // NOI18N
if (LOG.isLoggable(Level.FINER)) {
LOG.log(Level.FINER, "BadgingNode init {0}", toStringForLog()); // NOI18N
}
OpenProjectList.getDefault().addPropertyChangeListener(WeakListeners.propertyChange(this, OpenProjectList.getDefault()));
setProjectFilesAsynch();
OpenProjectList.log(Level.FINER, "BadgingNode finished {0}", toStringForLog()); // NOI18N
if (LOG.isLoggable(Level.FINER)) {
LOG.log(Level.FINER, "BadgingNode finished {0}", toStringForLog()); // NOI18N
}
AnnotationListener annotationListener = new AnnotationListener(this);
annotationListener.init();
result.addLookupListener(annotationListener);
Expand All @@ -655,18 +652,25 @@ private void replaceProject(Project newProj) {
if (newProj == pair.project) {
return;
}
} catch (IOException ex) {
OpenProjectList.log(Level.INFO, "No project for " + pair.fo, ex); // NOI18N
} catch (IllegalArgumentException ex) {
OpenProjectList.log(Level.INFO, "No project for " + pair.fo, ex); // NOI18N
} catch (IOException | IllegalArgumentException ex) {
OpenProjectList.LOGGER.log(Level.INFO, "No project for " + pair.fo, ex); // NOI18N
}
}

// fast path before lookup. This method can be hot during startup.
if (newProj != null && !pair.fo.equals(newProj.getProjectDirectory())) {
return;
}

if (OpenProjectList.LOGGER.isLoggable(Level.FINER)) {
OpenProjectList.log(Level.FINER, "replacing for {0}", toStringForLog());
}

OpenProjectList.log(Level.FINER, "replacing for {0}", toStringForLog());

Project p = getLookup().lookup(Project.class);
if (p == null) {
OpenProjectList.log(Level.FINE, "no project in lookup {0}", toStringForLog());
if (OpenProjectList.LOGGER.isLoggable(Level.FINE)) {
OpenProjectList.log(Level.FINE, "no project in lookup {0}", toStringForLog());
}
return;
}
FileObject fo = p.getProjectDirectory();
Expand Down Expand Up @@ -696,24 +700,26 @@ private void replaceProject(Project newProj) {
n = Node.EMPTY;
}
}
OpenProjectList.log(Level.FINER, "change original: {0}", n);
OpenProjectList.log(Level.FINER, "children before change original: {0}", getChildren());
OpenProjectList.log(Level.FINER, "delegate children before change original: {0}", getOriginal().getChildren());
if (OpenProjectList.LOGGER.isLoggable(Level.FINER)) {
OpenProjectList.log(Level.FINER, "change original: {0}", n);
OpenProjectList.log(Level.FINER, "children before change original: {0}", getChildren());
OpenProjectList.log(Level.FINER, "delegate children before change original: {0}", getOriginal().getChildren());
}
changeOriginal(n, true);
OpenProjectList.log(Level.FINER, "delegate after change original: {0}", getOriginal());
OpenProjectList.log(Level.FINER, "name after change original: {0}", getName());
OpenProjectList.log(Level.FINER, "children after change original: {0}", getChildren());
OpenProjectList.log(Level.FINER, "delegate children after change original: {0}", getOriginal().getChildren());
if (OpenProjectList.LOGGER.isLoggable(Level.FINER)) {
OpenProjectList.log(Level.FINER, "delegate after change original: {0}", getOriginal());
OpenProjectList.log(Level.FINER, "name after change original: {0}", getName());
OpenProjectList.log(Level.FINER, "children after change original: {0}", getChildren());
OpenProjectList.log(Level.FINER, "delegate children after change original: {0}", getOriginal().getChildren());
}
BadgingLookup bl = (BadgingLookup) getLookup();
bl.setMyLookups(n.getLookup());
OpenProjectList.log(Level.FINER, "done {0}", toStringForLog());
if (OpenProjectList.LOGGER.isLoggable(Level.FINER)) {
OpenProjectList.log(Level.FINER, "done {0}", toStringForLog());
}
setProjectFilesAsynch();
} else {
FileObject newDir;
if (newProj != null) {
newDir = newProj.getProjectDirectory();
} else {
newDir = null;
if (newProj == null) {
//#228790 use RP instead of EventQueue.invokeLater, job can block on project write mutex
RP.post(new Runnable() {
@Override
Expand All @@ -722,7 +728,10 @@ public void run() {
}
});
}
OpenProjectList.log(Level.FINER, "wrong directories. current: " + fo + " new " + newDir);
if (OpenProjectList.LOGGER.isLoggable(Level.FINER)) {
FileObject newDir = newProj.getProjectDirectory();
OpenProjectList.log(Level.FINER, "wrong directories. current: " + fo + " new " + newDir);
}
}
}

Expand Down Expand Up @@ -925,16 +934,14 @@ private Image getIcon(int type, boolean opened) {
}

@Override
public void propertyChange( PropertyChangeEvent e ) {
if ( OpenProjectList.PROPERTY_MAIN_PROJECT.equals( e.getPropertyName() ) ) {
mainCache = null;
fireDisplayNameChange( null, null );
}
if ( OpenProjectList.PROPERTY_REPLACE.equals(e.getPropertyName())) {
replaceProject((Project)e.getNewValue());
}
if (SourceGroup.PROP_CONTAINERSHIP.equals(e.getPropertyName())) {
setProjectFilesAsynch();
public void propertyChange(PropertyChangeEvent e) {
switch (e.getPropertyName()) {
case OpenProjectList.PROPERTY_MAIN_PROJECT -> {
mainCache = null;
fireDisplayNameChange(null, null);
}
case OpenProjectList.PROPERTY_REPLACE -> replaceProject((Project)e.getNewValue());
case SourceGroup.PROP_CONTAINERSHIP -> setProjectFilesAsynch();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -206,28 +206,27 @@ public void setUI(ComboBoxUI ui) {
public ActiveConfigAction() {
super();
putValue("noIconInMenu", true); // NOI18N
EventQueue.invokeLater(new Runnable() {
public @Override void run() {
initConfigListCombo();
}
});
lst = new PropertyChangeListener() {
public @Override void propertyChange(PropertyChangeEvent evt) {
ProjectConfigurationProvider<?> _pcp;
synchronized (ActiveConfigAction.this) {
_pcp = pcp;
}
if (ProjectConfigurationProvider.PROP_CONFIGURATIONS.equals(evt.getPropertyName())) {
EventQueue.invokeLater(this::initConfigListCombo);
lst = (PropertyChangeEvent evt) -> {
switch (evt.getPropertyName()) {
case ProjectConfigurationProvider.PROP_CONFIGURATIONS -> {
ProjectConfigurationProvider<?> _pcp;
synchronized (ActiveConfigAction.this) {
_pcp = pcp;
}
configurationsListChanged(_pcp != null ? getConfigurations(_pcp) : null);
} else if (ProjectConfigurationProvider.PROP_CONFIGURATION_ACTIVE.equals(evt.getPropertyName())) {
}
case ProjectConfigurationProvider.PROP_CONFIGURATION_ACTIVE -> {
ProjectConfigurationProvider<?> _pcp;
synchronized (ActiveConfigAction.this) {
_pcp = pcp;
}
activeConfigurationChanged(_pcp != null ? getActiveConfiguration(_pcp) : null);
}
}
};
looklst = new LookupListener() {
public @Override void resultChanged(LookupEvent ev) {
activeProjectProviderChanged();
}
looklst = (LookupEvent ev) -> {
activeProjectProviderChanged();
};

OpenProjectList.getDefault().addPropertyChangeListener(WeakListeners.propertyChange(this, OpenProjectList.getDefault()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ui.OpenProjects;
import org.netbeans.modules.project.ui.OpenProjectList;
import static org.netbeans.modules.project.ui.actions.Bundle.*;
import org.netbeans.spi.project.ui.support.ProjectActionPerformer;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
Expand All @@ -40,6 +39,10 @@
import org.openide.util.NbBundle.Messages;
import org.openide.util.WeakListeners;

import static org.netbeans.modules.project.ui.actions.Bundle.*;
import static org.netbeans.modules.project.ui.OpenProjectList.PROPERTY_MAIN_PROJECT;
import static org.netbeans.modules.project.ui.OpenProjectList.PROPERTY_OPEN_PROJECTS;

/**
* Similar to {@link ProjectAction} but has a different selection model.
* First uses the main project, if set.
Expand Down Expand Up @@ -134,10 +137,12 @@ public void run() {
}
}

public @Override void propertyChange( PropertyChangeEvent evt ) {
if (OpenProjectList.PROPERTY_MAIN_PROJECT.equals(evt.getPropertyName()) ||
OpenProjectList.PROPERTY_OPEN_PROJECTS.equals(evt.getPropertyName())) {
refreshView(null, false);
@Override
public void propertyChange(PropertyChangeEvent evt) {
switch (evt.getPropertyName()) {
case PROPERTY_MAIN_PROJECT, PROPERTY_OPEN_PROJECTS -> {
refreshView(null, false);
}
}
}

Expand Down
Loading
Loading