///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.web.gantt; import java.util.Date; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.projectforge.gantt.GanttAccess; import org.projectforge.gantt.GanttChartDO; import org.projectforge.gantt.GanttChartSettings; import org.projectforge.task.TaskDO; import org.projectforge.user.PFUserContext; import org.projectforge.user.PFUserDO; import org.projectforge.web.task.TaskSelectPanel; import org.projectforge.web.user.UserSelectPanel; import org.projectforge.web.wicket.AbstractEditForm; import org.projectforge.web.wicket.WicketUtils; import org.projectforge.web.wicket.bootstrap.GridSize; import org.projectforge.web.wicket.components.DatePanel; import org.projectforge.web.wicket.components.DatePanelSettings; import org.projectforge.web.wicket.components.LabelValueChoiceRenderer; import org.projectforge.web.wicket.components.MinMaxNumberField; import org.projectforge.web.wicket.components.RequiredMaxLengthTextField; import org.projectforge.web.wicket.components.SingleButtonPanel; import org.projectforge.web.wicket.flowlayout.CheckBoxButton; import org.projectforge.web.wicket.flowlayout.DivPanel; import org.projectforge.web.wicket.flowlayout.DivTextPanel; import org.projectforge.web.wicket.flowlayout.FieldsetPanel; public class GanttChartEditForm extends AbstractEditForm<GanttChartDO, GanttChartEditPage> { private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(GanttChartEditForm.class); private static final long serialVersionUID = 3199820655287750358L; static final String EXPORT_JPG = "JPG"; static final String EXPORT_MS_PROJECT_XML = "MSP-XML"; static final String EXPORT_MS_PROJECT_MPX = "MPX"; static final String EXPORT_PDF = "PDF"; static final String EXPORT_PNG = "PNG"; static final String EXPORT_PROJECTFORGE = "PROJECTFORGE"; static final String EXPORT_SVG = "SVG"; GanttChartEditTreeTablePanel ganttChartEditTreeTablePanel; private Button redrawButton; private String exportFormat; DivPanel imagePanel; public GanttChartEditForm(final GanttChartEditPage parentPage, final GanttChartDO data) { super(parentPage, data); if (isNew() == true) { if (data.getOwner() == null) { data.setOwner(PFUserContext.getUser()); } if (StringUtils.isEmpty(data.getName()) == true) { data.setName("MyChart"); } } if (data.getReadAccess() == null) { data.setReadAccess(GanttAccess.OWNER); } if (data.getWriteAccess() == null) { data.setWriteAccess(GanttAccess.OWNER); } } @SuppressWarnings("serial") @Override protected void init() { super.init(); gridBuilder.newGridPanel(); { final FieldsetPanel fs = gridBuilder.newFieldset(getString("task")); final TaskSelectPanel taskSelectPanel = new TaskSelectPanel(fs, new PropertyModel<TaskDO>(data, "task"), parentPage, "taskId") { @Override protected void selectTask(final TaskDO task) { super.selectTask(task); parentPage.refresh(); // Task was changed. Therefore update the kost2 list. } }; fs.add(taskSelectPanel); taskSelectPanel.init(); taskSelectPanel.setRequired(true); } gridBuilder.newSplitPanel(GridSize.COL50); { final FieldsetPanel fs = gridBuilder.newFieldset(getString("gantt.name")); final RequiredMaxLengthTextField name = new RequiredMaxLengthTextField(fs.getTextFieldId(), new PropertyModel<String>(data, "name")); WicketUtils.setStrong(name); fs.add(name); } gridBuilder.newSplitPanel(GridSize.COL50); { final FieldsetPanel fs = gridBuilder.newFieldset(getString("gantt.owner")); final UserSelectPanel userSelectPanel = new UserSelectPanel(fs.newChildId(), new PropertyModel<PFUserDO>(data, "owner"), parentPage, "ownerId"); fs.add(userSelectPanel); userSelectPanel.init(); } gridBuilder.newSplitPanel(GridSize.COL50); { final FieldsetPanel fs = gridBuilder.newFieldset(getString("title")); final RequiredMaxLengthTextField title = new RequiredMaxLengthTextField(fs.getTextFieldId(), new PropertyModel<String>(getSettings(), "title"), 100); WicketUtils.setStrong(title); fs.add(title); } gridBuilder.newSplitPanel(GridSize.COL50); { // read-access: final FieldsetPanel fs = gridBuilder.newFieldset(getString("access.read")); final LabelValueChoiceRenderer<GanttAccess> readAccessChoiceRenderer = new LabelValueChoiceRenderer<GanttAccess>(this, GanttAccess.values()); final DropDownChoice<GanttAccess> readAccessChoice = new DropDownChoice<GanttAccess>(fs.getDropDownChoiceId(), new PropertyModel<GanttAccess>(getData(), "readAccess"), readAccessChoiceRenderer.getValues(), readAccessChoiceRenderer); readAccessChoice.setNullValid(false); fs.add(readAccessChoice); } gridBuilder.newSplitPanel(GridSize.COL50); { // Width final FieldsetPanel fs = gridBuilder.newFieldset(getString("gantt.settings.width")); fs.add(new MinMaxNumberField<Integer>(fs.getTextFieldId(), new PropertyModel<Integer>(data.getStyle(), "width"), 100, 10000)); } gridBuilder.newSplitPanel(GridSize.COL50); { // write-access: final FieldsetPanel fs = gridBuilder.newFieldset(getString("access.write")); final LabelValueChoiceRenderer<GanttAccess> writeAccessChoiceRenderer = new LabelValueChoiceRenderer<GanttAccess>(this, GanttAccess.values()); final DropDownChoice<GanttAccess> writeAccessChoice = new DropDownChoice<GanttAccess>(fs.getDropDownChoiceId(), new PropertyModel<GanttAccess>(getData(), "writeAccess"), writeAccessChoiceRenderer.getValues(), writeAccessChoiceRenderer); writeAccessChoice.setNullValid(false); fs.add(writeAccessChoice); } gridBuilder.newSplitPanel(GridSize.COL50); { // Total label width: final FieldsetPanel fs = gridBuilder.newFieldset(getString("gantt.settings.totalLabelWidth")); fs.add(new MinMaxNumberField<Double>(fs.getTextFieldId(), new PropertyModel<Double>(data.getStyle(), "totalLabelWidth"), 10.0, 10000.0)); } gridBuilder.newSplitPanel(GridSize.COL50); { // Options final FieldsetPanel fs = gridBuilder.newFieldset(getString("label.options")).suppressLabelForWarning(); final DivPanel checkBoxPanel = fs.addNewCheckBoxButtonDiv(); checkBoxPanel.addCheckBoxButton(new PropertyModel<Boolean>(data.getStyle(), "relativeTimeValues"), getString("gantt.style.relativeTimeValues")); checkBoxPanel.addCheckBoxButton(new PropertyModel<Boolean>(data.getStyle(), "showToday"), getString("gantt.style.showToday")); checkBoxPanel.addCheckBoxButton(new PropertyModel<Boolean>(data.getStyle(), "showCompletion"), getString("gantt.style.showCompletion")); checkBoxPanel.add(new CheckBoxButton(checkBoxPanel.newChildId(), new PropertyModel<Boolean>(getSettings(), "showOnlyVisibles"), getString("gantt.settings.showOnlyVisibles")) { /** * @see org.projectforge.web.wicket.flowlayout.CheckBoxButton#wantOnSelectionChangedNotifications() */ @Override protected boolean wantOnSelectionChangedNotifications() { // Submit form after toggling the check box. return true; } }); } gridBuilder.newSplitPanel(GridSize.COL50); { // Time period final FieldsetPanel fs = gridBuilder.newFieldset(getString("timePeriod")).suppressLabelForWarning(); final DatePanel fromDatePanel = new DatePanel(fs.newChildId(), new PropertyModel<Date>(getSettings(), "fromDate"), DatePanelSettings .get().withSelectProperty("fromDate")); fs.add(fromDatePanel); fs.add(new DivTextPanel(fs.newChildId(), "-")); final DatePanel toDatePanel = new DatePanel(fs.newChildId(), new PropertyModel<Date>(getSettings(), "toDate"), DatePanelSettings .get().withSelectProperty("toDate")); fs.add(toDatePanel); } gridBuilder.newSplitPanel(GridSize.COL50); { final FieldsetPanel fs = gridBuilder.newFieldset(getString("export")); final LabelValueChoiceRenderer<String> exportFormatChoiceRenderer = new LabelValueChoiceRenderer<String>(); exportFormatChoiceRenderer.addValue(EXPORT_JPG, getString("gantt.export.jpg")); exportFormatChoiceRenderer.addValue(EXPORT_MS_PROJECT_MPX, getString("gantt.export.msproject.mpx")); exportFormatChoiceRenderer.addValue(EXPORT_MS_PROJECT_XML, getString("gantt.export.msproject.xml")); exportFormatChoiceRenderer.addValue(EXPORT_PDF, getString("gantt.export.pdf")); exportFormatChoiceRenderer.addValue(EXPORT_PNG, getString("gantt.export.png")); exportFormatChoiceRenderer.addValue(EXPORT_PROJECTFORGE, getString("gantt.export.projectforge")); exportFormatChoiceRenderer.addValue(EXPORT_SVG, getString("gantt.export.svg")); final DropDownChoice<String> exportFormatChoice = new DropDownChoice<String>(fs.getDropDownChoiceId(), new PropertyModel<String>( this, "exportFormat"), exportFormatChoiceRenderer.getValues(), exportFormatChoiceRenderer); exportFormatChoice.setNullValid(false); fs.add(exportFormatChoice); fs.add(new SingleButtonPanel(fs.newChildId(), new Button(SingleButtonPanel.WICKET_ID, new Model<String>("export")) { @Override public final void onSubmit() { parentPage.export(exportFormat); } }, getString("export"), SingleButtonPanel.NORMAL)); } gridBuilder.newGridPanel(); { final DivPanel panel = gridBuilder.getPanel(); ganttChartEditTreeTablePanel = new GanttChartEditTreeTablePanel(panel.newChildId(), this, getData()); panel.add(ganttChartEditTreeTablePanel); ganttChartEditTreeTablePanel.init(); ganttChartEditTreeTablePanel.setOpenNodes(getSettings().getOpenNodes()); gridBuilder.getPanel().add(imagePanel = new DivPanel(panel.newChildId())); } { // Redraw: redrawButton = new Button(SingleButtonPanel.WICKET_ID, new Model<String>("redraw")) { @Override public final void onSubmit() { parentPage.refresh(); } }; redrawButton.setDefaultFormProcessing(false); WicketUtils.addTooltip(redrawButton, getString("gantt.tooltip.returnKeyCallsRedraw")); final SingleButtonPanel redrawButtonPanel = new SingleButtonPanel(actionButtons.newChildId(), redrawButton, getString("redraw"), SingleButtonPanel.DEFAULT_SUBMIT); actionButtons.add(3, redrawButtonPanel); } if (isNew() == false && data.isDeleted() == false) { // Clone: final Button cloneButton = new Button(SingleButtonPanel.WICKET_ID, new Model<String>("clone")) { @Override public final void onSubmit() { getData().setId(null); this.setVisible(false); updateButtonVisibility(); } }; cloneButton.setDefaultFormProcessing(false); final SingleButtonPanel cloneButtonPanel = new SingleButtonPanel(actionButtons.newChildId(), cloneButton, getString("clone"), SingleButtonPanel.NORMAL); actionButtons.add(3, cloneButtonPanel); } // final SubmitLink addPositionButton = new SubmitLink("addActivity") { // @Override // public void onSubmit() // { // final GanttTaskImpl root = (GanttTaskImpl) parentPage.ganttChartData.getRootObject(); // final Integer nextId = root.getNextId(); // root.addChild(new GanttTaskImpl(nextId).setVisible(true).setTitle(getString("untitled"))); // final GanttChartEditTreeTablePanel tablePanel = parentPage.ganttChartEditTreeTablePanel; // final Set<Serializable> openNodes = tablePanel.getOpenNodes(); // tablePanel.refreshTreeTable(); // tablePanel.setOpenNodes(openNodes); // parentPage.refresh(); // }; // }; // add(addPositionButton); // addPositionButton.add(WicketUtils.getAddRowImage("addImage", getResponse(), getString("gantt.action.newActivity"))); // new AjaxEditableLabel("text1"); } @Override public void updateButtonVisibility() { super.updateButtonVisibility(); setDefaultButton(redrawButton); } @Override protected void markDefaultButtons() { // Avoid re-marking. } /** * @return the exportFormat */ public String getExportFormat() { if (exportFormat == null) { exportFormat = (String) parentPage.getUserPrefEntry(this.getClass().getName() + ":exportFormat"); } if (exportFormat == null) { exportFormat = EXPORT_PDF; } return exportFormat; } /** * @param exportFormat the exportFormat to set */ public void setExportFormat(final String exportFormat) { this.exportFormat = exportFormat; parentPage.putUserPrefEntry(this.getClass().getName() + ":exportFormat", this.exportFormat, true); } GanttChartSettings getSettings() { return getData().getSettings(); } @Override protected Logger getLogger() { return log; } }