This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 189472
Collapse All | Expand All

(-)a/projectapi/src/org/netbeans/api/project/ProjectUtils.java (+11 lines)
Lines 268-273 Link Here
268
        private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
268
        private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
269
        private final Set<ProjectIconAnnotator> annotators = new WeakSet<ProjectIconAnnotator>();
269
        private final Set<ProjectIconAnnotator> annotators = new WeakSet<ProjectIconAnnotator>();
270
        private final Result<ProjectIconAnnotator> annotatorResult = Lookup.getDefault().lookupResult(ProjectIconAnnotator.class);
270
        private final Result<ProjectIconAnnotator> annotatorResult = Lookup.getDefault().lookupResult(ProjectIconAnnotator.class);
271
        private final Result<ProjectIconAnnotator> projectAnnotatorResult;
271
        private Icon icon;
272
        private Icon icon;
272
273
273
        @SuppressWarnings("LeakingThisInConstructor")
274
        @SuppressWarnings("LeakingThisInConstructor")
Lines 275-280 Link Here
275
            pinfo = pi;
276
            pinfo = pi;
276
            pinfo.addPropertyChangeListener(WeakListeners.propertyChange(this, pinfo));
277
            pinfo.addPropertyChangeListener(WeakListeners.propertyChange(this, pinfo));
277
            annotatorResult.addLookupListener(this);
278
            annotatorResult.addLookupListener(this);
279
            projectAnnotatorResult = pinfo.getProject().getLookup().lookupResult(ProjectIconAnnotator.class);
280
            projectAnnotatorResult.addLookupListener(this);
278
            annotatorsChanged();
281
            annotatorsChanged();
279
        }
282
        }
280
283
Lines 284-289 Link Here
284
                    pa.addChangeListener(WeakListeners.change(this, pa));
287
                    pa.addChangeListener(WeakListeners.change(this, pa));
285
                }
288
                }
286
            }
289
            }
290
            for (ProjectIconAnnotator pa : projectAnnotatorResult.allInstances()) {
291
                if (annotators.add(pa)) {
292
                    pa.addChangeListener(WeakListeners.change(this, pa));
293
                }
294
            }
287
            updateIcon();
295
            updateIcon();
288
        }
296
        }
289
297
Lines 313-318 Link Here
313
            for (ProjectIconAnnotator pa : annotatorResult.allInstances()) {
321
            for (ProjectIconAnnotator pa : annotatorResult.allInstances()) {
314
                _icon = pa.annotateIcon(getProject(), _icon, false);
322
                _icon = pa.annotateIcon(getProject(), _icon, false);
315
            }
323
            }
324
            for (ProjectIconAnnotator pa : projectAnnotatorResult.allInstances()) {
325
                _icon = pa.annotateIcon(getProject(), _icon, false);
326
            }
316
            Icon old = icon;
327
            Icon old = icon;
317
            icon = ImageUtilities.image2Icon(_icon);
328
            icon = ImageUtilities.image2Icon(_icon);
318
            pcs.firePropertyChange(ProjectInformation.PROP_ICON, old, icon);
329
            pcs.firePropertyChange(ProjectInformation.PROP_ICON, old, icon);
(-)a/projectui/src/org/netbeans/modules/project/ui/ProjectsRootNode.java (-1 / +17 lines)
Lines 485-490 Link Here
485
            }
485
            }
486
        });
486
        });
487
        private final Lookup.Result<ProjectIconAnnotator> result = Lookup.getDefault().lookupResult(ProjectIconAnnotator.class);
487
        private final Lookup.Result<ProjectIconAnnotator> result = Lookup.getDefault().lookupResult(ProjectIconAnnotator.class);
488
        private volatile Lookup.Result<ProjectIconAnnotator> projectResult;
489
        private final AnnotationListener annotationListener;
488
        class AnnotationListener implements LookupListener, ChangeListener {
490
        class AnnotationListener implements LookupListener, ChangeListener {
489
            private final Set<ProjectIconAnnotator> annotators = new WeakSet<ProjectIconAnnotator>();
491
            private final Set<ProjectIconAnnotator> annotators = new WeakSet<ProjectIconAnnotator>();
490
            void init() {
492
            void init() {
Lines 493-498 Link Here
493
                        annotator.addChangeListener(WeakListeners.change(this, annotator));
495
                        annotator.addChangeListener(WeakListeners.change(this, annotator));
494
                    }
496
                    }
495
                }
497
                }
498
                for (ProjectIconAnnotator annotator : projectResult.allInstances()) {
499
                    if (annotators.add(annotator)) {
500
                        annotator.addChangeListener(WeakListeners.change(this, annotator));
501
                    }
502
                }
496
            }
503
            }
