Commit bdb6b030 authored by PECQUOT's avatar PECQUOT

[fix] Change default columns order to set program before depth (Mantis #48308)

[fix] Fix login 'enter' key behavior (Mantis #48304)
[fix] The login 'enter' key behavior was propagated to other components (Mantis #48378)
[fix] Wrong access to parent handler when measurements table is full screen (Mantis #48309)
ready to release 3.7.2
Signed-off-by: PECQUOT's avatarlp1ee9d <ludovic.pecquot@e-is.pro>
parent 2381090c
## Sprint 75 - v3.7.2
- Aucune mise à jour de base de données
## Sprint 74 - v3.7.1
- Aucune mise à jour de base de données
......
......@@ -117,13 +117,6 @@
</site>
</distributionManagement>
<!-- <issueManagement>-->
<!-- <system>Mantis</system>-->
<!-- <url>-->
<!-- https://forge.ifremer.fr/mantis/set_project.php?project_id=201-->
<!-- </url>-->
<!-- </issueManagement>-->
<mailingLists>
<mailingList>
<name>Developers mailing list</name>
......@@ -178,7 +171,7 @@
<maven.compiler.debug>true</maven.compiler.debug>
<!-- Quadrige3 Core version -->
<quadrige3-core.version>3.5.0</quadrige3-core.version>
<quadrige3-core.version>3.5.1</quadrige3-core.version>
<!-- Last ReefDb launcher version -->
<launcherVersion>3.0.3</launcherVersion>
......
......@@ -61,6 +61,10 @@ public abstract class AbstractReefDbRemoteSaveAction<M extends AbstractBeanUIMod
super(handler, hideBody);
}
public boolean isSaveAborted() {
return saveAborted;
}
@Override
public boolean prepareAction() throws Exception {
......@@ -94,11 +98,13 @@ public abstract class AbstractReefDbRemoteSaveAction<M extends AbstractBeanUIMod
return;
}
// Perform save action
// Perform save action and reload
try {
doSave();
reload();
} catch (Throwable throwable) {
// If a concurrent save occurs, ask user to import referential
......@@ -119,7 +125,7 @@ public abstract class AbstractReefDbRemoteSaveAction<M extends AbstractBeanUIMod
doImportReferential();
// then reload
afterReferentialUpdate();
reload();
} else {
......@@ -141,7 +147,7 @@ public abstract class AbstractReefDbRemoteSaveAction<M extends AbstractBeanUIMod
}
}
protected void afterReferentialUpdate() {
protected void reload() {
// nothing by default
}
......@@ -151,7 +157,7 @@ public abstract class AbstractReefDbRemoteSaveAction<M extends AbstractBeanUIMod
@Override
public void postSuccessAction() {
if (saveAborted) {
if (isSaveAborted()) {
// no reload if aborted
return;
}
......
......@@ -114,27 +114,30 @@
}
#menuConfigProgrammesStrategies {
actionIcon: program;
text: "reefdb.main.menu.configuration.progammesStrategies";
toolTipText: "reefdb.main.menu.configuration.progammesStrategies.tip";
i18nMnemonic: "reefdb.main.menu.configuration.progammesStrategies.mnemonic";
_applicationAction: {fr.ifremer.reefdb.ui.swing.action.GoToProgramAction.class};
enabled: {model.isAuthenticated()};
enabled: {(model.isSynchroEnabled() || !model.getConfiguration().isSynchronizationUsingServer()) && !model.isAuthenticatedAsLocalUser() && !model.isSynchroRunning()};
}
#menuCampaign {
actionIcon: campaign;
text: "reefdb.main.menu.configuration.campaigns";
toolTipText: "reefdb.main.menu.configuration.campaigns.tip";
i18nMnemonic: "reefdb.main.menu.configuration.campaigns.mnemonic";
_applicationAction: {fr.ifremer.reefdb.ui.swing.action.GoToCampaignAction.class};
enabled: {model.isAuthenticated()};
enabled: {(model.isSynchroEnabled() || !model.getConfiguration().isSynchronizationUsingServer()) && !model.isAuthenticatedAsLocalUser() && !model.isSynchroRunning()};
}
#menuConfigReglesControles {
actionIcon: rule-list;
text: "reefdb.main.menu.configuration.control";
toolTipText: "reefdb.main.menu.configuration.control.tip";
i18nMnemonic: "reefdb.main.menu.configuration.control.mnemonic";
_applicationAction: {fr.ifremer.reefdb.ui.swing.action.GoToRuleListAction.class};
enabled: {model.isAuthenticated()};
enabled: {(model.isSynchroEnabled() || !model.getConfiguration().isSynchronizationUsingServer()) && !model.isAuthenticatedAsLocalUser() && !model.isSynchroRunning()};
}
#menuConfigContextesLocaux {
......
......@@ -179,6 +179,22 @@ public class SurveysTableUIHandler extends
*/
private void initTable() {
// Program cell editor
TableColumnExt programmeCol = addColumn(
programCellEditor,
newTableCellRender(SurveysTableModel.PROGRAM),
SurveysTableModel.PROGRAM);
programmeCol.setSortable(true);
programmeCol.setPreferredWidth(200);
// Campaign
TableColumnExt campaignCol = addColumn(
campaignCellEditor,
newTableCellRender(SurveysTableModel.CAMPAIGN),
SurveysTableModel.CAMPAIGN);
campaignCol.setSortable(true);
campaignCol.setPreferredWidth(200);
// lieu
TableColumnExt lieuCol = addColumn(
locationCellEditor,
......@@ -208,22 +224,6 @@ public class SurveysTableUIHandler extends
depthAnalystCol.setSortable(true);
depthAnalystCol.setPreferredWidth(200);
// Program cell editor
TableColumnExt programmeCol = addColumn(
programCellEditor,
newTableCellRender(SurveysTableModel.PROGRAM),
SurveysTableModel.PROGRAM);
programmeCol.setSortable(true);
programmeCol.setPreferredWidth(200);
// Campaign
TableColumnExt campaignCol = addColumn(
campaignCellEditor,
newTableCellRender(SurveysTableModel.CAMPAIGN),
SurveysTableModel.CAMPAIGN);
campaignCol.setSortable(true);
campaignCol.setPreferredWidth(200);
// Commentaire
final TableColumnExt colonneCommentaire = addCommentColumn(SurveysTableModel.COMMENT);
colonneCommentaire.setSortable(false);
......
......@@ -67,7 +67,7 @@ public class CampaignsUIHandler extends AbstractReefDbUIHandler<CampaignsUIModel
final CampaignsUIModel model = new CampaignsUIModel();
ui.setContextValue(model);
ui.setContextValue(SwingUtil.createActionIcon("config"));
ui.setContextValue(SwingUtil.createActionIcon("campaign"));
}
......
......@@ -48,7 +48,7 @@ public class SaveAction extends AbstractReefDbRemoteSaveAction<CampaignsUIModel,
}
@Override
protected void afterReferentialUpdate() {
protected void reload() {
getActionEngine().runInternalAction(getUI().getMenuUI().getHandler(), SearchAction.class);
......
......@@ -61,7 +61,7 @@ public class ProgramsUIHandler extends AbstractReefDbUIHandler<ProgramsUIModel,
// create model and register to the JAXX context
ui.setContextValue(new ProgramsUIModel());
ui.setContextValue(SwingUtil.createActionIcon("config"));
ui.setContextValue(SwingUtil.createActionIcon("program"));
}
/** {@inheritDoc} */
......
......@@ -77,7 +77,7 @@ public class SaveAction extends AbstractReefDbRemoteSaveAction<ProgramsUIModel,
}
@Override
protected void afterReferentialUpdate() {
protected void reload() {
reloadedPrograms = getContext().getProgramStrategyService().getWritablePrograms();
......@@ -129,6 +129,10 @@ public class SaveAction extends AbstractReefDbRemoteSaveAction<ProgramsUIModel,
public void postSuccessAction() {
super.postSuccessAction();
// don't finish action if remote save is aborted (Mantis #48235)
if (isSaveAborted())
return;
// Reload list with saved data
getUI().getMenuUI().getProgramMnemonicCombo().setData(reloadedPrograms);
getUI().getMenuUI().getProgramCodeCombo().setData(reloadedPrograms);
......
......@@ -48,7 +48,7 @@ public class StrategiesLieuxUIHandler extends AbstractReefDbUIHandler<Strategies
// create model and register to the JAXX context
ui.setContextValue(new StrategiesLieuxUIModel());
ui.setContextValue(SwingUtil.createActionIcon("config"));
ui.setContextValue(SwingUtil.createActionIcon("program"));
}
/** {@inheritDoc} */
......
......@@ -67,7 +67,7 @@ public class RulesUIHandler extends AbstractReefDbUIHandler<RulesUIModel, RulesU
// create model and register to the JAXX context
ui.setContextValue(new RulesUIModel());
ui.setContextValue(SwingUtil.createActionIcon("config"));
ui.setContextValue(SwingUtil.createActionIcon("rule-list"));
}
/** {@inheritDoc} */
......
......@@ -57,7 +57,7 @@ public class SaveAction extends AbstractReefDbRemoteSaveAction<RulesUIModel, Rul
}
@Override
protected void afterReferentialUpdate() {
protected void reload() {
getActionEngine().runInternalAction(getUI().getRulesMenuUI().getHandler(), SearchAction.class);
......@@ -98,6 +98,10 @@ public class SaveAction extends AbstractReefDbRemoteSaveAction<RulesUIModel, Rul
public void postSuccessAction() {
super.postSuccessAction();
// don't finish action if remote save is aborted (Mantis #48235)
if (isSaveAborted())
return;
// If control rules in table, force newCode state to false (Mantis #46446)
if (getModel().getControlRuleUIModel().getRowCount() > 0) {
getModel().getControlRuleUIModel().getRows().forEach(controlRuleRowModel -> controlRuleRowModel.setNewCode(false));
......
......@@ -84,6 +84,10 @@ public class ObservationUIHandler extends AbstractReefDbTabContainerUIHandler<Ob
getModel().setOperationMeasurementsTabUIModel(getUI().getOperationMeasurementsTabUI().getModel());
getModel().setPhotosTabUIModel(getUI().getPhotosTabUI().getModel());
// Add main handler to other model (Mantis #48309)
getModel().getSurveyMeasurementsTabUIModel().setObservationHandler(this);
getModel().getOperationMeasurementsTabUIModel().setObservationHandler(this);
// Ajout des onglets
setCustomTab(ReefDbTabIndexes.ONGLET_OBSERVATION_GENERAL, getModel().getSurveyDetailsTabUIModel());
setCustomTab(ReefDbTabIndexes.ONGLET_OBSERVATION_MESURES, getModel().getSurveyMeasurementsTabUIModel());
......
......@@ -34,8 +34,6 @@ import fr.ifremer.reefdb.dto.enums.FilterTypeValues;
import fr.ifremer.reefdb.dto.referential.TaxonDTO;
import fr.ifremer.reefdb.dto.referential.TaxonGroupDTO;
import fr.ifremer.reefdb.dto.referential.pmfm.PmfmDTO;
import fr.ifremer.reefdb.ui.swing.content.observation.ObservationUI;
import fr.ifremer.reefdb.ui.swing.content.observation.ObservationUIHandler;
import fr.ifremer.reefdb.ui.swing.content.observation.ObservationUIModel;
import fr.ifremer.reefdb.ui.swing.content.observation.operation.measurement.grouped.OperationMeasurementsGroupedRowModel;
import fr.ifremer.reefdb.ui.swing.content.observation.operation.measurement.grouped.OperationMeasurementsGroupedTableUI;
......@@ -218,7 +216,7 @@ public class OperationMeasurementsTabUIHandler extends AbstractReefDbUIHandler<O
getUI().getSelectionGroupeTaxonCombo().setActionEnabled(!forceNoFilter && getContext().getDataContext().isContextFiltered(FilterTypeValues.TAXON_GROUP));
List<TaxonGroupDTO> taxonGroups = getObservationUIHandler().getAvailableTaxonGroups(taxon,forceNoFilter);
List<TaxonGroupDTO> taxonGroups = getModel().getObservationUIHandler().getAvailableTaxonGroups(taxon,forceNoFilter);
getUI().getSelectionGroupeTaxonCombo().setData(taxonGroups);
......@@ -234,7 +232,7 @@ public class OperationMeasurementsTabUIHandler extends AbstractReefDbUIHandler<O
getUI().getSelectionTaxonCombo().setActionEnabled(!forceNoFilter && getContext().getDataContext().isContextFiltered(FilterTypeValues.TAXON));
List<TaxonDTO> taxons = getObservationUIHandler().getAvailableTaxons(taxonGroup, forceNoFilter);
List<TaxonDTO> taxons = getModel().getObservationUIHandler().getAvailableTaxons(taxonGroup, forceNoFilter);
getUI().getSelectionTaxonCombo().setData(taxons);
......@@ -491,10 +489,6 @@ public class OperationMeasurementsTabUIHandler extends AbstractReefDbUIHandler<O
}
}
private ObservationUIHandler getObservationUIHandler() {
return getParentContainer(ObservationUI.class).getHandler();
}
/**
* {@inheritDoc}
*/
......
......@@ -26,6 +26,7 @@ package fr.ifremer.reefdb.ui.swing.content.observation.operation.measurement;
import fr.ifremer.reefdb.dto.data.sampling.SamplingOperationDTO;
import fr.ifremer.reefdb.dto.referential.TaxonDTO;
import fr.ifremer.reefdb.dto.referential.TaxonGroupDTO;
import fr.ifremer.reefdb.ui.swing.content.observation.ObservationUIHandler;
import fr.ifremer.reefdb.ui.swing.content.observation.ObservationUIModel;
import fr.ifremer.reefdb.ui.swing.content.observation.operation.measurement.grouped.OperationMeasurementsGroupedTableUIModel;
import fr.ifremer.reefdb.ui.swing.content.observation.operation.measurement.ungrouped.OperationMeasurementsUngroupedTableUIModel;
......@@ -50,6 +51,7 @@ public class OperationMeasurementsTabUIModel extends AbstractEmptyUIModel<Operat
/** Constant <code>PROPERTY_TAXON="taxon"</code> */
public static final String PROPERTY_TAXON = "taxon";
private ObservationUIModel observationModel;
private ObservationUIHandler observationHandler;
private SamplingOperationDTO sampling;
private TaxonGroupDTO taxonGroup;
private TaxonDTO taxon;
......@@ -90,6 +92,15 @@ public class OperationMeasurementsTabUIModel extends AbstractEmptyUIModel<Operat
firePropertyChange(PROPERTY_OBSERVATION_MODEL, null, observationModel);
}
public ObservationUIHandler getObservationUIHandler() {
return observationHandler;
}
public void setObservationHandler(ObservationUIHandler observationHandler) {
this.observationHandler = observationHandler;
groupedTableUIModel.setObservationHandler(observationHandler);
}
/**
* <p>Getter for the field <code>sampling</code>.</p>
*
......
......@@ -50,8 +50,6 @@ import fr.ifremer.reefdb.dto.referential.TaxonDTO;
import fr.ifremer.reefdb.dto.referential.TaxonGroupDTO;
import fr.ifremer.reefdb.dto.referential.pmfm.PmfmDTO;
import fr.ifremer.reefdb.dto.referential.pmfm.QualitativeValueDTO;
import fr.ifremer.reefdb.ui.swing.content.observation.ObservationUI;
import fr.ifremer.reefdb.ui.swing.content.observation.ObservationUIHandler;
import fr.ifremer.reefdb.ui.swing.util.ReefDbUI;
import fr.ifremer.reefdb.ui.swing.util.table.AbstractReefDbTableUIHandler;
import fr.ifremer.reefdb.ui.swing.util.table.PmfmTableColumn;
......@@ -138,7 +136,7 @@ public abstract class AbstractMeasurementsGroupedTableUIHandler<
taxonCellEditor.getCombo().setActionEnabled(!forceNoFilter /*&& getContext().getDataContext().isContextFiltered(FilterTypeValues.TAXON)*/);
// List<TaxonDTO> taxons = getContext().getObservationService().getAvailableTaxons(row == null ? null : row.getTaxonGroup(), forceNoFilter);
List<TaxonDTO> taxons = getObservationUIHandler().getAvailableTaxons(row == null || forceNoFilter ? null : row.getTaxonGroup(), false);
List<TaxonDTO> taxons = getModel().getObservationUIHandler().getAvailableTaxons(row == null || forceNoFilter ? null : row.getTaxonGroup(), false);
taxonCellEditor.getCombo().setData(taxons);
// Mantis #0028101 : don't affect taxon in row, even there is no corresponding
......@@ -168,7 +166,7 @@ public abstract class AbstractMeasurementsGroupedTableUIHandler<
taxonGroupCellEditor.getCombo().setActionEnabled(!forceNoFilter /*&& getContext().getDataContext().isContextFiltered(FilterTypeValues.TAXON_GROUP)*/);
// List<TaxonGroupDTO> taxonGroups = getContext().getObservationService().getAvailableTaxonGroups(row == null ? null : row.getTaxon(), forceNoFilter);
List<TaxonGroupDTO> taxonGroups = getObservationUIHandler().getAvailableTaxonGroups(row == null || forceNoFilter ? null : row.getTaxon(), false);
List<TaxonGroupDTO> taxonGroups = getModel().getObservationUIHandler().getAvailableTaxonGroups(row == null || forceNoFilter ? null : row.getTaxon(), false);
taxonGroupCellEditor.getCombo().setData(taxonGroups);
......@@ -1055,10 +1053,6 @@ public abstract class AbstractMeasurementsGroupedTableUIHandler<
Private methods
*/
private ObservationUIHandler getObservationUIHandler() {
return getParentContainer(ObservationUI.class).getHandler();
}
private void setDirty(Object bean) {
if (bean instanceof DirtyAware) ((DirtyAware) bean).setDirty(true);
}
......
......@@ -33,6 +33,7 @@ import fr.ifremer.reefdb.dto.data.sampling.SamplingOperationDTO;
import fr.ifremer.reefdb.dto.referential.TaxonDTO;
import fr.ifremer.reefdb.dto.referential.TaxonGroupDTO;
import fr.ifremer.reefdb.dto.referential.pmfm.PmfmDTO;
import fr.ifremer.reefdb.ui.swing.content.observation.ObservationUIHandler;
import fr.ifremer.reefdb.ui.swing.content.observation.ObservationUIModel;
import fr.ifremer.reefdb.ui.swing.util.table.AbstractReefDbTableUIModel;
import fr.ifremer.reefdb.ui.swing.util.table.ReefDbColumnIdentifier;
......@@ -53,6 +54,7 @@ public abstract class AbstractMeasurementsGroupedTableUIModel<B extends Quadrige
// the survey model
private ObservationUIModel survey;
private ObservationUIHandler observationHandler;
// pmfms with unique constraint
private List<PmfmDTO> uniquePmfms;
// the measurement filter
......@@ -82,6 +84,14 @@ public abstract class AbstractMeasurementsGroupedTableUIModel<B extends Quadrige
firePropertyChange(PROPERTY_SURVEY, null, survey);
}
public ObservationUIHandler getObservationUIHandler() {
return observationHandler;
}
public void setObservationHandler(ObservationUIHandler observationHandler) {
this.observationHandler = observationHandler;
}
/**
* <p>Getter for the field <code>uniquePmfms</code>.</p>
*
......
......@@ -32,8 +32,6 @@ import fr.ifremer.reefdb.dto.enums.FilterTypeValues;
import fr.ifremer.reefdb.dto.referential.TaxonDTO;
import fr.ifremer.reefdb.dto.referential.TaxonGroupDTO;
import fr.ifremer.reefdb.dto.referential.pmfm.PmfmDTO;
import fr.ifremer.reefdb.ui.swing.content.observation.ObservationUI;
import fr.ifremer.reefdb.ui.swing.content.observation.ObservationUIHandler;
import fr.ifremer.reefdb.ui.swing.content.observation.ObservationUIModel;
import fr.ifremer.reefdb.ui.swing.content.observation.shared.MeasurementsFilter;
import fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement.grouped.SurveyMeasurementsGroupedTableUIModel;
......@@ -80,6 +78,7 @@ public class SurveyMeasurementsTabUIHandler extends AbstractReefDbUIHandler<Surv
// init comboboxes
initComboBox();
// affect models
getModel().setUngroupedTableUIModel(getUI().getUngroupedTable().getModel());
getModel().setGroupedTableUIModel(getUI().getGroupedTable().getModel());
......@@ -176,7 +175,7 @@ public class SurveyMeasurementsTabUIHandler extends AbstractReefDbUIHandler<Surv
getUI().getSelectionGroupeTaxonCombo().setActionEnabled(!forceNoFilter && getContext().getDataContext().isContextFiltered(FilterTypeValues.TAXON_GROUP));
List<TaxonGroupDTO> taxonGroups = getObservationUIHandler().getAvailableTaxonGroups(taxon, forceNoFilter);
List<TaxonGroupDTO> taxonGroups = getModel().getObservationUIHandler().getAvailableTaxonGroups(taxon, forceNoFilter);
getUI().getSelectionGroupeTaxonCombo().setData(taxonGroups);
......@@ -192,7 +191,7 @@ public class SurveyMeasurementsTabUIHandler extends AbstractReefDbUIHandler<Surv
getUI().getSelectionTaxonCombo().setActionEnabled(!forceNoFilter && getContext().getDataContext().isContextFiltered(FilterTypeValues.TAXON));
List<TaxonDTO> taxons = getObservationUIHandler().getAvailableTaxons(taxonGroup, forceNoFilter);
List<TaxonDTO> taxons = getModel().getObservationUIHandler().getAvailableTaxons(taxonGroup, forceNoFilter);
getUI().getSelectionTaxonCombo().setData(taxons);
......@@ -298,10 +297,6 @@ public class SurveyMeasurementsTabUIHandler extends AbstractReefDbUIHandler<Surv
getModel().getGroupedTableUIModel().setMeasurementFilter(measurementFilter);
}
private ObservationUIHandler getObservationUIHandler() {
return getParentContainer(ObservationUI.class).getHandler();
}
/** {@inheritDoc} */
@Override
public SwingValidator<SurveyMeasurementsTabUIModel> getValidator() {
......
......@@ -25,6 +25,7 @@ package fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement;
import fr.ifremer.reefdb.dto.referential.TaxonDTO;
import fr.ifremer.reefdb.dto.referential.TaxonGroupDTO;
import fr.ifremer.reefdb.ui.swing.content.observation.ObservationUIHandler;
import fr.ifremer.reefdb.ui.swing.content.observation.ObservationUIModel;
import fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement.grouped.SurveyMeasurementsGroupedTableUIModel;
import fr.ifremer.reefdb.ui.swing.content.observation.survey.measurement.ungrouped.SurveyMeasurementsUngroupedTableUIModel;
......@@ -45,6 +46,7 @@ public class SurveyMeasurementsTabUIModel extends AbstractEmptyUIModel<SurveyMea
/** Constant <code>PROPERTY_TAXON="taxon"</code> */
public static final String PROPERTY_TAXON = "taxon";
private ObservationUIModel observationModel;
private ObservationUIHandler observationHandler;
private TaxonGroupDTO taxonGroup;
private TaxonDTO taxon;
private boolean adjusting;
......@@ -84,6 +86,15 @@ public class SurveyMeasurementsTabUIModel extends AbstractEmptyUIModel<SurveyMea
firePropertyChange(PROPERTY_OBSERVATION_MODEL, null, observationModel);
}
public ObservationUIHandler getObservationUIHandler() {
return observationHandler;
}
public void setObservationHandler(ObservationUIHandler observationHandler) {
this.observationHandler = observationHandler;
groupedTableUIModel.setObservationHandler(observationHandler);
}
/**
* <p>Getter for the field <code>taxonGroup</code>.</p>
*
......
......@@ -31,6 +31,21 @@
</properties>
<body>
<release version="3.7.2" date="2019-07-25" description="Stable release">
<action dev="ludovic.pecquot@e-is.pro" type="fix" issue="48308">
Change default columns order to set program before depth
</action>
<action dev="ludovic.pecquot@e-is.pro" type="fix" issue="48304">
Fix login 'enter' key behavior
</action>
<action dev="ludovic.pecquot@e-is.pro" type="fix" issue="48378">
The login 'enter' key behavior was propagated to other components
</action>
<action dev="ludovic.pecquot@e-is.pro" type="fix" issue="48309">
Wrong access to parent handler when measurements table is full screen
</action>
</release>
<release version="3.7.1" date="2019-07-13" description="Stable release">
<action dev="ludovic.pecquot@e-is.pro" type="add" issue="48009">
Renaming PMFM (PSFM) to PMFMU (PSFMU)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment