001    package org.hackystat.projectbrowser.page.telemetry.datapanel;
002    
003    import java.util.List;
004    import org.apache.wicket.AttributeModifier;
005    import org.apache.wicket.markup.html.WebComponent;
006    import org.apache.wicket.markup.html.basic.Label;
007    import org.apache.wicket.markup.html.form.CheckBox;
008    import org.apache.wicket.markup.html.form.Form;
009    import org.apache.wicket.markup.html.form.TextField;
010    import org.apache.wicket.markup.html.link.BookmarkablePageLink;
011    import org.apache.wicket.markup.html.list.ListItem;
012    import org.apache.wicket.markup.html.list.ListView;
013    import org.apache.wicket.markup.html.panel.Panel;
014    import org.apache.wicket.model.IModel;
015    import org.apache.wicket.model.Model;
016    import org.apache.wicket.model.PropertyModel;
017    import org.hackystat.projectbrowser.googlechart.GoogleChart;
018    import org.hackystat.projectbrowser.imageurl.ImageUrl;
019    import org.hackystat.projectbrowser.page.popupwindow.PopupWindowPanel;
020    import org.hackystat.projectbrowser.page.telemetry.TelemetryPage;
021    import org.hackystat.projectbrowser.page.telemetry.TelemetrySession;
022    import org.hackystat.sensorbase.resource.projects.jaxb.Project;
023    import org.hackystat.telemetry.service.resource.chart.jaxb.TelemetryPoint;
024    
025    /**
026     * Panel for showing telemetry content.
027     * 
028     * @author Shaoxuan Zhang
029     * 
030     */
031    public class TelemetryDataPanel extends Panel {
032      /** Support serialization. */
033      private static final long serialVersionUID = 1L;
034      /** TelemetrySession that hold the page state. */
035      TelemetrySession session;
036    
037      /**
038       * @param id the wicket component id.
039       * @param s the TelemetrySession.
040       */
041      public TelemetryDataPanel(String id, TelemetrySession s) {
042        super(id);
043        this.session = s;
044        IModel dataModel = new PropertyModel(session, "dataModel");
045    
046        BookmarkablePageLink restLink = new BookmarkablePageLink("restLink", TelemetryPage.class,
047            session.getPageParameters());
048    
049        // restLink.add(new Label("restLinkLabel", new Model(restLink)));
050        add(restLink);
051    
052        Form streamForm = new Form("streamForm") {
053          /** Support serialization. */
054          private static final long serialVersionUID = 1L;
055    
056          @Override
057          public void onSubmit() {
058            if (session.getDataModel().isSizeWithinRange()) {
059              if (!session.getDataModel().updateSelectedChart()) {
060                session.setFeedback("Failed to get a chart image. "
061                    + " Please check to make sure you've selected at least one stream!");
062              }
063            }
064            else {
065              session.setFeedback(
066                  "The size of the chart cannot be greater than " + GoogleChart.MAX_SIZE);
067            }
068          }
069        };
070        add(streamForm);
071        // table headers
072        add(new Label("telemetryName", new PropertyModel(dataModel, "telemetryName")));
073    
074        ListView dateList = new ListView("dateList", new PropertyModel(dataModel, "dateList")) {
075          /** Support serialization. */
076          public static final long serialVersionUID = 1L;
077    
078          @Override
079          protected void populateItem(ListItem item) {
080            String dateString = (String) item.getModelObject();
081            item.add(new Label("date", dateString));
082          }
083        };
084        streamForm.add(dateList);
085    
086        // checkbox to select stream to display
087        streamForm.add(new CheckBox("selectAll", new Model()) {
088          /** Support serialization. */
089          public static final long serialVersionUID = 1L;
090    
091          @Override
092          protected void onSelectionChanged(java.lang.Object newSelection) {
093            session.getDataModel().changeSelectionForAll((Boolean) newSelection);
094          }
095    
096          @Override
097          protected boolean wantOnSelectionChangedNotifications() {
098            return true;
099          }
100        });
101    
102        // stream data
103        ListView projectTable = new ListView("projectTable", new PropertyModel(dataModel,
104            "selectedProjects")) {
105          /** Support serialization. */
106          public static final long serialVersionUID = 1L;
107    
108          @Override
109          protected void populateItem(ListItem item) {
110            Project project = (Project) item.getModelObject();
111            Label projectNameLabel = new Label("projectName", project.getName());
112            List<SelectableTelemetryStream> streamList = session.getDataModel().getTelemetryStream(
113                project);
114            projectNameLabel.add(new AttributeModifier("rowspan", new Model(streamList.size() + 1)));
115            item.add(projectNameLabel);
116    
117            ListView projectStream = new ListView("projectStream", streamList) {
118              /** Support serialization. */
119              public static final long serialVersionUID = 1L;
120    
121              @Override
122              protected void populateItem(ListItem item) {
123                SelectableTelemetryStream stream = (SelectableTelemetryStream) item.getModelObject();
124                String streamName = stream.getTelemetryStream().getName();
125                String streamUnit = stream.getTelemetryStream().getYAxis().getUnits();
126    
127                item.add(new CheckBox("streamCheckBox", new PropertyModel(stream, "selected")));
128                item.add(new Label("streamName", streamName));
129                item.add(new Label("streamUnit", streamUnit));
130    
131                /*
132                 * WebComponent streamMarker = new WebComponent("streamMarker"); streamMarker.add(new
133                 * AttributeModifier("src", true, new PropertyModel(stream, "markerImageUrl")));
134                 * item.add(streamMarker);
135                 */
136    
137                item.add(new ImageUrl("streamMarker", stream.getMarkerImageUrl()));
138    
139                ListView streamData = new ListView("streamData", stream.getTelemetryStream()
140                    .getTelemetryPoint()) {
141                  /** Support serialization. */
142                  public static final long serialVersionUID = 1L;
143    
144                  @Override
145                  protected void populateItem(ListItem item) {
146                    TelemetryPoint point = (TelemetryPoint) item.getModelObject();
147                    String value = point.getValue();
148                    if (value == null) {
149                      item.add(new Label("data", "N/A"));
150                    }
151                    else {
152                      int i = value.indexOf('.');
153                      if (i > 0 && (i + 2) < value.length()) {
154                        value = value.substring(0, i + 2);
155                      }
156                      item.add(new Label("data", value));
157                    }
158                  }
159                };
160                item.add(streamData);
161              }
162            };
163            item.add(projectStream);
164          }
165        };
166        streamForm.add(projectTable);
167    
168        streamForm.add(new TextField("width", new PropertyModel(dataModel, "width")));
169        streamForm.add(new TextField("height", new PropertyModel(dataModel, "height")));
170        
171        // add the selected chart.
172        WebComponent selectedchartUrl = new WebComponent("selectedChart") {
173          public static final long serialVersionUID = 1L;
174    
175          @Override
176          public boolean isVisible() {
177            return !session.getDataModel().isChartEmpty();
178          }
179        };
180        selectedchartUrl.add(new AttributeModifier("src", true, new PropertyModel(dataModel,
181            "selectedChart")));
182        add(selectedchartUrl);
183    
184        PopupWindowPanel selectedchartUrlWindow = new PopupWindowPanel("selectedChartUrlWindow",
185            "Google Chart URL") {
186          /** Support serialization. */
187          public static final long serialVersionUID = 1L;
188    
189          @Override
190          public boolean isVisible() {
191            return !session.getDataModel().isChartEmpty();
192          }
193        };
194        selectedchartUrlWindow.getModalWindow().setContent(
195            new Label(selectedchartUrlWindow.getModalWindow().getContentId(), new PropertyModel(
196                dataModel, "selectedChart")));
197        add(selectedchartUrlWindow);
198    
199      }
200    
201      /**
202       * Show the panel only when the data model is not empty and no loadin is in process.
203       * 
204       * @return true when this panel should be shown.
205       */
206      @Override
207      public boolean isVisible() {
208        return !session.getDataModel().isEmpty() && session.getDataModel().isComplete();
209      }
210    
211    }