///////////////////////////////////////////////////////////////////////////// // // 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.Iterator; import java.util.Set; 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.IModel; import org.apache.wicket.model.PropertyModel; 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 Kai Reinhard (k.reinhard@micromata.de) */ public class ContactEntryPanel extends Panel { private static final long serialVersionUID = -7234382706624510638L; private RepeatingView entrysRepeater; private WebMarkupContainer mainContainer, addNewEntryContainer; private LabelValueChoiceRenderer<ContactType> formChoiceRenderer; private ContactEntryDO newEntryValue; private final String DEFAULT_ENTRY_VALUE = "Neue Adresse"; private final String DEFAULT_STREET_VALUE = "Strasse"; private final String DEFAULT_ZIPCODE_VALUE= "Plz"; private final String DEFAULT_CITY_VALUE = "Stadt"; private final String DEFAULT_COUNTRY_VALUE = "Land"; private final String DEFAULT_STATE_VALUE = "Bundesland"; private Component city; private Component zipCode; private Component country; private Component state; private Component delete; private final IModel<ContactDO> model; /** * @param id */ public ContactEntryPanel(final String id, final IModel<ContactDO> model) { super(id); this.model = model; } /** * @see org.apache.wicket.Component#onInitialize() */ @Override protected void onInitialize() { super.onInitialize(); newEntryValue = new ContactEntryDO().setStreet(DEFAULT_ENTRY_VALUE).setCity(DEFAULT_CITY_VALUE) // .setZipCode(DEFAULT_ZIPCODE_VALUE).setCountry(DEFAULT_COUNTRY_VALUE).setState(DEFAULT_STATE_VALUE).setContactType(ContactType.PRIVATE) // .setContact(model.getObject()); formChoiceRenderer = new LabelValueChoiceRenderer<ContactType>(this, ContactType.values()); mainContainer = new WebMarkupContainer("main"); add(mainContainer.setOutputMarkupId(true)); entrysRepeater = new RepeatingView("liRepeater"); mainContainer.add(entrysRepeater); rebuildEntrys(); addNewEntryContainer = new WebMarkupContainer("liAddNewEntry"); mainContainer.add(addNewEntryContainer); init(addNewEntryContainer); entrysRepeater.setVisible(true); } /********************************** init ** ********************************* */ @SuppressWarnings("serial") void init(final WebMarkupContainer item) { final DropDownChoice<ContactType> dropdownChoice = new DropDownChoice<ContactType>("choice", new PropertyModel<ContactType>( newEntryValue, "contactType"), formChoiceRenderer.getValues(), formChoiceRenderer); item.add(dropdownChoice); dropdownChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(final AjaxRequestTarget target) { newEntryValue.setContactType(dropdownChoice.getModelObject()); } }); final WebMarkupContainer streetCodeDiv = new WebMarkupContainer("streetCodeDiv"); streetCodeDiv.setOutputMarkupId(true); streetCodeDiv.add(new AjaxMaxLengthEditableLabel("street", new PropertyModel<String>(newEntryValue, "street")) { /** * @see org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel#onEdit(org.apache.wicket.ajax.AjaxRequestTarget) */ @Override public void onEdit(final AjaxRequestTarget target) { super.onEdit(target); if (newEntryValue.getStreet().equals(DEFAULT_ENTRY_VALUE) == true) newEntryValue.setStreet(DEFAULT_STREET_VALUE); } /** * @see org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel#onSubmit(org.apache.wicket.ajax.AjaxRequestTarget) */ @Override protected void onSubmit(final AjaxRequestTarget target) { super.onSubmit(target); zipCode.setVisible(true); target.add(mainContainer); } }).setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true).setVisible(true); item.add(streetCodeDiv); final WebMarkupContainer zipCodeDiv = new WebMarkupContainer("zipCodeDiv"); zipCodeDiv.setOutputMarkupId(true); zipCodeDiv.add( zipCode= new AjaxMaxLengthEditableLabel("zipCode", new PropertyModel<String>(newEntryValue, "zipCode")) { /** * @see org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel#onSubmit(org.apache.wicket.ajax.AjaxRequestTarget) */ @Override protected void onSubmit(final AjaxRequestTarget target) { super.onSubmit(target); city.setVisible(true); target.add(mainContainer); } }.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true).setVisible(false)); item.add(zipCodeDiv); final WebMarkupContainer cityDiv = new WebMarkupContainer("cityDiv"); cityDiv.setOutputMarkupId(true); cityDiv.add( city = new AjaxMaxLengthEditableLabel("city", new PropertyModel<String>(newEntryValue, "city")) { /** * @see org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel#onSubmit(org.apache.wicket.ajax.AjaxRequestTarget) */ @Override protected void onSubmit(final AjaxRequestTarget target) { super.onSubmit(target); country.setVisible(true); target.add(mainContainer); } }.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true).setVisible(false)); item.add(cityDiv); final WebMarkupContainer countryDiv = new WebMarkupContainer("countryDiv"); countryDiv.setOutputMarkupId(true); countryDiv.add( country = new AjaxMaxLengthEditableLabel("country", new PropertyModel<String>(newEntryValue, "country")) { /** * @see org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel#onSubmit(org.apache.wicket.ajax.AjaxRequestTarget) */ @Override protected void onSubmit(final AjaxRequestTarget target) { super.onSubmit(target); state.setVisible(true); target.add(mainContainer); } }.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true).setVisible(false)); item.add(countryDiv); final WebMarkupContainer stateDiv = new WebMarkupContainer("stateDiv"); stateDiv.setOutputMarkupId(true); stateDiv.add( state = new AjaxMaxLengthEditableLabel("state", new PropertyModel<String>(newEntryValue, "state")) { /** * @see org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel#onSubmit(org.apache.wicket.ajax.AjaxRequestTarget) */ @Override protected void onSubmit(final AjaxRequestTarget target) { super.onSubmit(target); model.getObject().addContactEntry(new ContactEntryDO().setStreet(newEntryValue.getStreet()).setCity(newEntryValue.getCity()) // .setZipCode(newEntryValue.getZipCode()).setCountry(newEntryValue.getCountry()) // .setState(newEntryValue.getState()).setContactType(newEntryValue.getContactType())); rebuildEntrys(); newEntryValue.setStreet(DEFAULT_ENTRY_VALUE).setCity(DEFAULT_CITY_VALUE).setZipCode(DEFAULT_ZIPCODE_VALUE) // .setCountry(DEFAULT_COUNTRY_VALUE).setState(DEFAULT_STATE_VALUE).setContactType(ContactType.PRIVATE); target.add(mainContainer); zipCode.setVisible(false); city.setVisible(false); country.setVisible(false); state.setVisible(false); } }.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true).setVisible(false)); item.add(stateDiv); final WebMarkupContainer deleteDiv = new WebMarkupContainer("deleteDiv"); deleteDiv.setOutputMarkupId(true); deleteDiv.add( delete = new AjaxIconLinkPanel("delete", IconType.REMOVE, new PropertyModel<String>(newEntryValue, "street")) { /** * @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<ContactEntryDO> it = model.getObject().getContactEntries().iterator(); while (it.hasNext() == true) { if (it.next() == newEntryValue) { it.remove(); } } rebuildEntrys(); target.add(mainContainer); } }); item.add(deleteDiv); delete.setVisible(false); } /********************************** rebuild ** ********************************* */ @SuppressWarnings("serial") private void rebuildEntrys() { final Set<ContactEntryDO> entries = model.getObject().getContactEntries(); if ( entries != null) { entrysRepeater.removeAll(); for (final ContactEntryDO entry : entries) { final WebMarkupContainer item = new WebMarkupContainer(entrysRepeater.newChildId()); entrysRepeater.add(item); final DropDownChoice<ContactType> dropdownChoice = new DropDownChoice<ContactType>("choice", new PropertyModel<ContactType>(entry, "contactType"), formChoiceRenderer.getValues(), formChoiceRenderer); item.add(dropdownChoice); dropdownChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(final AjaxRequestTarget target) { entry.setContactType(dropdownChoice.getModelObject()); } }); final WebMarkupContainer streetCodeDiv = new WebMarkupContainer("streetCodeDiv"); streetCodeDiv.setOutputMarkupId(true); streetCodeDiv.add(new AjaxMaxLengthEditableLabel("street", new PropertyModel<String>(entry, "street")) { /** * @see org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel#onEdit(org.apache.wicket.ajax.AjaxRequestTarget) */ @Override public void onEdit(final AjaxRequestTarget target) { super.onEdit(target); if (newEntryValue.getStreet().equals(DEFAULT_ENTRY_VALUE) == true) newEntryValue.setStreet(DEFAULT_STREET_VALUE); } }).setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true).setVisible(true); item.add(streetCodeDiv); final WebMarkupContainer zipCodeDiv = new WebMarkupContainer("zipCodeDiv"); zipCodeDiv.setOutputMarkupId(true); zipCodeDiv.add(new AjaxMaxLengthEditableLabel("zipCode", new PropertyModel<String>(entry, "zipCode")).setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true).setVisible(true)); item.add(zipCodeDiv); final WebMarkupContainer cityDiv = new WebMarkupContainer("cityDiv"); cityDiv.setOutputMarkupId(true); cityDiv.add(new AjaxMaxLengthEditableLabel("city", new PropertyModel<String>(entry, "city")) .setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true).setVisible(true)); item.add(cityDiv); final WebMarkupContainer countryDiv = new WebMarkupContainer("countryDiv"); countryDiv.setOutputMarkupId(true); countryDiv.add(new AjaxMaxLengthEditableLabel("country", new PropertyModel<String>(entry, "country")).setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true).setVisible(true)); item.add(countryDiv); final WebMarkupContainer stateDiv = new WebMarkupContainer("stateDiv"); stateDiv.setOutputMarkupId(true); stateDiv.add(new AjaxMaxLengthEditableLabel("state", new PropertyModel<String>(entry, "state")) { /** * @see org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel#onSubmit(org.apache.wicket.ajax.AjaxRequestTarget) */ @Override protected void onSubmit(final AjaxRequestTarget target) { super.onSubmit(target); rebuildEntrys(); target.add(mainContainer); } }.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true).setVisible(true)); item.add(stateDiv); final WebMarkupContainer deleteDiv = new WebMarkupContainer("deleteDiv"); deleteDiv.setOutputMarkupId(true); deleteDiv.add(new AjaxIconLinkPanel("delete", IconType.REMOVE, new PropertyModel<String>(entry, "street")) { /** * @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<ContactEntryDO> it = model.getObject().getContactEntries().iterator(); while (it.hasNext() == true) { if (it.next() == entry) { it.remove(); } } rebuildEntrys(); target.add(mainContainer); } }); item.add(deleteDiv); } } } }