001    package org.hackystat.projectbrowser.page.projectportfolio.detailspanel;
002    
003    import org.apache.wicket.AttributeModifier;
004    import org.apache.wicket.markup.html.basic.Label;
005    import org.apache.wicket.markup.html.link.BookmarkablePageLink;
006    import org.apache.wicket.markup.html.link.Link;
007    import org.apache.wicket.markup.html.list.ListItem;
008    import org.apache.wicket.markup.html.list.ListView;
009    import org.apache.wicket.markup.html.panel.Panel;
010    import org.apache.wicket.model.Model;
011    import org.hackystat.projectbrowser.ProjectBrowserApplication;
012    import org.hackystat.projectbrowser.ProjectBrowserSession;
013    import org.hackystat.projectbrowser.imageurl.ImageUrl;
014    import org.hackystat.projectbrowser.page.projectportfolio.ProjectPortfolioPage;
015    import org.hackystat.projectbrowser.page.projectportfolio.ProjectPortfolioSession;
016    import org.hackystat.projectbrowser.page.projectportfolio.detailspanel.chart.MiniBarChart;
017    import org.hackystat.projectbrowser.page.telemetry.TelemetryPage;
018    import org.hackystat.sensorbase.resource.projects.jaxb.Project;
019    
020    /**
021     * Wicket panel to display the detail of the selected projects.
022     * @author Shaoxuan Zhang
023     *
024     */
025    public class ProjectPortfolioDetailsPanel extends Panel {
026    
027      /** For serialization. */
028      private static final long serialVersionUID = 1L;
029      /** The session that holds the status. */
030      private ProjectPortfolioSession session = 
031            ProjectBrowserSession.get().getProjectPortfolioSession();
032      /** The model that holds the data. */
033      private ProjectPortfolioDataModel dataModel = session.getDataModel();
034      
035      /**
036       * Create the Wicket component.
037       * @param id the wicket id.
038       */
039      public ProjectPortfolioDetailsPanel(String id) {
040        super(id);
041        
042        BookmarkablePageLink permalink = new BookmarkablePageLink("permalink", 
043            ProjectPortfolioPage.class, session.getPageParameters());
044        add(permalink);
045    
046        Link sortProjectLink = new Link("sortProjectName") {
047          /** Support serialization. */
048          private static final long serialVersionUID = -5801192573412127312L;
049          @Override
050          public void onClick() {
051            dataModel.sortProjectNames();
052          }
053          
054        };
055        add(sortProjectLink);
056        
057        ListView measureHeads = new ListView("measureHeads", dataModel.getEnabledMeasuresName()) {
058          /** Support serialization. */
059          private static final long serialVersionUID = -6222175445067187421L;
060    
061          @Override
062          protected void populateItem(final ListItem item) {
063            final String measureName = item.getModelObjectAsString();
064            Link sortLink = new Link("sortLink") {
065              /** Support serialization. */
066              private static final long serialVersionUID = 1217586293098377714L;
067              @Override
068              public void onClick() {
069                dataModel.sortTable(item.getIndex());
070              }
071            };
072            sortLink.add(new Label("measureName", measureName));
073            item.add(sortLink);
074          }
075        };
076        add(measureHeads);
077        
078        ListView dateTable = new ListView("projectTable", dataModel.getSelectedProjects()) {
079          /** Support serialization. */
080          public static final long serialVersionUID = 1L;
081          @Override
082          protected void populateItem(ListItem item) {
083            Project project = (Project)item.getModelObject();
084            item.add(new Label("projectName", project.getName()));
085            item.add(new Label("members", String.valueOf(project.getMembers().getMember().size() + 1)));
086            
087            ListView dateList = new ListView("measures", dataModel.getMeasuresCharts().get(project)) {
088              /** Support serialization. */
089              public static final long serialVersionUID = 1L;
090              @Override
091              protected void populateItem(ListItem item) {
092                final MiniBarChart chart = (MiniBarChart)item.getModelObject();
093                
094                String value;
095                if (chart.getLatestValue() >= 0) {
096                  value = String.valueOf(chart.getLatestValue());
097                  int i = value.indexOf('.');
098                  if (i > 0 && (i + 2) < value.length()) {
099                    value = value.substring(0, i + 2);
100                  }
101                }
102                else {
103                  value = "N/A";
104                }
105                
106                Label valueLabel = new Label("value", value);
107                String colorString = "color:#" + chart.getValueColor();
108                valueLabel.add(new AttributeModifier("style", true, new Model(colorString)));
109                item.add(valueLabel);
110    
111                Link chartLink;
112                if (((ProjectBrowserApplication)getApplication()).isLoggingUserUsage()) {
113                  //Need to use Link to log because BookmarkablePageLink does not allow to override the
114                  //onClick method.
115                  chartLink = new Link("chartLink") {
116                    /** Support serialization. */
117                    private static final long serialVersionUID = 32587804920775165L;
118                    @Override
119                    public void onClick() {
120                      ProjectBrowserSession.get().
121                        logUsage("PORTFOLIO {invoke telemtry}");
122                      this.setResponsePage(TelemetryPage.class, chart.getTelemetryPageParameters());
123                    }
124                  };
125                }
126                else {
127                  chartLink = new BookmarkablePageLink("chartLink", 
128                      TelemetryPage.class, chart.getTelemetryPageParameters()) ;
129                }
130                chartLink.add(new ImageUrl("chart", chart.getImageUrl()));
131                item.add(chartLink);
132              }
133            };
134            item.add(dateList);
135          }
136        };
137        add(dateTable);
138        
139        
140      }
141    
142      /**
143       * Show the panel only when the data model is not empty and no loadin is in process.
144       * @return true when this panel should be shown.
145       */
146      @Override
147      public boolean isVisible() {
148        return !session.getDataModel().isEmpty() && session.getDataModel().isComplete();
149      }
150      
151    }