branch feature/3655 created (now 6b944fe)
This is an automated email from the git hooks/post-receive script. New change to branch feature/3655 in repository jaxx. See http://git.nuiton.org/jaxx.git at 6b944fe refs #3655 amélioration du masque de saisie This branch includes the following new commits: new 6b944fe refs #3655 amélioration du masque de saisie The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: 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 -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
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>.
participants (1)
-
nuiton.org scm