/////////////////////////////////////////////////////////////////////////////
//
// 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.plugins.crm;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.projectforge.address.PhoneType;
import org.projectforge.web.wicket.components.AjaxMaxLengthEditableLabel;
import org.projectforge.web.wicket.components.LabelValueChoiceRenderer;
import org.projectforge.web.wicket.flowlayout.AjaxIconLinkPanel;
import org.projectforge.web.wicket.flowlayout.IconType;
/**
* @author Werner Feder (werner.feder@t-online.de)
*/
public class PhonesPanel extends Panel
{
private static final long serialVersionUID = -5390479088481704778L;
@SpringBean(name = "contactDao")
private ContactDao contactDao;
private List<PhoneValue> phones = null;
private RepeatingView phonesRepeater;
private WebMarkupContainer mainContainer, addNewPhoneContainer;
private LabelValueChoiceRenderer<PhoneType> phoneChoiceRenderer;
private PhoneValue newPhoneValue;
private final String DEFAULT_PHONE_VALUE = "Telefon";
private Component delete;
private final PropertyModel<String> model;
/**
* @param id
*/
public PhonesPanel(final String id, final PropertyModel<String> model)
{
super(id);
this.model = model;
if (StringUtils.isNotBlank(model.getObject()) == true) {
phones = contactDao.readPhoneValues(model.getObject());
}
}
/**
* @see org.apache.wicket.Component#onInitialize()
*/
@Override
protected void onInitialize()
{
super.onInitialize();
if (phones == null) {
phones = new ArrayList<PhoneValue>();
}
newPhoneValue = new PhoneValue().setNumber(DEFAULT_PHONE_VALUE).setPhoneType(PhoneType.PRIVATE);
phoneChoiceRenderer = new LabelValueChoiceRenderer<PhoneType>(this, PhoneType.values());
mainContainer = new WebMarkupContainer("main");
add(mainContainer.setOutputMarkupId(true));
phonesRepeater = new RepeatingView("liRepeater");
mainContainer.add(phonesRepeater);
rebuildPhones();
addNewPhoneContainer = new WebMarkupContainer("liAddNewPhone");
mainContainer.add(addNewPhoneContainer);
init(addNewPhoneContainer);
phonesRepeater.setVisible(true);
}
@SuppressWarnings("serial")
void init(final WebMarkupContainer item)
{
final DropDownChoice<PhoneType> dropdownChoice = new DropDownChoice<PhoneType>("choice", new PropertyModel<PhoneType>(
newPhoneValue, "phoneType"), phoneChoiceRenderer.getValues(), phoneChoiceRenderer);
item.add(dropdownChoice);
dropdownChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
@Override
protected void onUpdate(final AjaxRequestTarget target)
{
newPhoneValue.setPhoneType(dropdownChoice.getModelObject());
model.setObject(contactDao.getPhoneValuesAsXml(phones));
}
});
item.add(new AjaxMaxLengthEditableLabel("editableLabel", new PropertyModel<String>(newPhoneValue, "number")) {
@Override
protected void onSubmit(final AjaxRequestTarget target)
{
super.onSubmit(target);
if (StringUtils.isNotBlank(newPhoneValue.getNumber()) == true && newPhoneValue.getNumber().equals(DEFAULT_PHONE_VALUE) == false) {
phones.add(new PhoneValue().setNumber(newPhoneValue.getNumber()).setPhoneType(newPhoneValue.getPhoneType()));
model.setObject(contactDao.getPhoneValuesAsXml(phones));
}
newPhoneValue.setNumber(DEFAULT_PHONE_VALUE);
rebuildPhones();
target.add(mainContainer);
}
});
final WebMarkupContainer deleteDiv = new WebMarkupContainer("deleteDiv");
deleteDiv.setOutputMarkupId(true);
deleteDiv.add(delete = new AjaxIconLinkPanel("delete", IconType.REMOVE, new PropertyModel<String>(newPhoneValue, "number")) {
/**
* @see org.projectforge.web.wicket.flowlayout.AjaxIconLinkPanel#onClick(org.apache.wicket.ajax.AjaxRequestTarget)
*/
@Override
protected void onClick(final AjaxRequestTarget target)
{
super.onClick(target);
final Iterator<PhoneValue> it = phones.iterator();
while (it.hasNext() == true) {
if (it.next() == newPhoneValue) {
it.remove();
}
}
rebuildPhones();
model.setObject(contactDao.getPhoneValuesAsXml(phones));
target.add(mainContainer);
}
});
item.add(deleteDiv);
delete.setVisible(false);
}
@SuppressWarnings("serial")
private void rebuildPhones()
{
phonesRepeater.removeAll();
for (final PhoneValue phone : phones) {
final WebMarkupContainer item = new WebMarkupContainer(phonesRepeater.newChildId());
phonesRepeater.add(item);
final DropDownChoice<PhoneType> dropdownChoice = new DropDownChoice<PhoneType>("choice", new PropertyModel<PhoneType>(phone,
"phoneType"), phoneChoiceRenderer.getValues(), phoneChoiceRenderer);
item.add(dropdownChoice);
dropdownChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
@Override
protected void onUpdate(final AjaxRequestTarget target)
{
phone.setPhoneType(dropdownChoice.getModelObject());
model.setObject(contactDao.getPhoneValuesAsXml(phones));
}
});
item.add(new AjaxMaxLengthEditableLabel("editableLabel", new PropertyModel<String>(phone, "number")){
@Override
protected void onSubmit(final AjaxRequestTarget target)
{
super.onSubmit(target);
model.setObject(contactDao.getPhoneValuesAsXml(phones));
rebuildPhones();
target.add(mainContainer);
}
});
final WebMarkupContainer deleteDiv = new WebMarkupContainer("deleteDiv");
deleteDiv.setOutputMarkupId(true);
deleteDiv.add(new AjaxIconLinkPanel("delete", IconType.REMOVE, new PropertyModel<String>(phone, "number")) {
/**
* @see org.projectforge.web.wicket.flowlayout.AjaxIconLinkPanel#onClick(org.apache.wicket.ajax.AjaxRequestTarget)
*/
@Override
protected void onClick(final AjaxRequestTarget target)
{
super.onClick(target);
final Iterator<PhoneValue> it = phones.iterator();
while (it.hasNext() == true) {
if (it.next() == phone) {
it.remove();
}
}
rebuildPhones();
model.setObject(contactDao.getPhoneValuesAsXml(phones));
target.add(mainContainer);
}
});
item.add(deleteDiv);
}
}
}