Clover coverage report - DrJava Test Coverage (drjava-20120422-r5456)
Coverage timestamp: Sun Apr 22 2012 03:13:25 CDT
file stats: LOC: 124   Methods: 9
NCLOC: 42   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
AWTContainerNavigatorFactory.java - 100% 100% 100%
coverage
 1    /*BEGIN_COPYRIGHT_BLOCK
 2    *
 3    * Copyright (c) 2001-2010, JavaPLT group at Rice University (drjava@rice.edu)
 4    * All rights reserved.
 5    *
 6    * Redistribution and use in source and binary forms, with or without
 7    * modification, are permitted provided that the following conditions are met:
 8    * * Redistributions of source code must retain the above copyright
 9    * notice, this list of conditions and the following disclaimer.
 10    * * Redistributions in binary form must reproduce the above copyright
 11    * notice, this list of conditions and the following disclaimer in the
 12    * documentation and/or other materials provided with the distribution.
 13    * * Neither the names of DrJava, the JavaPLT group, Rice University, nor the
 14    * names of its contributors may be used to endorse or promote products
 15    * derived from this software without specific prior written permission.
 16    *
 17    * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 18    * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 19    * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 20    * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 21    * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 22    * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 23    * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 24    * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 25    * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 26    * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 27    * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 28    *
 29    * This software is Open Source Initiative approved Open Source Software.
 30    * Open Source Initative Approved is a trademark of the Open Source Initiative.
 31    *
 32    * This file is part of DrJava. Download the current version of this project
 33    * from http://www.drjava.org/ or http://sourceforge.net/projects/drjava/
 34    *
 35    * END_COPYRIGHT_BLOCK*/
 36   
 37    package edu.rice.cs.util.docnavigation;
 38   
 39    import edu.rice.cs.plt.tuple.Pair;
 40    import edu.rice.cs.util.swing.Utilities;
 41   
 42    import java.util.List;
 43    import java.util.*;
 44    import java.awt.event.FocusListener;
 45   
 46    public class AWTContainerNavigatorFactory<ItemT extends INavigatorItem> implements IDocumentNavigatorFactory<ItemT> {
 47   
 48  164 public AWTContainerNavigatorFactory() { }
 49   
 50    /** Creates a new List Navigator
 51    * @return a list navigator
 52    */
 53  161 public IDocumentNavigator<ItemT> makeListNavigator() { return new JListSortNavigator<ItemT>(); }
 54   
 55    /** Returns a new tree Navigator with the specified root
 56    * @param path the path name of the root node
 57    * @return a tree navigator
 58    */
 59  3 public IDocumentNavigator<ItemT> makeTreeNavigator(String path) { return new JTreeSortNavigator<ItemT>(path); }
 60   
 61    /** Creates a list navigator and migrates the navigator items from parent to the new navigator. The migration
 62    * is asynchronous but it completes before any subsequent computation in the event thread.
 63    * @param parent the navigator to migrate from
 64    * @return the new list navigator
 65    */
 66  2 public IDocumentNavigator<ItemT> makeListNavigator(final IDocumentNavigator<ItemT> parent) {
 67  2 final IDocumentNavigator<ItemT> child = makeListNavigator();
 68  2 Utilities.invokeLater(new Runnable() {
 69  2 public void run() {
 70    // synchronized(child.getModelLock()) { // dropped because of cost; each atomic action is still synchronized
 71  2 migrateNavigatorItems(child, parent);
 72  2 migrateListeners(child, parent);
 73    }
 74    // }
 75    });
 76  2 return child;
 77    }
 78   
 79    /** Creates a tree navigator and migrates the navigator items from the parent to the new navigator. The migration
 80    * is asynchronous but it completes before any subsequent computation in the event thread.
 81    * @param name the name of the root node
 82    * @param parent the navigator to migrate from
 83    * @return the new tree navigator
 84    */
 85  3 public IDocumentNavigator<ItemT> makeTreeNavigator(String name, final IDocumentNavigator<ItemT> parent,
 86    final List<Pair<String, INavigatorItemFilter<ItemT>>> l) {
 87   
 88  3 final IDocumentNavigator<ItemT> child = makeTreeNavigator(name);
 89  3 Utilities.invokeLater(new Runnable() {
 90  3 public void run() {
 91    // synchronized(child.getModelLock()) { // dropped because of cost; each atomic action is still synchronized
 92  9 for(Pair<String, INavigatorItemFilter<ItemT>> p: l) { child.addTopLevelGroup(p.first(), p.second()); }
 93  3 migrateNavigatorItems(child, parent);
 94  3 migrateListeners(child, parent);
 95    }
 96    // }
 97    });
 98  3 return child;
 99    }
 100   
 101    /** Migrates all the navigator items from parent to child
 102    * @param child the navigator to migrate to
 103    * @param parent the navigator to migrate from
 104    */
 105    // As a first step to weakening the restriction on parent's type, this allows parent to be based on an arbitrary item type, as
 106    // long as it extends ItemT.
 107  5 private void migrateNavigatorItems(IDocumentNavigator<ItemT> child, IDocumentNavigator<ItemT> parent) {
 108  5 ArrayList<ItemT> docs = parent.getDocuments();
 109  5 for (ItemT item: docs) child.addDocument(item);
 110   
 111  5 parent.clear(); // Remove documents from old navigator (parent)
 112    }
 113   
 114    /** Migrates all the listeners from parent to child
 115    * @param child the navigator to migrate to
 116    * @param parent the navigator to migrate from
 117    */
 118    // As a first step to weakening the restriction on parent's type, this allows parent to be based on an arbitrary item type, as
 119    // long as it extends ItemT.
 120  5 private void migrateListeners(IDocumentNavigator<ItemT> child, IDocumentNavigator<ItemT> parent) {
 121  5 for (INavigationListener<? super ItemT> nl: parent.getNavigatorListeners()) child.addNavigationListener(nl);
 122  20 for (FocusListener fl: parent.getFocusListeners()) child.addFocusListener(fl);
 123    }
 124    }