001: /*
002: * GNetWatch
003: * Copyright 2006, 2007 Alexandre Fenyo
004: * gnetwatch@fenyo.net
005: *
006: * This file is part of GNetWatch.
007: *
008: * GNetWatch is free software; you can redistribute it and/or modify
009: * it under the terms of the GNU General Public License as published by
010: * the Free Software Foundation; either version 2 of the License, or
011: * (at your option) any later version.
012: *
013: * GNetWatch is distributed in the hope that it will be useful,
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
016: * GNU General Public License for more details.
017: *
018: * You should have received a copy of the GNU General Public License
019: * along with GNetWatch; if not, write to the Free Software
020: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
021: */
022:
023: package net.fenyo.gnetwatch.GUI;
024:
025: import net.fenyo.gnetwatch.Config;
026:
027: import org.apache.commons.logging.Log;
028: import org.apache.commons.logging.LogFactory;
029: import org.eclipse.swt.events.*;
030: import org.eclipse.swt.widgets.*;
031:
032: /**
033: * This class implements an IPv4 address editor.
034: * @author Alexandre Fenyo
035: * @version $Id: IpAddressEditor.java,v 1.9 2007/03/03 00:38:19 fenyo Exp $
036: */
037:
038: public class IpAddressEditor implements KeyListener {
039: public static final long serialVersionUID = 1L;
040:
041: private static Log log = LogFactory.getLog(IpAddressEditor.class);
042:
043: private final Text text;
044: private final Config config;
045:
046: /**
047: * Constructor.
048: * @param text control that is managed by this editor.
049: */
050: // GUI thread
051: public IpAddressEditor(final Config config, final Text text) {
052: this .text = text;
053: this .config = config;
054: text.setText("000.000.000.000");
055: text.addKeyListener(this );
056: }
057:
058: /**
059: * Handles a key event.
060: * @param e event.
061: * @return void.
062: */
063: private void handleKey(KeyEvent e) {
064: String content = text.getText();
065: int position = text.getCaretPosition();
066: // 000.000.000.000
067: if (e.character == '.') {
068: if (position <= 3)
069: position = 4;
070: else if (position > 3 && position <= 7)
071: position = 8;
072: else if (position > 7 && position <= 11)
073: position = 12;
074: text.setSelection(position, position);
075: return;
076: }
077: if (e.character == '\10') {
078: if (position > 0) {
079: position--;
080: text.setSelection(position, position);
081: }
082: return;
083: }
084: if (e.character == '\177') {
085: if (position < 15) {
086: position++;
087: text.setSelection(position, position);
088: }
089: return;
090: }
091: if (position >= 15)
092: position = 14;
093: if (position == 3 || position == 7 || position == 11)
094: position++;
095: String new_content = content.substring(0, position)
096: + e.character + content.substring(position + 1);
097: if (new_content
098: .matches("^[0-9][0-9][0-9]\\.[0-9][0-9][0-9]\\.[0-9][0-9][0-9]\\.[0-9][0-9][0-9]$") == false)
099: return;
100: if (new Integer(new_content.substring(0, 3)).intValue() > 255
101: || new Integer(new_content.substring(4, 7)).intValue() > 255
102: || new Integer(new_content.substring(8, 11)).intValue() > 255
103: || new Integer(new_content.substring(12, 15))
104: .intValue() > 255) {
105: if (position > 13)
106: return;
107: new_content = content.substring(0, position) + e.character
108: + '0' + content.substring(position + 2);
109: if (new Integer(new_content.substring(0, 3)).intValue() > 255
110: || new Integer(new_content.substring(4, 7))
111: .intValue() > 255
112: || new Integer(new_content.substring(8, 11))
113: .intValue() > 255
114: || new Integer(new_content.substring(12, 15))
115: .intValue() > 255)
116: return;
117: text.setText(new_content);
118: if (position < 15)
119: position++;
120: text.setSelection(position, position);
121: return;
122: }
123: text.setText(new_content);
124: if (position < 15)
125: position++;
126: text.setSelection(position, position);
127: }
128:
129: /**
130: * Handles a key press event.
131: * @param e event.
132: * @return void.
133: */
134: // GUI thread
135: public void keyPressed(KeyEvent e) {
136: if (config.getProperty("ipaddresseditor.insertonkeypressed")
137: .equals("true"))
138: handleKey(e);
139: }
140:
141: /**
142: * Handles a key release event.
143: * @param e event.
144: * @return void.
145: */
146: // GUI thread
147: public void keyReleased(KeyEvent e) {
148: if (!config.getProperty("ipaddresseditor.insertonkeypressed")
149: .equals("true"))
150: handleKey(e);
151: }
152:
153: }
|