001    package org.hackystat.projectbrowser.page;
002    
003    import java.util.Date;
004    
005    import javax.xml.datatype.XMLGregorianCalendar;
006    
007    import org.apache.wicket.behavior.HeaderContributor;
008    import org.apache.wicket.markup.html.WebPage;
009    import org.apache.wicket.markup.html.basic.Label;
010    import org.apache.wicket.markup.html.link.BookmarkablePageLink;
011    import org.apache.wicket.markup.html.link.Link;
012    import org.apache.wicket.model.PropertyModel;
013    import org.hackystat.projectbrowser.ProjectBrowserApplication;
014    import org.hackystat.projectbrowser.ProjectBrowserSession;
015    import org.hackystat.projectbrowser.imageurl.ImageUrl;
016    import org.hackystat.projectbrowser.page.crap.CrapPage;
017    import org.hackystat.projectbrowser.page.dailyprojectdata.DailyProjectDataPage;
018    import org.hackystat.projectbrowser.page.projectportfolio.ProjectPortfolioPage;
019    import org.hackystat.projectbrowser.page.projects.ProjectsPage;
020    import org.hackystat.projectbrowser.page.sensordata.SensorDataPage;
021    import org.hackystat.projectbrowser.page.telemetry.TelemetryPage;
022    import org.hackystat.projectbrowser.page.trajectory.TrajectoryPage;
023    import org.hackystat.utilities.tstamp.Tstamp;
024    
025    /**
026     * Provides a base class with associated markup that all ProjectBrowser pages (except for signin)
027     * should inherit from. See http://wicket.apache.org/examplemarkupinheritance.html for an
028     * explanation of how this works.
029     * 
030     * @author Philip Johnson
031     */
032    public class ProjectBrowserBasePage extends WebPage {
033      
034      /** Support serialization. */
035      private static final long serialVersionUID = 1L;
036      
037      /** The project name this user has selected in the ProjectDate form. */
038      //protected String projectName = "";
039      
040      /** The date this user has selected in the ProjectDate form. */
041      protected long date = getDateToday().getTime();
042    
043      /** The project name this user has selected. */
044      //private Project project = null;
045      
046      /** Displays text at the bottom of the screen for user information. */
047      protected String footerFeedback = "";
048    
049      /** Date format used in date field input. */
050      public static final String DATA_FORMAT = "yyyy-MM-dd";
051    
052      
053      /**
054       * Create the ProjectBrowserBasePage.
055       */
056      public ProjectBrowserBasePage() {
057        ProjectBrowserApplication app = (ProjectBrowserApplication)getApplication();
058        add(HeaderContributor.forCss(org.hackystat.projectbrowser.Start.class, 
059            "style/boilerplate/screen.css", "screen"));
060        add(HeaderContributor.forCss(org.hackystat.projectbrowser.Start.class, 
061            "style/boilerplate/print.css", "print"));
062        add(new Label("title", app.getApplicationName()));
063        add(new ImageUrl("application-logo", app.getApplicationLogo()));
064        add(new Label("application-name", (app.hasApplicationLogo() ? "" : app.getApplicationName())));
065        
066        add(new BookmarkablePageLink("SensorDataPageLink", SensorDataPage.class));
067        add(new BookmarkablePageLink("ProjectsPageLink", ProjectsPage.class) {
068          private static final long serialVersionUID = 1L;
069          @Override
070          public boolean isVisible() {
071            return ((ProjectBrowserApplication)getApplication()).isPageAvailable("projects");
072          }
073        });
074        add(new BookmarkablePageLink("DailyProjectDataPageLink", DailyProjectDataPage.class) {
075          private static final long serialVersionUID = 1L;
076          @Override
077          public boolean isVisible() {
078            return ((ProjectBrowserApplication)getApplication()).isPageAvailable("dailyprojectdata");
079          }
080        });
081        add(new BookmarkablePageLink("TelemetryPageLink", TelemetryPage.class) {
082          private static final long serialVersionUID = 1L;
083          @Override
084          public boolean isVisible() {
085            return ((ProjectBrowserApplication)getApplication()).isPageAvailable("telemetry");
086          }
087        });
088        add(new BookmarkablePageLink("ProjectPortfolioPageLink", ProjectPortfolioPage.class) {
089          private static final long serialVersionUID = 1L;
090          @Override
091          public boolean isVisible() {
092            return ((ProjectBrowserApplication)getApplication()).isPageAvailable("projectportfolio");
093          }
094        });
095        add(new BookmarkablePageLink("TrajectoryPageLink", TrajectoryPage.class) {
096          private static final long serialVersionUID = 1L;
097          @Override
098          public boolean isVisible() {
099            return ((ProjectBrowserApplication)getApplication()).isPageAvailable("trajectory");
100          }
101        });
102        add(new BookmarkablePageLink("CrapPageLink", CrapPage.class) {
103          private static final long serialVersionUID = 1L;
104          @Override
105          public boolean isVisible() {
106            return ((ProjectBrowserApplication)getApplication()).isPageAvailable("crap");
107          }
108        });
109        
110        add(new Link("LogoutLink") {
111          /** Support serialization. */
112          private static final long serialVersionUID = 1L;
113          /** Go to the home page after invalidating the session. */
114          @Override
115          public void onClick() {
116            getSession().invalidate();
117            setResponsePage(getApplication().getHomePage());
118          }
119        });
120        add(new Label("FooterFeedback", new PropertyModel(this, "footerFeedback")));
121        add(new Label("UserEmail", new PropertyModel(ProjectBrowserSession.get(), "userEmail")));
122      }
123      
124      /**
125       * The action to be performed when the user has set the Project and Date fields. 
126       */
127      public void onProjectDateSubmit() {
128        // do nothing in default case. 
129      }
130      
131      /**
132       * make a Date that represent today, at 0:00:00.
133       * @return the Date object.
134       */
135      public static final Date getDateToday() {
136        XMLGregorianCalendar time = Tstamp.makeTimestamp();
137        time.setTime(0, 0, 0);
138        return time.toGregorianCalendar().getTime();
139      }
140      
141      /**
142       * Return yesterday's date. 
143       * @return Yesterday.
144       */
145      public static final Date getDateYesterday() {
146        return getDateBefore(1);
147      }
148    
149      /**
150       * make a Date that represent i days ago, at 0:00:00.
151       * @param i how many day before today.
152       * @return the Date object.
153       */
154      public static final Date getDateBefore(int i) {
155        XMLGregorianCalendar time = Tstamp.makeTimestamp();
156        time = Tstamp.incrementDays(time, -i);
157        time.setTime(0, 0, 0);
158        return time.toGregorianCalendar().getTime();
159      }
160    
161      /**
162       * @param date the date to set
163       */
164      public void setDate(Date date) {
165        this.date = date.getTime();
166      }
167    
168      /**
169       * @return the date
170       */
171      public Date getDate() {
172        return new Date();
173      }
174    }