001    package org.hackystat.projectbrowser.page.projects;
002    
003    import org.apache.wicket.extensions.markup.html.form.DateTextField;
004    import org.apache.wicket.extensions.yui.calendar.DatePicker;
005    import org.apache.wicket.markup.html.basic.Label;
006    import org.apache.wicket.markup.html.form.Button;
007    import org.apache.wicket.markup.html.form.Form;
008    import org.apache.wicket.markup.html.form.ListMultipleChoice;
009    import org.apache.wicket.markup.html.form.SubmitLink;
010    import org.apache.wicket.markup.html.form.TextArea;
011    import org.apache.wicket.markup.html.form.TextField;
012    import org.apache.wicket.markup.html.list.ListItem;
013    import org.apache.wicket.markup.html.list.ListView;
014    import org.apache.wicket.markup.html.panel.Panel;
015    import org.apache.wicket.model.PropertyModel;
016    import org.hackystat.projectbrowser.ProjectBrowserSession;
017    import org.hackystat.projectbrowser.page.popupwindow.PopupWindowPanel;
018    import org.hackystat.sensorbase.client.SensorBaseClient;
019    import org.hackystat.sensorbase.client.SensorBaseClientException;
020    import org.hackystat.sensorbase.resource.projects.jaxb.Project;
021    
022    /**
023     * Panel use to edit project.
024     * 
025     * @author Shaoxuan Zhang
026     * @author Randy Cox
027     */
028    public class ProjEditPanel extends Panel {
029    
030      /** Support serialization. */
031      private static final long serialVersionUID = 1L;
032    
033      /** Date format used in date field input. */
034      private static final String DATA_FORMAT = "yyyy-MM-dd";
035    
036      /**
037       * Constructor for this class.
038       * 
039       * @param id the wicket id.
040       */
041      public ProjEditPanel(String id) {
042        super(id);
043    
044        final ProjectsSession session = ProjectBrowserSession.get().getProjectsSession();
045        final ProjectsModel model = session.getProjectsModel();
046    
047        final Form projectForm = new Form("projEditForm");
048    
049        TextField projName = new TextField("projectName", new PropertyModel(model, "projectName")) {
050          /** Support serialization. */
051          private static final long serialVersionUID = 1L;
052    
053          /** Allows editing of project name if the record is brand new. */
054          @Override
055          public boolean isEnabled() {
056            return ProjectBrowserSession.get().getProjectsSession().isNewProject();
057          }
058        };
059        projectForm.add(projName);
060    
061        Label projOwner = new Label("projectOwner", new PropertyModel(model, "projectOwner"));
062        projOwner.setEscapeModelStrings(false);
063        projectForm.add(projOwner);
064    
065        projectForm.add(new TextArea("projectDesc", new PropertyModel(model, "projectDesc")));
066    
067        DateTextField projectStartDate = new DateTextField("projectStartDate", new PropertyModel(model,
068            "projectStartDate"), DATA_FORMAT);
069        projectStartDate.add(new DatePicker());
070        projectForm.add(projectStartDate);
071    
072        DateTextField projectEndDate = new DateTextField("projectEndDate", new PropertyModel(model,
073            "projectEndDate"), DATA_FORMAT);
074        projectEndDate.add(new DatePicker());
075        projectForm.add(projectEndDate);
076    
077        final ListMultipleChoice projectMembers = new ListMultipleChoice("memberSelection",
078            new PropertyModel(model, "memberSelection"), new PropertyModel(model, "projectMembers")) {
079          /** Support serialization. */
080          public static final long serialVersionUID = 1L;
081    
082          /** Turns this choice box off when no members are present. */
083          @Override
084          public boolean isVisible() {
085            return (!getChoices().isEmpty());
086          }
087        };
088        projectMembers.setMaxRows(5);
089        projectForm.add(projectMembers);
090    
091        SubmitLink deleteMemberLink = new SubmitLink("deleteMemberLink") {
092          /** Support serialization. */
093          private static final long serialVersionUID = 1L;
094    
095          /** Delete selected member from projectMembers list. */
096          @Override
097          public void onSubmit() {
098            ProjectsSession session = ProjectBrowserSession.get().getProjectsSession();
099            ProjectsModel model = session.getProjectsModel();
100            model.removeMembers(model.getMemberSelection());
101          }
102        };
103        projectForm.add(deleteMemberLink);
104    
105        TextArea projectMemberHelp = new TextArea("projectMemberHelp", new PropertyModel(model,
106            "projectMemberHelp")) {
107          /** Support serialization. */
108          public static final long serialVersionUID = 1L;
109    
110          /** Turns on when no project members. */
111          @Override
112          public boolean isVisible() {
113            return (projectMembers.getChoices().isEmpty());
114          }
115        };
116        projectMemberHelp.setEnabled(false);
117        projectForm.add(projectMemberHelp);
118    
119        projectForm.add(new TextArea("projectInvitations", new PropertyModel(model,
120            "projectInvitationsStr")));
121        projectForm.add(new TextArea("projectSpectators", new PropertyModel(model,
122            "projectSpectatorsStr")));
123    
124        SubmitLink addPropUriLink = new SubmitLink("addPropUriLink") {
125          /** For serialization. */
126          private static final long serialVersionUID = 1L;
127    
128          /** Add row */
129          @Override
130          public void onSubmit() {
131            ProjectsSession session = ProjectBrowserSession.get().getProjectsSession();
132            ProjectsModel model = session.getProjectsModel();
133            model.addPropUriRow();
134          }
135        };
136        projectForm.add(addPropUriLink);
137    
138        final ListView projectTable = new ListView("propertyUriRowsTable", new PropertyModel(model,
139            "propUriRowsView")) {
140          /** For serialization. */
141          private static final long serialVersionUID = 1L;
142    
143          /** Add one row of table. */
144          @Override
145          public void populateItem(final ListItem item) {
146            PropUriRowModel rowModel = (PropUriRowModel) item.getModelObject();
147            item.add(new TextField("propertyLabel", new PropertyModel(rowModel, "propertyLabel")));
148            item.add(new TextField("propertyValue", new PropertyModel(rowModel, "propertyValue")));
149            item.add(new TextField("uriPattern1", new PropertyModel(rowModel, "uriPattern1")));
150            item.add(new TextField("uriPattern2", new PropertyModel(rowModel, "uriPattern2")));
151            item.add(new TextField("uriPattern3", new PropertyModel(rowModel, "uriPattern3")));
152          }
153        };
154        projectForm.add(projectTable);
155    
156        Button saveButton = new Button("saveButton") {
157          /** For serialization. */
158          private static final long serialVersionUID = 1L;
159    
160          /** Save project. */
161          @Override
162          public void onSubmit() {
163            ProjectsSession session = ProjectBrowserSession.get().getProjectsSession();
164            ProjectsModel model = session.getProjectsModel();
165            model.savePropUriRowsSave();
166    
167            if (model.isSemanticCheckOk()) {
168              Project project = model.getProject();
169              SensorBaseClient client = ProjectBrowserSession.get().getSensorBaseClient();
170    
171              try {
172                client.putProject(project);
173                session.getProjEditPanel().setVisible(false);
174                session.getProjListPanel().setVisible(true);
175              }
176              catch (SensorBaseClientException e) {
177                model.setFeedback(e.getMessage());
178              }
179            }
180          }
181        };
182        projectForm.add(saveButton);
183    
184        Button cancelButton = new Button("cancelButton") {
185          /** For serialization. */
186          private static final long serialVersionUID = 1L;
187    
188          /** Cancel. */
189          @Override
190          public void onSubmit() {
191            session.getProjEditPanel().setVisible(false);
192            session.getProjListPanel().setVisible(true);
193          }
194        };
195        projectForm.add(cancelButton);
196    
197        PopupWindowPanel popup = new PopupWindowPanel("helpPopup", "Project Entry Help");
198        popup.getModalWindow().setContent(new ProjHelpPanel(popup.getModalWindow().getContentId()));
199        projectForm.add(popup);
200    
201        Label feedbackLabel = new Label("saveFeedback", new PropertyModel(model, "feedback"));
202        session.setFeedbackLabel(feedbackLabel);
203        projectForm.add(feedbackLabel);
204    
205        add(projectForm);
206      }
207    }