497
            public @Override void resultChanged(LookupEvent ev) {
504
            public @Override void resultChanged(LookupEvent ev) {
498
                init();
505
                init();
Lines 513-521 Link Here
513
            OpenProjectList.getDefault().addPropertyChangeListener(WeakListeners.propertyChange(this, OpenProjectList.getDefault()));
520
            OpenProjectList.getDefault().addPropertyChangeListener(WeakListeners.propertyChange(this, OpenProjectList.getDefault()));
514
            setProjectFiles();
521
            setProjectFiles();
515
            OpenProjectList.log(Level.FINER, "BadgingNode finished {0}", toStringForLog()); // NOI18N
522
            OpenProjectList.log(Level.FINER, "BadgingNode finished {0}", toStringForLog()); // NOI18N
516
            AnnotationListener annotationListener = new AnnotationListener();
523
524
            projectResult = p.project.getLookup().lookupResult(ProjectIconAnnotator.class);
525
            annotationListener = new AnnotationListener();
517
            annotationListener.init();
526
            annotationListener.init();
518
            result.addLookupListener(annotationListener);
527
            result.addLookupListener(annotationListener);
528
            projectResult.addLookupListener(annotationListener);
519
        }
529
        }
520
        
530
        
521
        private static Lookup badgingLookup(Node n, boolean addSearchInfo) {
531
        private static Lookup badgingLookup(Node n, boolean addSearchInfo) {
Lines 560-565 Link Here
560
                Node n = null;
570
                Node n = null;
561
                if (logicalView) {
571
                if (logicalView) {
562
                    n = ch.logicalViewForProject(newProj, null);
572
                    n = ch.logicalViewForProject(newProj, null);
573
                    projectResult.removeLookupListener(annotationListener);
574
                    projectResult = newProj.getLookup().lookupResult(ProjectIconAnnotator.class);
575
                    projectResult.addLookupListener(annotationListener);
563
                    OpenProjectList.log(Level.FINER, "logical view {0}", n);
576
                    OpenProjectList.log(Level.FINER, "logical view {0}", n);
564
                } else {
577
                } else {
565
                    Node[] arr = PhysicalView.createNodesForProject(newProj);
578
                    Node[] arr = PhysicalView.createNodesForProject(newProj);
Lines 810-815 Link Here
810
                    for (ProjectIconAnnotator pa : result.allInstances()) {
823
                    for (ProjectIconAnnotator pa : result.allInstances()) {
811
                        img = pa.annotateIcon(p, img, opened);
824
                        img = pa.annotateIcon(p, img, opened);
812
                    }
825
                    }
826
                    for (ProjectIconAnnotator pa : projectResult.allInstances()) {
827
                        img = pa.annotateIcon(p, img, opened);
828
                    }
813
                }
829
                }
814
            }
830
            }
815
831
(-)a/projectui/test/unit/src/org/netbeans/modules/project/ui/ProjectsRootNodeTest.java (-33 / +53 lines)
Lines 355-396 Link Here
355
        assertEquals(new HashSet<FileObject>(Arrays.asList(k1, k2, k3)), fs.badgedFiles);
355
        assertEquals(new HashSet<FileObject>(Arrays.asList(k1, k2, k3)), fs.badgedFiles);
356
    }
356
    }
