Coverage Report - org.kuali.student.common.ui.client.mvc.breadcrumb.BreadcrumbManager
 
Classes in this File Line Coverage Branch Coverage Complexity
BreadcrumbManager
0%
0/67
0%
0/36
3.375
BreadcrumbManager$BreadcrumbData
0%
0/5
N/A
3.375
 
 1  
 package org.kuali.student.common.ui.client.mvc.breadcrumb;
 2  
 
 3  
 import java.util.ArrayList;
 4  
 import java.util.List;
 5  
 
 6  
 import org.kuali.student.common.ui.client.mvc.Controller;
 7  
 import org.kuali.student.common.ui.client.mvc.history.HistoryManager;
 8  
 import org.kuali.student.common.ui.client.widgets.field.layout.element.SpanPanel;
 9  
 
 10  
 import com.google.gwt.user.client.ui.ComplexPanel;
 11  
 import com.google.gwt.user.client.ui.Composite;
 12  
 import com.google.gwt.user.client.ui.Hyperlink;
 13  
 import com.google.gwt.user.client.ui.InlineLabel;
 14  
 import com.google.gwt.user.client.ui.Panel;
 15  
 import com.google.gwt.user.client.ui.Widget;
 16  
 
 17  
 /**
 18  
  * Manages breadcrumbs for the application
 19  
  * 
 20  
  * @author Kuali Student Team
 21  
  *
 22  
  */
 23  0
 public class BreadcrumbManager extends Composite{
 24  
         
 25  0
         public static List<Hyperlink> links = new ArrayList<Hyperlink>();
 26  
         
 27  0
         private static List<String> names = new ArrayList<String>();
 28  
         
 29  
         private static Controller root;
 30  0
         private static ComplexPanel panel = new SpanPanel();
 31  0
         private static boolean panelEmpty = true;
 32  
         
 33  
         private static Panel parentPanel;
 34  
         
 35  0
         private static class BreadcrumbData{
 36  
                 private String name;
 37  
                 private String path;
 38  
                 public BreadcrumbData(String name, String path) {
 39  0
                         super();
 40  0
                         this.name = name;
 41  0
                         this.path = path;
 42  0
                 }
 43  
         }
 44  
         
 45  
         /**
 46  
          * Binds the controller as the top level controller to call collectBreadcrumbNames on.
 47  
          * 
 48  
          * @param controller
 49  
          */
 50  
         public static void bind(Controller controller){
 51  0
                 root = controller;
 52  0
         }
 53  
         
 54  
         /**
 55  
          * Updates the breadcrumb panel with the current breadcrumb by walking the controller hierarchy by calling
 56  
          * collectBreadcrumbNames on the root controller bound to the BreadcrumbManager.
 57  
          * 
 58  
          * @param historyStack
 59  
          */
 60  
         public static void updateLinks(String historyStack){
 61  0
             if (root == null){
 62  0
                 return;
 63  
             }
 64  
             
 65  0
                 links.clear();
 66  0
                 panel.clear();
 67  0
                 panelEmpty = true;
 68  0
                 names.clear();
 69  0
                 root.collectBreadcrumbNames(names);
 70  
                 
 71  0
                 String[] arr = HistoryManager.splitHistoryStack(historyStack);
 72  0
                 List<BreadcrumbData> breadcrumbs = new ArrayList<BreadcrumbData>();
 73  
 
 74  0
                 if(arr.length == names.size()){
 75  0
                         String path = "";
 76  
                         //account for applicationController - skip first item from both
 77  0
                         for(int i = 1; i < names.size(); i++){
 78  0
                                 path = path + "/" + arr[i];
 79  0
                                 String name = names.get(i);
 80  
                                 //Views with empty names do not appear on the breadcrumbs
 81  0
                                 if(name != null && !name.isEmpty()){
 82  0
                                         breadcrumbs.add(new BreadcrumbData(name, path));
 83  
                                 }
 84  
                         }
 85  0
                 }
 86  
                 //Special link, a controller is adding a breadcrumb outside the scope of the current controller
 87  
                 //in format name@path
 88  0
                 else if(names.size() > arr.length){
 89  0
                         String path = "";
 90  0
                         int j = 1;
 91  
                         //account for applicationController - skip first item from both
 92  0
                         for(int i = 1; i < names.size(); i++){
 93  0
                                 String name = names.get(i);
 94  0
                                 if(name.contains("@")){
 95  0
                                         String[] split = name.split("@");
 96  0
                                         name = split[0];
 97  0
                                         if(name != null && !name.isEmpty()){
 98  
                                                 //In the special case the path is the second part of the split
 99  0
                                                 breadcrumbs.add(new BreadcrumbData(name, split[1]));
 100  
                                         }
 101  0
                                 }
 102  
                                 else{
 103  0
                                         if(j == arr.length){
 104  0
                                                 break;
 105  
                                         }
 106  0
                                         path = path + "/" + arr[j];
 107  0
                                         j++;
 108  0
                                         if(name != null && !name.isEmpty()){
 109  0
                                                 breadcrumbs.add(new BreadcrumbData(name, path));
 110  
                                         }
 111  
                                 }
 112  
                         }
 113  
                 }
 114  
                 
 115  0
                 if(parentPanel != null){
 116  0
                         if(breadcrumbs.size() == 1){
 117  0
                                 panel.getParent().setVisible(false);
 118  
                         }
 119  
                         else{
 120  0
                                 panel.getParent().setVisible(true);
 121  
 
 122  
                         }
 123  
                 }
 124  
                 
 125  0
                 for(int i = 0; i < breadcrumbs.size(); i++){
 126  0
                         if(i < breadcrumbs.size() - 1){
 127  0
                                 createLink(breadcrumbs.get(i).name, breadcrumbs.get(i).path);
 128  
                         }
 129  
                         else{
 130  0
                                 createLabel(breadcrumbs.get(i).name);
 131  
                                 //WindowTitleUtils.setSubtitle(breadcrumbs.get(i).name);
 132  
                         }
 133  
                 }
 134  0
         }
 135  
         
 136  
         private static void createLabel(String name){
 137  0
                 addToPanel(new InlineLabel(name));
 138  0
         }
 139  
         
 140  
         private static void createLink(String name, final String viewPath){
 141  0
                 Hyperlink link = new Hyperlink(name, viewPath);
 142  0
                 links.add(link);
 143  0
                 addToPanel(link);
 144  0
         }
 145  
         
 146  
         private static void addToPanel(Widget w){
 147  0
                 if(panelEmpty){
 148  0
                         panel.add(w);
 149  0
                         panelEmpty = false;
 150  
                 }
 151  
                 else{
 152  0
                         panel.add(new InlineLabel(" \u00BB "));
 153  0
                         panel.add(w);
 154  
                 }
 155  0
         }
 156  
         
 157  
         /** 
 158  
          * @return the breadcrumb panel which contains the breadcrumb links dynamically updated by the 
 159  
          * BreadcrumbManager
 160  
          */
 161  
         public static ComplexPanel getBreadcrumbPanel(){
 162  0
                 return panel;
 163  
         }
 164  
         
 165  
         public static void setParentPanel(Panel panel){
 166  0
                 parentPanel = panel;
 167  0
                 parentPanel.setVisible(false);
 168  0
         }
 169  
 
 170  
 }