This is an automated email from the git hooks/post-receive script. New commit to branch feature/3655 in repository jaxx. See http://git.nuiton.org/jaxx.git commit 6b944fe10e7fe4ff4c45abed77159575ebae6c9b Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Mar 20 23:57:01 2015 +0100 refs #3655 amélioration du masque de saisie --- .../widgets/gis/CoordinateComponentPosition.java | 78 ++++++ .../widgets/gis/CoordinateComponentPositions.java | 287 +++++++++++++++++++++ .../gis/absolute/AbsoluteDdCoordinateEditor.jaxx | 4 +- .../AbsoluteDdCoordinateEditorHandler.java | 4 + .../AbsoluteDmdCoordinateEditorHandler.java | 4 + .../AbsoluteDmsCoordinateEditorHandler.java | 4 + 6 files changed, 379 insertions(+), 2 deletions(-) diff --git a/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/CoordinateComponentPosition.java b/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/CoordinateComponentPosition.java new file mode 100644 index 0000000..7ef4636 --- /dev/null +++ b/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/CoordinateComponentPosition.java @@ -0,0 +1,78 @@ +package org.nuiton.jaxx.widgets.gis; + +import org.apache.commons.lang3.builder.ToStringBuilder; + +/** + * Created on 3/20/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.23 + */ +public class CoordinateComponentPosition { + + /** + * index where the component starts. + */ + private final int startIndex; + + /** + * index where the component ends. + */ + private final int endIndex; + + /** + * index where the component + his symbols ends. + */ + private final int endComponentIndex; + + private CoordinateComponentPosition previousComponent; + + private CoordinateComponentPosition nextComponent; + + public CoordinateComponentPosition(int startIndex, int endIndex, int endComponentIndex) { + this.startIndex = startIndex; + this.endIndex = endIndex; + this.endComponentIndex=endComponentIndex; + } + + public int getStartIndex() { + return startIndex; + } + + public int getEndIndex() { + return endIndex; + } + + public int getEndComponentIndex() { + return endComponentIndex; + } + + public boolean containsPosition(int position) { + return startIndex<= position && position <=endComponentIndex; + } + + public CoordinateComponentPosition getPreviousComponent() { + return previousComponent; + } + + public CoordinateComponentPosition getNextComponent() { + return nextComponent; + } + + public void setPreviousComponent(CoordinateComponentPosition previousComponent) { + this.previousComponent = previousComponent; + } + + public void setNextComponent(CoordinateComponentPosition nextComponent) { + this.nextComponent = nextComponent; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("startIndex", startIndex) + .append("endIndex", endIndex) + .append("endComponentIndex", endComponentIndex) + .toString(); + } +} diff --git a/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/CoordinateComponentPositions.java b/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/CoordinateComponentPositions.java new file mode 100644 index 0000000..d9e9c41 --- /dev/null +++ b/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/CoordinateComponentPositions.java @@ -0,0 +1,287 @@ +package org.nuiton.jaxx.widgets.gis; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.swing.JFormattedTextField; +import javax.swing.SwingUtilities; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * Created on 3/20/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.23 + */ +public class CoordinateComponentPositions { + + /** Logger. */ + private static final Log log = LogFactory.getLog(CoordinateComponentPositions.class); + + public static CoordinateComponentPositions create(String mask) { + + Set<CoordinateComponentPosition> componentPositions = new LinkedHashSet<CoordinateComponentPosition>(); + + CoordinateComponentPosition previousComponent = null; + int length = mask.length(); + for (int i = 0; i < length; i++) { + char c = mask.charAt(i); + if (c != '*') { + + int endIndex = i - 1; + int endSymbolIndex = i; + + do { + + char c2 = mask.charAt(endSymbolIndex); + if (c2 == '*') { + break; + } + endSymbolIndex++; + } while (endSymbolIndex < length); + + i = endSymbolIndex; + endSymbolIndex--; + + // new component detected + CoordinateComponentPosition newComponent; + + if (previousComponent == null) { + + // first component + newComponent = new CoordinateComponentPosition(0, endIndex, endSymbolIndex); + + } else { + + // not first component + newComponent = new CoordinateComponentPosition(previousComponent.getEndComponentIndex() + 1, endIndex, endSymbolIndex); + previousComponent.setNextComponent(newComponent); + newComponent.setPreviousComponent(previousComponent); + + } + + addComponent(componentPositions, newComponent); + previousComponent = newComponent; + + } + + } + +// // adding the last component +// CoordinateComponentPosition newComponent = new CoordinateComponentPosition(previousComponent.getEndComponentIndex() + 1, length, length); +// previousComponent.setNextComponent(newComponent); +// newComponent.setPreviousComponent(previousComponent); +// addComponent(componentPositions, newComponent); + + CoordinateComponentPositions result = new CoordinateComponentPositions(componentPositions, length); + return result; + + } + + protected static void addComponent(Set<CoordinateComponentPosition> componentPositions, CoordinateComponentPosition newComponent) { + + if (log.isInfoEnabled()) { + log.info(String.format("New component (%d): %d - %d - %d", componentPositions.size(), newComponent.getStartIndex(), newComponent.getEndIndex(), newComponent.getEndComponentIndex())); + } + componentPositions.add(newComponent); + } + + private final Set<CoordinateComponentPosition> componentPositions; + + private final int length; + + public CoordinateComponentPosition getComponentPosition(int position) { + + if (position >= length) { + position = length - 1; + } + CoordinateComponentPosition result = null; + for (CoordinateComponentPosition componentPosition : componentPositions) { + if (componentPosition.containsPosition(position)) { + result = componentPosition; + break; + } + } + return result; + + } + + public void installKeyListener(JFormattedTextField component) { + + PositionChangedKeyListener handler = new PositionChangedKeyListener(this); + component.addKeyListener(handler); + component.addMouseListener(handler); + component.addFocusListener(handler); + + } + + protected CoordinateComponentPositions(Set<CoordinateComponentPosition> componentPositions, int length) { + this.componentPositions = componentPositions; + this.length = length; + } + + private static class PositionChangedKeyListener implements KeyListener, MouseListener, FocusListener { + + private final CoordinateComponentPositions componentPositions; + + private CoordinateComponentPosition lastComponentPosition = null; + + public PositionChangedKeyListener(CoordinateComponentPositions componentPositions) { + this.componentPositions = componentPositions; + } + + @Override + public void keyTyped(KeyEvent e) { + + } + + @Override + public void keyPressed(KeyEvent e) { + + JFormattedTextField source = (JFormattedTextField) e.getSource(); + int caretPosition = source.getCaretPosition(); + if (e.getKeyCode() == KeyEvent.VK_RIGHT) { + goRight(source, caretPosition); + + e.consume(); + } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { + goLeft(source, caretPosition); + e.consume(); + } + + } + + @Override + public void keyReleased(KeyEvent e) { + + JFormattedTextField source = (JFormattedTextField) e.getSource(); + int caretPosition = source.getCaretPosition(); + CoordinateComponentPosition currentComponentPosition = componentPositions.getComponentPosition(caretPosition); + if (lastComponentPosition == null || !lastComponentPosition.equals(currentComponentPosition)) { + + lastComponentPosition = currentComponentPosition; + + // component changed + SelectComponentAction action = new SelectComponentAction(currentComponentPosition, source); + action.run(); + + } + + } + + protected void goRight(JFormattedTextField source, int caretPosition) { + + if (log.isDebugEnabled()) { + log.debug("Go right from position " + caretPosition); + } + CoordinateComponentPosition currentComponent = componentPositions.getComponentPosition(caretPosition); + CoordinateComponentPosition nextComponent = currentComponent.getNextComponent(); + gotoComponent(source, nextComponent); + + } + + protected void goLeft(JFormattedTextField source, int caretPosition) { + + if (log.isDebugEnabled()) { + log.debug("Go left from position " + caretPosition); + } + CoordinateComponentPosition currentComponent = componentPositions.getComponentPosition(caretPosition); + CoordinateComponentPosition nextComponent = currentComponent.getPreviousComponent(); + gotoComponent(source, nextComponent); + + } + + protected void gotoComponent(JFormattedTextField source, CoordinateComponentPosition nextComponent) { + if (nextComponent != null) { + + // can go to previous group + int startIndex = nextComponent.getStartIndex(); + int endIndex = nextComponent.getEndIndex(); + if (log.isDebugEnabled()) { + log.debug(String.format("Goto component [%s - %s]", startIndex, endIndex)); + } + source.setCaretPosition(startIndex); + + } + } + + @Override + public void mouseClicked(MouseEvent e) { + lastComponentPosition = null; + + JFormattedTextField source = (JFormattedTextField) e.getSource(); + int caretPosition = source.getCaretPosition(); + CoordinateComponentPosition currentComponentPosition = componentPositions.getComponentPosition(caretPosition); + SelectComponentAction action = new SelectComponentAction(currentComponentPosition, source); + SwingUtilities.invokeLater(action); + } + + @Override + public void focusGained(FocusEvent e) { + + lastComponentPosition = null; + JFormattedTextField source = (JFormattedTextField) e.getSource(); + int caretPosition = source.getCaretPosition(); + CoordinateComponentPosition currentComponentPosition = componentPositions.getComponentPosition(caretPosition); + + SelectComponentAction action = new SelectComponentAction(currentComponentPosition, source); + SwingUtilities.invokeLater(action); + + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + + @Override + public void mouseEntered(MouseEvent e) { + + } + + @Override + public void mouseExited(MouseEvent e) { + + } + + @Override + public void focusLost(FocusEvent e) { + + } + } + + private static class SelectComponentAction implements Runnable { + + private final CoordinateComponentPosition componentPosition; + + private final JFormattedTextField source; + + private SelectComponentAction(CoordinateComponentPosition componentPosition, JFormattedTextField source) { + this.componentPosition = componentPosition; + this.source = source; + } + + @Override + public void run() { + int startIndex = componentPosition.getStartIndex(); + int endIndex = componentPosition.getEndIndex() + 1; + if (log.isDebugEnabled()) { + log.debug(String.format("Select component [%s]", componentPosition)); + } + source.select(startIndex, endIndex); + } + } + +} diff --git a/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDdCoordinateEditor.jaxx b/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDdCoordinateEditor.jaxx index 1c10171..4aecc74 100644 --- a/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDdCoordinateEditor.jaxx +++ b/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDdCoordinateEditor.jaxx @@ -42,8 +42,8 @@ <script><![CDATA[ public void init(boolean longitudeEditor) { handler.init(longitudeEditor); } public void setBean(Serializable bean) { model.setBean(bean); } -public void setPropertyDegree(String property ) { model.setPropertyDegree(property); } -public void setPropertyDecimal(String property ) { model.setPropertyDecimal(property); } +public void setPropertyDegree(String property) { model.setPropertyDegree(property); } +public void setPropertyDecimal(String property) { model.setPropertyDecimal(property); } public void setValue(DdCoordinate value) { handler.setValue(value, true); } ]]> </script> diff --git a/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDdCoordinateEditorHandler.java b/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDdCoordinateEditorHandler.java index b4f408a..f8981d2 100644 --- a/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDdCoordinateEditorHandler.java +++ b/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDdCoordinateEditorHandler.java @@ -26,6 +26,7 @@ import com.google.common.base.Preconditions; import jaxx.runtime.spi.UIHandler; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.jaxx.widgets.gis.CoordinateComponentPositions; import org.nuiton.jaxx.widgets.gis.DdCoordinate; import org.nuiton.jaxx.widgets.gis.DdCoordinateConverter; import org.nuiton.jaxx.widgets.gis.MaskFormatterFromConverter; @@ -109,6 +110,9 @@ public class AbsoluteDdCoordinateEditorHandler implements UIHandler<AbsoluteDdCo JFormattedTextField editor = ui.getEditor(); + CoordinateComponentPositions componentPositions = CoordinateComponentPositions.create(pattern); + componentPositions.installKeyListener(editor); + DefaultFormatterFactory formatterFactory = new DefaultFormatterFactory(maskFormatter); editor.setFormatterFactory(formatterFactory); editor.setFocusLostBehavior(JFormattedTextField.COMMIT); diff --git a/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDmdCoordinateEditorHandler.java b/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDmdCoordinateEditorHandler.java index e42e078..7d56bc1 100644 --- a/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDmdCoordinateEditorHandler.java +++ b/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDmdCoordinateEditorHandler.java @@ -26,6 +26,7 @@ import com.google.common.base.Preconditions; import jaxx.runtime.spi.UIHandler; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.jaxx.widgets.gis.CoordinateComponentPositions; import org.nuiton.jaxx.widgets.gis.DmdCoordinate; import org.nuiton.jaxx.widgets.gis.DmdCoordinateConverter; import org.nuiton.jaxx.widgets.gis.MaskFormatterFromConverter; @@ -117,6 +118,9 @@ public class AbsoluteDmdCoordinateEditorHandler implements UIHandler<AbsoluteDmd JFormattedTextField editor = ui.getEditor(); + CoordinateComponentPositions componentPositions = CoordinateComponentPositions.create(pattern.replaceAll("''","'")); + componentPositions.installKeyListener(editor); + DefaultFormatterFactory formatterFactory = new DefaultFormatterFactory(maskFormatter); editor.setFormatterFactory(formatterFactory); editor.setFocusLostBehavior(JFormattedTextField.COMMIT); diff --git a/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDmsCoordinateEditorHandler.java b/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDmsCoordinateEditorHandler.java index 69060ee..d12a214 100644 --- a/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDmsCoordinateEditorHandler.java +++ b/jaxx-widgets-gis/src/main/java/org/nuiton/jaxx/widgets/gis/absolute/AbsoluteDmsCoordinateEditorHandler.java @@ -26,6 +26,7 @@ import com.google.common.base.Preconditions; import jaxx.runtime.spi.UIHandler; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.jaxx.widgets.gis.CoordinateComponentPositions; import org.nuiton.jaxx.widgets.gis.DmsCoordinate; import org.nuiton.jaxx.widgets.gis.DmsCoordinateConverter; import org.nuiton.jaxx.widgets.gis.MaskFormatterFromConverter; @@ -115,6 +116,9 @@ public class AbsoluteDmsCoordinateEditorHandler implements UIHandler<AbsoluteDms JFormattedTextField editor = ui.getEditor(); + CoordinateComponentPositions componentPositions = CoordinateComponentPositions.create(pattern.replaceAll("''","'")); + componentPositions.installKeyListener(editor); + DefaultFormatterFactory formatterFactory = new DefaultFormatterFactory(maskFormatter); editor.setFormatterFactory(formatterFactory); editor.setFocusLostBehavior(JFormattedTextField.COMMIT); -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.