001: //** Copyright Statement ***************************************************
002: //The Salmon Open Framework for Internet Applications (SOFIA)
003: // Copyright (C) 1999 - 2002, Salmon LLC
004: //
005: // This program is free software; you can redistribute it and/or
006: // modify it under the terms of the GNU General Public License version 2
007: // as published by the Free Software Foundation;
008: //
009: // This program is distributed in the hope that it will be useful,
010: // but WITHOUT ANY WARRANTY; without even the implied warranty of
011: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012: // GNU General Public License for more details.
013: //
014: // You should have received a copy of the GNU General Public License
015: // along with this program; if not, write to the Free Software
016: // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
017: //
018: // For more information please visit http://www.salmonllc.com
019: //** End Copyright Statement ***************************************************
020:
021: package com.salmonllc.swing;
022:
023: import com.salmonllc.sql.DataStoreBuffer;
024: import com.salmonllc.sql.DataStoreException;
025: import com.salmonllc.sql.ModelChangedEvent;
026: import com.salmonllc.sql.ModelChangedListener;
027: import com.salmonllc.swing.events.ValueChangedEvent;
028: import com.salmonllc.swing.events.ValueChangedListener;
029:
030: import javax.swing.*;
031: import javax.swing.text.*;
032:
033: /**
034: * SOFIA implementation of a JTextField. This Text Field can be bound to a DataStore column.
035: */
036:
037: public class STextField extends JTextField implements
038: ModelChangedListener, SComponent {
039:
040: private DataStoreBuffer _ds;
041: private String _dsCol;
042: private SComponentHelper _helper;
043:
044: /**
045: * Constructs a new <code>TextField</code>. A default model is created,
046: * the initial string is <code>null</code>,
047: * and the number of columns is set to 0.
048: */
049: public STextField() {
050: super ();
051: _helper = new SComponentHelper(this );
052: }
053:
054: /**
055: * Constructs a new empty <code>TextField</code> with the specified
056: * number of columns.
057: * A default model is created and the initial string is set to
058: * <code>null</code>.
059: *
060: * @param columns the number of columns to use to calculate
061: * the preferred width; if columns is set to zero, the
062: * preferred width will be whatever naturally results from
063: * the component implementation
064: */
065: public STextField(int columns) {
066: super (columns);
067: _helper = new SComponentHelper(this );
068: }
069:
070: /**
071: * Constructs a new <code>TextField</code> initialized with the
072: * specified text. A default model is created and the number of
073: * columns is 0.
074: *
075: * @param text the text to be displayed, or <code>null</code>
076: */
077: public STextField(String text) {
078: super (text);
079: _helper = new SComponentHelper(this );
080: }
081:
082: /**
083: * Constructs a new <code>TextField</code> initialized with the
084: * specified text and columns. A default model is created.
085: *
086: * @param text the text to be displayed, or <code>null</code>
087: * @param columns the number of columns to use to calculate
088: * the preferred width; if columns is set to zero, the
089: * preferred width will be whatever naturally results from
090: * the component implementation
091: */
092: public STextField(String text, int columns) {
093: super (text, columns);
094: _helper = new SComponentHelper(this );
095: }
096:
097: /**
098: * Binds the component to a DataStore column
099: * @param dsb The DataStore to bind to
100: * @param column The column to bind to
101: */
102: public void setColumn(DataStoreBuffer dsb, String column) {
103: _ds = dsb;
104: _dsCol = column;
105: _ds.addModelChangedListener(this );
106: evalColumn();
107: }
108:
109: /**
110: * Overrides the setDocument Method such that the documentlistener can be added.
111: * @param doc The Document model to use
112: */
113: public void setDocument(Document doc) {
114: super .setDocument(doc);
115: doc.removeDocumentListener(_helper);
116: doc.addDocumentListener(_helper);
117: }
118:
119: /**
120: * @see com.salmonllc.sql.ModelChangedListener#modelChanged(ModelChangedEvent)
121: */
122: public void modelChanged(ModelChangedEvent evt) {
123: evalColumn();
124: }
125:
126: private void evalColumn() {
127: try {
128: if (_ds != null && _dsCol != null) {
129: setText(_ds.getFormattedString(_dsCol));
130: _helper.setDataDirty(false);
131: }
132: } catch (Exception e) {
133: setText(null);
134: }
135: }
136:
137: /**
138: * Returns the value of the data in the component for the current row in the DataStore.
139: */
140: public String getValue() {
141: try {
142: if (_ds != null) {
143: if (_helper.isDataDirty())
144: return getText();
145: else
146: return _ds.getFormattedString(_dsCol);
147: }
148: } catch (DataStoreException ex) {
149: ex.printStackTrace();
150: return null;
151: }
152: return getText();
153: }
154:
155: /**
156: * This method is used by the framework and should not be called directly
157: */
158: public ValueChangedEvent generateValueChangedEvent() {
159: try {
160: if (_ds == null || _ds.getRow() < 0)
161: return null;
162: else {
163: String newValue = getText();
164: return new ValueChangedEvent(this , _ds
165: .getFormattedString(_dsCol), newValue, _ds, _ds
166: .getRow(), _ds.getColumnIndex(_dsCol));
167: }
168: } catch (Exception e) {
169: e.printStackTrace();
170: return null;
171: }
172: }
173:
174: /**
175: * This method is used by the framework and should not be called directly
176: */
177: public SComponentHelper getHelper() {
178: return _helper;
179: }
180:
181: /**
182: * This method adds a listener the will be notified when the value in this component changes.
183: * @param l The listener to add.
184: */
185: public void addValueChangedListener(ValueChangedListener l) {
186: _helper.addValueChangedListener(l);
187: }
188:
189: /**
190: * This method removes a listener from the list that will be notified if the text in the component changes.
191: * @param l The listener to remove.
192: */
193: public void removeValueChangedListener(ValueChangedListener l) {
194: _helper.removeValueChangedListener(l);
195: }
196:
197: /**
198: * Returns the maximum number of characters you are allowed to type in this box
199: */
200: public int getMaxLength() {
201: return _helper.getMaxLength();
202: }
203:
204: /**
205: * Sets the maximum number of characters you are allowed to type in this box
206: */
207: public void setMaxLength(int maxLength) {
208: _helper.setMaxLength(maxLength);
209: }
210: }
|