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.swing.events.ValueChangedEvent;
024: import com.salmonllc.swing.events.ValueChangedListener;
025: import com.salmonllc.sql.DataStoreBuffer;
026: import com.salmonllc.sql.ModelChangedEvent;
027: import com.salmonllc.sql.ModelChangedListener;
028: import javax.swing.*;
029:
030: /**
031: * SOFIA implementation of a JSpinner. This Combo Box can be bound to a DataStore column
032: */
033:
034: public class SSpinner extends JSpinner implements SComponent,
035: ModelChangedListener {
036: private SComponentHelper _helper;
037: private String _dsCol;
038: private DataStoreBuffer _ds;
039:
040: /**
041: * Constructs a spinner with an <code>Integer SpinnerNumberModel</code>
042: * with initial value 0 and no minimum or maximum limits.
043: */
044: public SSpinner() {
045: _helper = new SComponentHelper(this );
046: }
047:
048: /**
049: * Constructs a complete spinner with pair of next/previous buttons
050: * and an editor for the <code>SpinnerModel</code>.
051: */
052: public SSpinner(SpinnerModel model) {
053: super (model);
054: _helper = new SComponentHelper(this );
055: }
056:
057: /**
058: * Binds the component to a DataStore column
059: * @param dsb The DataStore to bind to
060: * @param column The column to bind to
061: */
062: public void setColumn(DataStoreBuffer dsb, String column) {
063: _ds = dsb;
064: _dsCol = column;
065: _ds.addModelChangedListener(this );
066: evalColumn();
067: }
068:
069: /**
070: * @see ModelChangedListener#modelChanged(ModelChangedEvent)
071: */
072: public void modelChanged(ModelChangedEvent evt) {
073: evalColumn();
074: }
075:
076: private void evalColumn() {
077: _helper.setDataDirty(true);
078: try {
079: if (_ds != null && _dsCol != null) {
080: Object value = _ds.getAny(_dsCol);
081: setValue(value);
082: }
083: } catch (Exception e) {
084: _helper.setDataDirty(false);
085: SpinnerModel m = getModel();
086: if (m instanceof SpinnerNumberModel)
087: setValue(((SpinnerNumberModel) m).getMinimum());
088: else if (m instanceof SpinnerListModel)
089: setValue(((SpinnerListModel) m).getList().get(0));
090: else if (m instanceof SpinnerDateModel)
091: setValue(((SpinnerDateModel) m).getStart());
092: fireStateChanged();
093: }
094: _helper.setDataDirty(false);
095: }
096:
097: /**
098: * This method is used by the framework and should not be called directly
099: */
100: public ValueChangedEvent generateValueChangedEvent() {
101: try {
102: if (_ds == null)
103: return null;
104: else {
105: String val = null;
106: if (getValue() != null)
107: val = getValue().toString();
108: return new ValueChangedEvent(this , _ds
109: .getFormattedString(_dsCol), val, _ds, _ds
110: .getRow(), _ds.getColumnIndex(_dsCol));
111: }
112:
113: } catch (Exception e) {
114: e.printStackTrace();
115: return null;
116: }
117: }
118:
119: /**
120: * This method is used by the framework and should not be called directly
121: */
122: public SComponentHelper getHelper() {
123: return _helper;
124: }
125:
126: /**
127: * This method adds a listener the will be notified when the value in this component changes.
128: * @param l The listener to add.
129: */
130: public void addValueChangedListener(ValueChangedListener l) {
131: _helper.addValueChangedListener(l);
132: }
133:
134: /**
135: * This method removes a listener from the list that will be notified if the text in the component changes.
136: * @param l The listener to remove.
137: */
138: public void removeValueChangedListener(ValueChangedListener l) {
139: _helper.removeValueChangedListener(l);
140: }
141:
142: }
|