This is an automated email from the git hooks/post-receive script. New commit to branch feature/1229 in repository lima. See http://git.chorem.org/lima.git commit 931a9e6e50e2831cb9ea869a3c482403acb1c6e5 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri May 22 16:54:34 2015 +0200 fixes #1229 : recherche d'un compt sur tout ou partie du code ou de la désignation --- lima-swing/pom.xml | 1 + .../AccountCondition/AccountConditionHandler.java | 8 ++ .../AccountCondition/AccountConditionView.css | 8 +- .../AccountCondition/AccountConditionView.jaxx | 11 ++- .../lima/ui/celleditor/AccountTableCellEditor.java | 71 ++++------------ .../chorem/lima/ui/combobox/AccountComboBox.java | 70 ++++++++++++++++ .../lima/ui/combobox/AccountComboBoxModel.java | 98 ---------------------- .../lima/ui/common/AccountComboBoxModel.java | 54 ------------ .../org/chorem/lima/ui/lettering/LetteringView.css | 4 +- .../chorem/lima/ui/lettering/LetteringView.jaxx | 8 +- .../lima/ui/lettering/LetteringViewHandler.java | 64 ++++++++------ pom.xml | 2 +- 12 files changed, 149 insertions(+), 250 deletions(-) diff --git a/lima-swing/pom.xml b/lima-swing/pom.xml index 29ebc80..abfe0b2 100644 --- a/lima-swing/pom.xml +++ b/lima-swing/pom.xml @@ -283,6 +283,7 @@ <configuration> <addCompileClassPath>true</addCompileClassPath> <addProjectClassPath>true</addProjectClassPath> + <autoRecurseInCss>false</autoRecurseInCss> </configuration> <executions> <execution> diff --git a/lima-swing/src/main/java/org/chorem/lima/ui/Filter/AccountCondition/AccountConditionHandler.java b/lima-swing/src/main/java/org/chorem/lima/ui/Filter/AccountCondition/AccountConditionHandler.java index 6b3b108..4138fdc 100644 --- a/lima-swing/src/main/java/org/chorem/lima/ui/Filter/AccountCondition/AccountConditionHandler.java +++ b/lima-swing/src/main/java/org/chorem/lima/ui/Filter/AccountCondition/AccountConditionHandler.java @@ -26,8 +26,10 @@ import org.chorem.lima.beans.AccountCondition; import org.chorem.lima.entity.Account; import org.chorem.lima.ui.Filter.ConditionHandler; import org.chorem.lima.ui.Filter.financialTransactionCondition.FinancialTransactionConditionHandler; +import org.chorem.lima.ui.combobox.AccountComboBox; import java.awt.event.ItemEvent; +import java.beans.PropertyChangeEvent; /** * @author Sylvain Bavencoff - bavencoff@codelutin.com @@ -75,4 +77,10 @@ public class AccountConditionHandler implements ConditionHandler { public void setFilterHandler(FinancialTransactionConditionHandler filterHandler) { this.filterHandler = filterHandler; } + + public void accountComboBoxChange(PropertyChangeEvent event) { + if (event.getPropertyName().equals(AccountComboBox.PROPERTY_SELECTED_ITEM)) { + setAccount((Account) event.getNewValue()); + } + } } diff --git a/lima-swing/src/main/java/org/chorem/lima/ui/Filter/AccountCondition/AccountConditionView.css b/lima-swing/src/main/java/org/chorem/lima/ui/Filter/AccountCondition/AccountConditionView.css index 7d53060..da8cf1b 100644 --- a/lima-swing/src/main/java/org/chorem/lima/ui/Filter/AccountCondition/AccountConditionView.css +++ b/lima-swing/src/main/java/org/chorem/lima/ui/Filter/AccountCondition/AccountConditionView.css @@ -24,9 +24,7 @@ preferredSize : {new Dimension(400, 100)}; } -#account { - preferredSize : {new Dimension(390, 30)}; - model : {accountModel}; - renderer : {new AccountListRenderer()}; - selectedItem : {handler.getAccount()}; +#accountComboBox { + showDecorator : false; + selectedItem : {getHandler().getAccount()}; } \ No newline at end of file diff --git a/lima-swing/src/main/java/org/chorem/lima/ui/Filter/AccountCondition/AccountConditionView.jaxx b/lima-swing/src/main/java/org/chorem/lima/ui/Filter/AccountCondition/AccountConditionView.jaxx index 22253c1..f50fecd 100644 --- a/lima-swing/src/main/java/org/chorem/lima/ui/Filter/AccountCondition/AccountConditionView.jaxx +++ b/lima-swing/src/main/java/org/chorem/lima/ui/Filter/AccountCondition/AccountConditionView.jaxx @@ -19,7 +19,7 @@ --> <JInternalFrame id="accountConditionFrame" onInternalFrameClosed="handler.delete()" - layout="{new FlowLayout()}"> + layout="{new BorderLayout()}"> <import> java.awt.Dimension @@ -28,15 +28,14 @@ javax.swing.text.Document javax.swing.DefaultComboBoxModel org.chorem.lima.beans.AccountCondition - org.chorem.lima.ui.common.AccountListRenderer + org.chorem.lima.ui.combobox.AccountComboBox </import> <AccountConditionHandler id="handler" javaBean="new AccountConditionHandler(this)"/> - <org.chorem.lima.ui.combobox.AccountComboBoxModel id="accountModel" /> - - <JComboBox id="account" - onItemStateChanged="handler.accountSelected(event)"/> + <AccountComboBox id="accountComboBox" + constraints="BorderLayout.CENTER" + onPropertyChange="{getHandler().accountComboBoxChange(event);}"/> </JInternalFrame> diff --git a/lima-swing/src/main/java/org/chorem/lima/ui/celleditor/AccountTableCellEditor.java b/lima-swing/src/main/java/org/chorem/lima/ui/celleditor/AccountTableCellEditor.java index b94140a..a7f48c3 100644 --- a/lima-swing/src/main/java/org/chorem/lima/ui/celleditor/AccountTableCellEditor.java +++ b/lima-swing/src/main/java/org/chorem/lima/ui/celleditor/AccountTableCellEditor.java @@ -25,18 +25,15 @@ package org.chorem.lima.ui.celleditor; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.chorem.lima.entity.Account; -import org.chorem.lima.ui.combobox.LeafAccountComboBoxModel; -import org.chorem.lima.ui.common.AccountListRenderer; -import org.chorem.lima.util.AccountToString; -import org.chorem.lima.widgets.JWideComboBox; -import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator; +import org.chorem.lima.ui.combobox.AccountComboBox; -import javax.swing.*; +import javax.swing.AbstractCellEditor; +import javax.swing.JTable; +import javax.swing.SwingUtilities; import javax.swing.table.TableCellEditor; import javax.swing.text.JTextComponent; -import java.awt.*; +import java.awt.Component; import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.util.EventObject; @@ -50,38 +47,34 @@ import java.util.EventObject; * Last update : $Date$ * By : $Author$ */ -public class AccountTableCellEditor extends AbstractCellEditor implements TableCellEditor, KeyListener { +public class AccountTableCellEditor extends AbstractCellEditor implements TableCellEditor { protected static final Log log = LogFactory.getLog(AccountTableCellEditor.class); - protected final JWideComboBox comboBox; + protected final AccountComboBox accountComboBox; - protected static final long serialVersionUID = 1L; + protected boolean keyPressed; - protected volatile boolean keyPressed = false; + protected static final long serialVersionUID = 1L; /** constructor */ public AccountTableCellEditor() { - comboBox = new JWideComboBox(); - LeafAccountComboBoxModel accountComboBoxModel = new LeafAccountComboBoxModel(); - comboBox.setModel(accountComboBoxModel); - AccountListRenderer accountRenderer = new AccountListRenderer(); - comboBox.setRenderer(accountRenderer); - AutoCompleteDecorator.decorate(comboBox, AccountToString.getInstance()); - comboBox.getEditor().getEditorComponent().addKeyListener(this); + accountComboBox = new AccountComboBox(); + accountComboBox.setLeafAccounts(true); + accountComboBox.setShowDecorator(false); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { if (value instanceof Account) { - comboBox.setSelectedItem(value); + accountComboBox.setSelectedItem(value); } - return comboBox; + return accountComboBox; } @Override public Object getCellEditorValue() { - return comboBox.getSelectedItem(); + return accountComboBox.getSelectedItem(); } /** @@ -102,8 +95,9 @@ public class AccountTableCellEditor extends AbstractCellEditor implements TableC SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - comboBox.getEditor().getEditorComponent().requestFocus(); - JTextComponent edit = (JTextComponent) comboBox.getEditor().getEditorComponent(); + accountComboBox.getCombobox().getEditor().getEditorComponent().requestFocus(); + JTextComponent edit = (JTextComponent) accountComboBox.getCombobox().getEditor().getEditorComponent(); + edit.requestFocus(); if (!Character.isIdentifierIgnorable(keyEvent.getKeyChar())) { edit.setText(Character.toString(keyEvent.getKeyChar())); } @@ -116,33 +110,4 @@ public class AccountTableCellEditor extends AbstractCellEditor implements TableC return result; } - - @Override - public void keyPressed(KeyEvent e) { - - } - - @Override - public void keyReleased(KeyEvent e) { - - // Vérifie si c'est la première frappe au clavier - if (!keyPressed) { - // Récupère l'editor de la comboBox - JTextComponent edit = (JTextComponent) comboBox.getEditor().getEditorComponent(); - // Met en place le curseur et la selection après la première lettre - edit.select(1, edit.getText().length()); - keyPressed = true; - } - - // delegate popup list menu - if (e.getKeyChar() == KeyEvent.VK_ENTER) { - fireEditingStopped(); - } - } - - @Override - public void keyTyped(KeyEvent e) { - - } - } diff --git a/lima-swing/src/main/java/org/chorem/lima/ui/combobox/AccountComboBox.java b/lima-swing/src/main/java/org/chorem/lima/ui/combobox/AccountComboBox.java new file mode 100644 index 0000000..8d094dd --- /dev/null +++ b/lima-swing/src/main/java/org/chorem/lima/ui/combobox/AccountComboBox.java @@ -0,0 +1,70 @@ +package org.chorem.lima.ui.combobox; + +import jaxx.runtime.JAXXContext; +import jaxx.runtime.swing.editor.bean.BeanFilterableComboBox; +import org.chorem.lima.business.LimaServiceFactory; +import org.chorem.lima.business.ServiceListener; +import org.chorem.lima.business.api.AccountService; +import org.chorem.lima.business.api.ImportService; +import org.chorem.lima.business.utils.AccountComparator; +import org.chorem.lima.entity.Account; +import org.nuiton.decorator.DecoratorUtil; + +import java.util.Collections; +import java.util.List; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public class AccountComboBox extends BeanFilterableComboBox<Account> implements ServiceListener { + + protected AccountService accountService; + + protected boolean leafAccounts; + + public AccountComboBox() { + initializeAccountComboBox(); + } + + public AccountComboBox(JAXXContext parentContext) { + super(parentContext); + initializeAccountComboBox(); + } + + private void initializeAccountComboBox() { + leafAccounts = false; + accountService = + LimaServiceFactory.getService(AccountService.class); + LimaServiceFactory.addServiceListener(AccountService.class, this); + LimaServiceFactory.addServiceListener(ImportService.class, this); + init(DecoratorUtil.newMultiJXPathDecorator(Account.class, "${" + Account.PROPERTY_ACCOUNT_NUMBER + "}$s##${" + Account.PROPERTY_LABEL + "}$s", "##", " - "), getDataList()); + } + + public boolean isLeafAccounts() { + return leafAccounts; + } + + public void setLeafAccounts(boolean leafAccounts) { + this.leafAccounts = leafAccounts; + } + + public List<Account> getDataList() { + List<Account> result = leafAccounts ? accountService.getAllLeafAccounts() : accountService.getAllAccounts(); + Collections.sort(result, new AccountComparator()); + return result; + + } + + public void refresh() { + setData(getDataList()); + } + + @Override + public void notifyMethod(String serviceName, String methodName) { + if (serviceName.contains("Account") || + methodName.contains("importAll")) { + refresh(); + } + } + +} diff --git a/lima-swing/src/main/java/org/chorem/lima/ui/combobox/AccountComboBoxModel.java b/lima-swing/src/main/java/org/chorem/lima/ui/combobox/AccountComboBoxModel.java deleted file mode 100644 index 9e59ec7..0000000 --- a/lima-swing/src/main/java/org/chorem/lima/ui/combobox/AccountComboBoxModel.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * #%L - * Lima :: Swing - * %% - * Copyright (C) 2008 - 2012 CodeLutin, Chatellier Eric - * %% - * This program 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, either version 3 of the - * License, or (at your option) any later version. - * - * This program 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/gpl-3.0.html>. - * #L% - */ - -package org.chorem.lima.ui.combobox; - -import org.chorem.lima.business.LimaServiceFactory; -import org.chorem.lima.business.ServiceListener; -import org.chorem.lima.business.api.AccountService; -import org.chorem.lima.business.api.ImportService; -import org.chorem.lima.entity.Account; - -import javax.swing.AbstractListModel; -import javax.swing.ComboBoxModel; -import java.util.List; - -/** Account combo box model. */ - -public class AccountComboBoxModel extends AbstractListModel implements ComboBoxModel, ServiceListener { - - private static final long serialVersionUID = 1L; - - protected Object selectedAccount; - - protected List<Account> datasCache; - - protected AccountService accountService; - - public AccountComboBoxModel() { - accountService = - LimaServiceFactory.getService( - AccountService.class); - LimaServiceFactory.addServiceListener(AccountService.class, this); - LimaServiceFactory.addServiceListener(ImportService.class, this); - datasCache = getDataList(); - } - - @Override - public Object getSelectedItem() { - return selectedAccount; - } - - @Override - public void setSelectedItem(Object anItem) { - selectedAccount = anItem; - fireContentsChanged(this, -1, -1); - } - - - @Override - public Object getElementAt(int index) { - return datasCache.get(index); - } - - @Override - public int getSize() { - return datasCache.size(); - } - - public List<Account> getDataList() { - List<Account> result = accountService.getAllAccounts(); - return result; - - } - - public void refresh() { - datasCache = getDataList(); - fireContentsChanged(this, 0, datasCache.size()); - } - - @Override - public void notifyMethod(String serviceName, String methodeName) { - if (methodeName.contains("Account") || - methodeName.contains("importAll")) { - refresh(); - } - } - - -} diff --git a/lima-swing/src/main/java/org/chorem/lima/ui/common/AccountComboBoxModel.java b/lima-swing/src/main/java/org/chorem/lima/ui/common/AccountComboBoxModel.java deleted file mode 100644 index 76aed9f..0000000 --- a/lima-swing/src/main/java/org/chorem/lima/ui/common/AccountComboBoxModel.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * #%L - * Lima :: Swing - * %% - * Copyright (C) 2012 CodeLutin, Chatellier Eric - * %% - * This program 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, either version 3 of the - * License, or (at your option) any later version. - * - * This program 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/gpl-3.0.html>. - * #L% - */ - -package org.chorem.lima.ui.common; - -import org.chorem.lima.entity.Account; - -/** - * Account combo model. - * - * @author chatellier - * @version $Revision$ - */ -public class AccountComboBoxModel extends GenericComboBoxModel<Account> { - - /** serialVersionUID. */ - private static final long serialVersionUID = 6991293987668268456L; - - /*By default, selection of the account 4*/ - @Override - public Account getElementAt(int index) { - if (getSelectedItem() == null){ - int indexAccountFour = 0; - for (Account compte : objects){ - if (compte.getAccountNumber().equals("4")){ - indexAccountFour = objects.indexOf(compte); - break; - } - } - setSelectedItem(objects.get(indexAccountFour)); - return objects.get(indexAccountFour); - } - return objects.get(index); - } -} diff --git a/lima-swing/src/main/java/org/chorem/lima/ui/lettering/LetteringView.css b/lima-swing/src/main/java/org/chorem/lima/ui/lettering/LetteringView.css index 919c5b9..a06a682 100644 --- a/lima-swing/src/main/java/org/chorem/lima/ui/lettering/LetteringView.css +++ b/lima-swing/src/main/java/org/chorem/lima/ui/lettering/LetteringView.css @@ -48,8 +48,8 @@ #accountComboBox { toolTipText : "lima.lettering.account"; - model : {accountComboBoxModel}; - renderer : {new org.chorem.lima.ui.common.AccountListRenderer()}; + showDecorator : false; + selectedItem : {getHandler().getAccount()}; } #back { diff --git a/lima-swing/src/main/java/org/chorem/lima/ui/lettering/LetteringView.jaxx b/lima-swing/src/main/java/org/chorem/lima/ui/lettering/LetteringView.jaxx index 6fdd8f1..97452f4 100644 --- a/lima-swing/src/main/java/org/chorem/lima/ui/lettering/LetteringView.jaxx +++ b/lima-swing/src/main/java/org/chorem/lima/ui/lettering/LetteringView.jaxx @@ -22,7 +22,6 @@ <import> org.chorem.lima.util.WrapToolBarLayout - org.chorem.lima.ui.common.AccountComboBoxModel org.chorem.lima.ui.common.FinancialPeriodComboBoxModel org.chorem.lima.util.BigDecimalToString org.chorem.lima.ui.lettering.TypeEntry @@ -30,6 +29,7 @@ javax.swing.ListSelectionModel org.jdesktop.swingx.JXDatePicker static org.nuiton.i18n.I18n.t + org.chorem.lima.ui.combobox.AccountComboBox </import> <LetteringViewHandler id="handler" constructorParams="this"/> @@ -60,9 +60,9 @@ <JToolBar.Separator/> <JLabel id="accountLabel"/> - <org.chorem.lima.ui.common.AccountComboBoxModel id="accountComboBoxModel"/> - <JComboBox id="accountComboBox" - onItemStateChanged="handler.setAccount((Account)accountComboBoxModel.getSelectedItem())" /> + <AccountComboBox id="accountComboBox" + constraints="BorderLayout.CENTER" + onPropertyChange="{getHandler().accountComboBoxChange(event);}"/> <JButton id="back" onActionPerformed="handler.back(accountComboBox)"/> <JButton id="next" diff --git a/lima-swing/src/main/java/org/chorem/lima/ui/lettering/LetteringViewHandler.java b/lima-swing/src/main/java/org/chorem/lima/ui/lettering/LetteringViewHandler.java index ab032dd..e4b5694 100644 --- a/lima-swing/src/main/java/org/chorem/lima/ui/lettering/LetteringViewHandler.java +++ b/lima-swing/src/main/java/org/chorem/lima/ui/lettering/LetteringViewHandler.java @@ -30,6 +30,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.chorem.lima.LimaSwingConfig; import org.chorem.lima.beans.LetteringFilterImpl; +import org.chorem.lima.business.LimaServiceFactory; import org.chorem.lima.business.api.AccountService; import org.chorem.lima.business.api.EntryBookService; import org.chorem.lima.business.api.FinancialPeriodService; @@ -39,14 +40,18 @@ import org.chorem.lima.business.exceptions.LockedEntryBookException; import org.chorem.lima.business.exceptions.LockedFinancialPeriodException; import org.chorem.lima.business.exceptions.UnbalancedEntriesException; import org.chorem.lima.entity.Account; -import org.chorem.lima.entity.AccountImpl; import org.chorem.lima.entity.Entry; import org.chorem.lima.entity.FiscalPeriod; -import org.chorem.lima.business.LimaServiceFactory; +import org.chorem.lima.ui.combobox.AccountComboBox; import org.chorem.lima.util.BigDecimalToString; import org.chorem.lima.util.ErrorHelper; -import javax.swing.*; +import javax.swing.AbstractAction; +import javax.swing.ActionMap; +import javax.swing.InputMap; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.KeyStroke; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; @@ -360,19 +365,6 @@ public class LetteringViewHandler{ public void loadComboAndRows(){ - List<Account> allAccounts = accountService.getAllAccounts(); - Account seeAllAccounts = new AccountImpl(); - seeAllAccounts.setAccountNumber("-"); - seeAllAccounts.setLabel(t("lima.lettering.account.aAll")); - allAccounts.add(seeAllAccounts); - - view.getAccountComboBoxModel().setObjects(allAccounts); - - if (!allAccounts.isEmpty()) { - - view.getAccountComboBox().setSelectedItem(allAccounts.get(0)); - } - //By default, we have the beginning of the fiscal period (Or of current //date if no fiscal period) and the end of the current date FiscalPeriod fiscalPeriod = fiscalPeriodService.getLastFiscalPeriod(); @@ -412,8 +404,18 @@ public class LetteringViewHandler{ } public void setAccount(Account account) { - filter.setAccount(account); - updateAllEntries(); + if (filter != null) { + filter.setAccount(account); + updateAllEntries(); + } + } + + public Account getAccount() { + Account account = null; + if (filter != null) { + account = filter.getAccount(); + } + return account; } public void setTypeEntry(TypeEntry typeEntry) { @@ -478,16 +480,23 @@ public class LetteringViewHandler{ } } + public void accountComboBoxChange(PropertyChangeEvent event) { + if (event.getPropertyName().equals(AccountComboBox.PROPERTY_SELECTED_ITEM)) { + setAccount((Account) event.getNewValue()); + } + } + /** * Select previous value in combo box. * - * @param comboBox combo box + * @param accountComboBox account combo box */ - public void back(JComboBox comboBox) { - int row = comboBox.getSelectedIndex(); + public void back(AccountComboBox accountComboBox) { + JComboBox combobox = accountComboBox.getCombobox(); + int row = combobox.getSelectedIndex(); if (row > 0) { - comboBox.setSelectedIndex(row - 1); + combobox.setSelectedIndex(row - 1); } view.getLetteringSelectionModel().clearSelection(); } @@ -495,14 +504,15 @@ public class LetteringViewHandler{ /** * Select next value in combo box. * - * @param comboBox combo box + * @param accountComboBox combo box */ - public void next(JComboBox comboBox) { - int size = comboBox.getModel().getSize(); - int row = comboBox.getSelectedIndex(); + public void next(AccountComboBox accountComboBox) { + JComboBox combobox = accountComboBox.getCombobox(); + int size = combobox.getItemCount(); + int row = combobox.getSelectedIndex(); if (row < size - 1) { - comboBox.setSelectedIndex(row + 1); + combobox.setSelectedIndex(row + 1); } view.getLetteringSelectionModel().clearSelection(); } diff --git a/pom.xml b/pom.xml index 6e2929a..e78b9d7 100644 --- a/pom.xml +++ b/pom.xml @@ -200,7 +200,7 @@ <itextVersion>4.2.1</itextVersion> <jasperreportsVersion>6.0.3</jasperreportsVersion> <javaxServletVersion>3.1.0</javaxServletVersion> - <jaxxVersion>2.16.1</jaxxVersion> + <jaxxVersion>2.24</jaxxVersion> <jbossTransactionVersion>1.0.0.Final</jbossTransactionVersion> <jdomVersion>2.0.5</jdomVersion> <jettyPluginVersion>9.2.3.v20140905</jettyPluginVersion> -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.