///////////////////////////////////////////////////////////////////////////// // // 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.address; import java.io.Serializable; import java.util.List; import java.util.Locale; import org.apache.log4j.Logger; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.apache.wicket.util.convert.IConverter; import org.projectforge.address.AddressDO; import org.projectforge.address.AddressDao; import org.projectforge.address.AddressFilter; import org.projectforge.common.StringHelper; import org.projectforge.plugins.marketing.AddressCampaignValueListForm; import org.projectforge.web.wicket.AbstractListForm; import org.projectforge.web.wicket.AbstractListPage; import org.projectforge.web.wicket.autocompletion.PFAutoCompleteTextField; import org.projectforge.web.wicket.bootstrap.GridBuilder; import org.projectforge.web.wicket.bootstrap.GridSize; import org.projectforge.web.wicket.flowlayout.DivPanel; import org.projectforge.web.wicket.flowlayout.DivPanelVisibility; import org.projectforge.web.wicket.flowlayout.FieldsetPanel; import org.projectforge.web.wicket.flowlayout.InputPanel; import org.projectforge.web.wicket.flowlayout.RadioGroupPanel; public class AddressListForm extends AbstractListForm<AddressListFilter, AddressListPage> { private static final long serialVersionUID = 8124796579658957116L; private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(AddressListForm.class); @SpringBean(name = "addressDao") private AddressDao addressDao; /** * Used by {@link AddressCampaignValueListForm}. */ @SuppressWarnings("serial") public static void onOptionsPanelCreate(final AbstractListPage< ? , ? , ? > parentPage, final FieldsetPanel optionsFieldsetPanel, final AddressFilter searchFilter) { { final DivPanel radioGroupPanel = optionsFieldsetPanel.addNewRadioBoxButtonDiv(); final RadioGroupPanel<String> radioGroup = new RadioGroupPanel<String>(radioGroupPanel.newChildId(), "listtype", new PropertyModel<String>(searchFilter, "listType")) { /** * @see org.projectforge.web.wicket.flowlayout.RadioGroupPanel#wantOnSelectionChangedNotifications() */ @Override protected boolean wantOnSelectionChangedNotifications() { return true; } /** * @see org.projectforge.web.wicket.flowlayout.RadioGroupPanel#onSelectionChanged(java.lang.Object) */ @Override protected void onSelectionChanged(final Object newSelection) { parentPage.refresh(); } }; radioGroupPanel.add(radioGroup); radioGroup.add(new Model<String>(AddressFilter.FILTER_FILTER), parentPage.getString("filter")); radioGroup.add(new Model<String>(AddressFilter.FILTER_NEWEST), parentPage.getString("filter.newest")); radioGroup.add(new Model<String>(AddressFilter.FILTER_MY_FAVORITES), parentPage.getString("address.filter.myFavorites")); radioGroup.add(new Model<String>(AddressFilter.FILTER_DOUBLETS), parentPage.getString("address.filter.doublets")); } } /** * Used by {@link AddressCampaignValueListForm}. */ @SuppressWarnings("serial") public static void addFilter(final AbstractListPage< ? , ? , ? > parentPage, final AbstractListForm< ? , ? > form, final GridBuilder gridBuilder, final AddressFilter searchFilter) { { gridBuilder.newSplitPanel(GridSize.COL50); gridBuilder.getRowPanel().setVisibility(new DivPanelVisibility() { @Override public boolean isVisible() { return searchFilter.isFilter(); } }); final FieldsetPanel fieldset = gridBuilder.newFieldset(parentPage.getString("address.contactStatus")).suppressLabelForWarning(); final DivPanel checkBoxPanel = fieldset.addNewCheckBoxButtonDiv(); checkBoxPanel.add(form.createAutoRefreshCheckBoxButton(checkBoxPanel.newChildId(), new PropertyModel<Boolean>(searchFilter, "active"), parentPage.getString("address.contactStatus.active"))); checkBoxPanel.add(form.createAutoRefreshCheckBoxButton(checkBoxPanel.newChildId(), new PropertyModel<Boolean>(searchFilter, "nonActive"), parentPage.getString("address.contactStatus.nonActive"))); checkBoxPanel.add(form.createAutoRefreshCheckBoxButton(checkBoxPanel.newChildId(), new PropertyModel<Boolean>(searchFilter, "uninteresting"), parentPage.getString("address.contactStatus.uninteresting"))); checkBoxPanel.add(form.createAutoRefreshCheckBoxButton(checkBoxPanel.newChildId(), new PropertyModel<Boolean>(searchFilter, "personaIngrata"), parentPage.getString("address.contactStatus.personaIngrata"))); checkBoxPanel.add(form.createAutoRefreshCheckBoxButton(checkBoxPanel.newChildId(), new PropertyModel<Boolean>(searchFilter, "departed"), parentPage.getString("address.contactStatus.departed"))); } { gridBuilder.newSplitPanel(GridSize.COL50); final FieldsetPanel fieldset = gridBuilder.newFieldset(parentPage.getString("address.addressStatus")).suppressLabelForWarning(); final DivPanel checkBoxPanel = fieldset.addNewCheckBoxButtonDiv(); checkBoxPanel.add(form.createAutoRefreshCheckBoxButton(checkBoxPanel.newChildId(), new PropertyModel<Boolean>(searchFilter, "uptodate"), parentPage.getString("address.addressStatus.uptodate"))); checkBoxPanel.add(form.createAutoRefreshCheckBoxButton(checkBoxPanel.newChildId(), new PropertyModel<Boolean>(searchFilter, "outdated"), parentPage.getString("address.addressStatus.outdated"))); checkBoxPanel.add(form.createAutoRefreshCheckBoxButton(checkBoxPanel.newChildId(), new PropertyModel<Boolean>(searchFilter, "leaved"), parentPage.getString("address.addressStatus.leaved"))); } } @Override protected void init() { super.init(); addFilter(parentPage, this, gridBuilder, getSearchFilter()); } /** * @see org.projectforge.web.wicket.AbstractListForm#onOptionsPanelCreate(org.projectforge.web.wicket.flowlayout.FieldsetPanel, * org.projectforge.web.wicket.flowlayout.DivPanel) */ @Override protected void onOptionsPanelCreate(final FieldsetPanel optionsFieldsetPanel, final DivPanel optionsCheckBoxesPanel) { onOptionsPanelCreate(parentPage, optionsFieldsetPanel, searchFilter); } public AddressListForm(final AddressListPage parentPage) { super(parentPage); } @SuppressWarnings("serial") @Override protected TextField< ? > createSearchTextField() { @SuppressWarnings({ "unchecked", "rawtypes"}) final PFAutoCompleteTextField<AddressDO> searchField = new PFAutoCompleteTextField<AddressDO>(InputPanel.WICKET_ID, new Model() { @Override public Serializable getObject() { // Pseudo object for storing search string (title field is used for this foreign purpose). return new AddressDO().setComment(searchFilter.getSearchString()); } @Override public void setObject(final Serializable object) { if (object != null) { if (object instanceof String) { searchFilter.setSearchString((String) object); } } else { searchFilter.setSearchString(""); } } }) { @Override protected List<AddressDO> getChoices(final String input) { final AddressFilter filter = new AddressFilter(); filter.setSearchString(input); filter.setSearchFields("name", "firstName", "organization"); final List<AddressDO> list = addressDao.getList(filter); return list; } @Override protected List<String> getRecentUserInputs() { return parentPage.getRecentSearchTermsQueue().getRecents(); } @Override protected String formatLabel(final AddressDO address) { return StringHelper.listToString("; ", address.getName(), address.getFirstName(), address.getOrganization()); } @Override protected String formatValue(final AddressDO address) { return "id:" + address.getId(); } /** * @see org.apache.wicket.Component#getConverter(java.lang.Class) */ @Override public <C> IConverter<C> getConverter(final Class<C> type) { return new IConverter<C>() { @Override public C convertToObject(final String value, final Locale locale) { searchFilter.setSearchString(value); return null; } @Override public String convertToString(final Object value, final Locale locale) { return searchFilter.getSearchString(); } }; } }; searchField.withLabelValue(true).withMatchContains(true).withMinChars(2).withFocus(true).withAutoSubmit(true); createSearchFieldTooltip(searchField); return searchField; } @Override protected AddressListFilter newSearchFilterInstance() { return new AddressListFilter(); } @Override protected Logger getLogger() { return log; } }