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.*;
024: import com.salmonllc.swing.events.ValueChangedEvent;
025:
026: import javax.swing.*;
027: import java.awt.*;
028: import java.net.URL;
029: import java.net.MalformedURLException;
030:
031: /**
032: * SOFIA implementation of a Swing ImageIcon. This icon allows binding to DataStore columns for either an image URL or an image byte array.
033: */
034: public class SIcon extends ImageIcon implements ModelChangedListener,
035: SComponent {
036: private DataStoreEvaluator _eval;
037: private Object _currentValue;
038: private JComponent _parent;
039:
040: /**
041: * Creates a new SIcon
042: */
043: public SIcon() {
044: _currentValue = null;
045: }
046:
047: /**
048: * Binds the component to a DataStore expression
049: * @param buf The DataStore to bind to
050: * @param expression The DataStore expression to compute. It can return a url string or a byte array.
051: * @throws DataStoreException if the expression is invalid
052: */
053: public void setExpression(DataStoreBuffer buf, String expression)
054: throws DataStoreException {
055: _eval = new DataStoreEvaluator(buf, expression);
056: buf.addModelChangedListener(this );
057: evalExpression();
058: }
059:
060: /**
061: * Binds the component to a DataStore expression. It can return a url string or a byte array.
062: * @param buf The DataStore to bind to
063: * @param expression The DataStore expression to compute
064: * @throws DataStoreException if the expression is invalid
065: */
066: public void setExpression(DataStoreBuffer buf,
067: DataStoreExpression expression) throws DataStoreException {
068: _eval = new DataStoreEvaluator(buf, expression);
069: buf.addModelChangedListener(this );
070: evalExpression();
071: }
072:
073: /**
074: * Part of the model changed listener interface, don't call this method directly
075: */
076: public void modelChanged(ModelChangedEvent evt) {
077: evalExpression();
078: }
079:
080: private void evalExpression() {
081: Object o = null;
082: try {
083: if (_eval != null)
084: o = _eval.evaluateRow();
085:
086: if (!SComponentHelper.valuesEqual(o, _currentValue)) {
087: Image newImage = null;
088: if (o instanceof String) {
089: URL location = new URL((String) o);
090: newImage = Toolkit.getDefaultToolkit().getImage(
091: location);
092: } else if (o instanceof byte[]) {
093: newImage = Toolkit.getDefaultToolkit().createImage(
094: (byte[]) o);
095: }
096: if (newImage != null) {
097: setImage(newImage);
098: loadImage(newImage);
099: if (_parent != null) {
100: _parent.revalidate();
101: _parent.repaint();
102: }
103: }
104: }
105: } catch (DataStoreException ex) {
106: ex.printStackTrace();
107: } catch (MalformedURLException ex) {
108: ex.printStackTrace();
109: }
110: }
111:
112: /**
113: * This method is used by the framework and should not be called directly
114: */
115: public ValueChangedEvent generateValueChangedEvent() {
116: return null;
117: }
118:
119: /**
120: * This method is used by the framework and should not be called directly
121: */
122: public SComponentHelper getHelper() {
123: return null;
124: }
125:
126: /**
127: * Returns the parent component (may be null)
128: */
129: public JComponent getParent() {
130: return _parent;
131: }
132:
133: /**
134: * Sets the parent component
135: */
136: public void setParent(JComponent parent) {
137: _parent = parent;
138: }
139:
140: }
|