357
357
358
    public void testIconAnnotated() throws IOException, Exception {
358
    public void testIconAnnotatedDefaultLookup() throws IOException, Exception {
359
        final Image icon1 = ImageUtilities.loadImage("org/netbeans/modules/project/ui/resources/icon-1.png");
360
        final Image icon2 = ImageUtilities.loadImage("org/netbeans/modules/project/ui/resources/icon-2.png");
361
        final Image icon3 = ImageUtilities.loadImage("org/netbeans/modules/project/ui/resources/icon-3.png");
362
        class ProjectIconAnnotatorImpl implements ProjectIconAnnotator {
363
            private final ChangeSupport cs = new ChangeSupport(this);
364
            boolean enabled = true;
365
            public @Override Image annotateIcon(Project p, Image original, boolean openedNode) {
366
                if (!enabled) {
367
                    return icon1;
368
                } else if (openedNode) {
369
                    return icon2;
370
                } else {
371
                    return icon3;
372
                }
373
            }
374
            public @Override void addChangeListener(ChangeListener listener) {
375
                cs.addChangeListener(listener);
376
            }
377
            public @Override void removeChangeListener(ChangeListener listener) {
378
                cs.removeChangeListener(listener);
379
            }
380
            void disable() {
381
                enabled = false;
382
                cs.fireChange();
383
            }
384
        }
385
        Project prj = new TestProject(FileUtil.createMemoryFileSystem().getRoot(), null);
359
        Project prj = new TestProject(FileUtil.createMemoryFileSystem().getRoot(), null);
386
        ProjectIconAnnotatorImpl annotator = new ProjectIconAnnotatorImpl();
360
        ProjectIconAnnotatorImpl annotator = new ProjectIconAnnotatorImpl();
387
        MockLookup.setInstances(annotator);
361
        MockLookup.setInstances(annotator);
362
        final MockPropertyChangeListener listener = new MockPropertyChangeListener();
363
364
        ProjectsRootNode.BadgingNode node = testBadgingNode(prj, annotator, listener);
365
        MockLookup.setInstances();
366
        listener.assertEvents(Node.PROP_ICON, Node.PROP_OPENED_ICON);
367
368
        // no icons now
369
        assertEquals(Node.EMPTY.getIcon(BeanInfo.ICON_COLOR_16x16), node.getIcon(BeanInfo.ICON_COLOR_16x16));
370
        assertEquals(Node.EMPTY.getIcon(BeanInfo.ICON_COLOR_16x16), node.getOpenedIcon(BeanInfo.ICON_COLOR_16x16));
371
    }
372
373
    public void testIconAnnotatedProjectLookup() throws IOException, Exception {
374
        ProjectIconAnnotatorImpl annotator = new ProjectIconAnnotatorImpl();
375
        TestProject prj = new TestProject(FileUtil.createMemoryFileSystem().getRoot(), null);
376
        prj.setLookup(Lookups.fixed(annotator));
377
        final MockPropertyChangeListener listener = new MockPropertyChangeListener();
378
379
        testBadgingNode(prj, annotator, listener);
380
    }
381
382
    private ProjectsRootNode.BadgingNode testBadgingNode(Project prj, ProjectIconAnnotatorImpl annotator, final MockPropertyChangeListener listener) {
388
        System.setProperty("test.nodelay", "true");
383
        System.setProperty("test.nodelay", "true");
389
        ProjectsRootNode.BadgingNode node = new ProjectsRootNode.BadgingNode(null, new ProjectsRootNode.ProjectChildren.Pair(prj),
384
        ProjectsRootNode.BadgingNode node = new ProjectsRootNode.BadgingNode(null, new ProjectsRootNode.ProjectChildren.Pair(prj),
390
                new AbstractNode(Children.LEAF, Lookups.singleton(prj)), false, true);
385
                new AbstractNode(Children.LEAF, Lookups.singleton(prj)), false, true);
391
        assertEquals(icon3, node.getIcon(BeanInfo.ICON_COLOR_16x16));
386
        assertEquals(ProjectIconAnnotatorImpl.ICON3, node.getIcon(BeanInfo.ICON_COLOR_16x16));
392
        assertEquals(icon2, node.getOpenedIcon(BeanInfo.ICON_COLOR_16x16));
387
        assertEquals(ProjectIconAnnotatorImpl.ICON2, node.getOpenedIcon(BeanInfo.ICON_COLOR_16x16));
393
        final MockPropertyChangeListener listener = new MockPropertyChangeListener();
394
        node.addNodeListener(new NodeAdapter() {
388
        node.addNodeListener(new NodeAdapter() {
395
            public @Override void propertyChange(PropertyChangeEvent ev) {
389
            public @Override void propertyChange(PropertyChangeEvent ev) {
396
                listener.propertyChange(ev);
390
                listener.propertyChange(ev);
Lines 398-406 Link Here
398
        });
392
        });
399
        annotator.disable();
393
        annotator.disable();
400
        listener.assertEvents(Node.PROP_ICON, Node.PROP_OPENED_ICON);
394
        listener.assertEvents(Node.PROP_ICON, Node.PROP_OPENED_ICON);
401
        assertEquals(icon1, node.getIcon(BeanInfo.ICON_COLOR_16x16));
395
        assertEquals(ProjectIconAnnotatorImpl.ICON1, node.getIcon(BeanInfo.ICON_COLOR_16x16));
402
        MockLookup.setInstances();
396
        return node;
403
        listener.assertEvents(Node.PROP_ICON, Node.PROP_OPENED_ICON);
404
    }
397
    }
405
398
399
    static final class ProjectIconAnnotatorImpl implements ProjectIconAnnotator {
400
        static final Image ICON1 = ImageUtilities.loadImage("org/netbeans/modules/project/ui/resources/icon-1.png");
401
        static final Image ICON2 = ImageUtilities.loadImage("org/netbeans/modules/project/ui/resources/icon-2.png");
402
        static final Image ICON3 = ImageUtilities.loadImage("org/netbeans/modules/project/ui/resources/icon-3.png");
403
404
        private final ChangeSupport cs = new ChangeSupport(this);
405
        boolean enabled = true;
406
        public @Override Image annotateIcon(Project p, Image original, boolean openedNode) {
407
            if (!enabled) {
408
                return ICON1;
409
            } else if (openedNode) {
410
                return ICON2;
411
            } else {
412
                return ICON3;
413
            }
414
        }
415
        public @Override void addChangeListener(ChangeListener listener) {
416
            cs.addChangeListener(listener);
417
        }
418
        public @Override void removeChangeListener(ChangeListener listener) {
419
            cs.removeChangeListener(listener);
420
        }
421
        void disable() {
422
            enabled = false;
423
            cs.fireChange();
424
        }
425
    }
406
}
426
}

Return to bug 189472