001/*
002 * Copyright (c) 2005 Einar Pehrson <einar@pehrson.nu>.
003 *
004 * This file is part of
005 * CleanSheets - a spreadsheet application for the Java platform.
006 *
007 * CleanSheets is free software; you can redistribute it and/or modify
008 * it under the terms of the GNU General Public License as published by
009 * the Free Software Foundation; either version 2 of the License, or
010 * (at your option) any later version.
011 *
012 * CleanSheets is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
015 * GNU General Public License for more details.
016 *
017 * You should have received a copy of the GNU General Public License
018 * along with CleanSheets; if not, write to the Free Software
019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
020 */
021package csheets.ext;
022
023import java.util.SortedSet;
024import java.util.TreeSet;
025
026import csheets.core.Address;
027import csheets.core.Cell;
028import csheets.core.CellListener;
029import csheets.core.Spreadsheet;
030import csheets.core.Value;
031import csheets.core.formula.Formula;
032import csheets.core.formula.compiler.FormulaCompilationException;
033
034/**
035 * A base class for extensions of cells in a spreadsheet that uses delegation
036 * to provide cell data.
037 * @author Einar Pehrson
038 */
039public abstract class CellExtension implements Cell, CellListener {
040
041        /** The delegate of the extension */
042        private Cell delegate;
043
044        /** The name of the extension to which the cell extension belongs */
045        private String name;
046
047        /**
048         * Creates a new cell extension.
049         * @param delegate the delegate of the extension
050         * @param name the name of the extension to which the cell extension belongs
051         */
052        public CellExtension(Cell delegate, String name) {
053                this.delegate = delegate;
054                this.name = name;
055                delegate.addCellListener(this);
056        }
057
058        /**
059         * Returns the extension's delegate.
060         * @return the extension's delegate, i.e. the cell to which it belongs
061         */
062        public final Cell getDelegate() {
063                return delegate;
064        }
065
066        /**
067         * Returns the name of the extension to which the cell extension belongs.
068         * @return the name of the extension to which the cell extension belongs
069         */
070        public final String getName() {
071                return name;
072        }
073
074        public final Spreadsheet getSpreadsheet() {
075                Spreadsheet spreadsheet = delegate.getSpreadsheet();
076                Spreadsheet extension = spreadsheet.getExtension(name);
077                if (extension != null)
078                        return extension;
079                else
080                        return spreadsheet;
081        }
082
083        public final Address getAddress() {
084                return delegate.getAddress();
085        }
086
087        public final Value getValue() {
088                return delegate.getValue();
089        }
090
091        public final String getContent() {
092                return delegate.getContent();
093        }
094
095        public final Formula getFormula() {
096                return delegate.getFormula();
097        }
098
099        public final void setContent(String content) throws FormulaCompilationException {
100                // Disallow?
101                delegate.setContent(content);
102        }
103
104        public void clear() {
105                delegate.clear();
106        }
107
108        public final SortedSet<Cell> getPrecedents() {
109                SortedSet<Cell> cellExts = new TreeSet<Cell>();
110                for (Cell cell : delegate.getPrecedents())
111                        cellExts.add(cell.getExtension(getName()));
112                return cellExts;
113        }
114
115        public final SortedSet<Cell> getDependents()  {
116                SortedSet<Cell> cellExts = new TreeSet<Cell>();
117                for (Cell cell : delegate.getDependents())
118                        cellExts.add(cell.getExtension(getName()));
119                return cellExts;
120        }
121
122        public final void copyFrom(Cell source) {
123                delegate.copyFrom(source);
124        }
125
126        public final void moveFrom(Cell source) {
127                delegate.moveFrom(source);
128        }
129
130        public final void addCellListener(CellListener listener) {
131                delegate.addCellListener(listener);
132        }
133
134        public final void removeCellListener(CellListener listener) {
135                delegate.removeCellListener(listener);
136        }
137
138        public final CellListener[] getCellListeners() {
139                return delegate.getCellListeners();
140        }
141
142        public final Cell getExtension(String name) {
143                return delegate.getExtension(name);
144        }
145
146        public final int compareTo(Cell cell) {
147                return delegate.compareTo(cell);
148        }
149
150        public final String toString() {
151                return delegate.toString();
152        }
153
154        public void valueChanged(Cell cell) {}
155
156        public void contentChanged(Cell cell) {}
157
158        public void dependentsChanged(Cell cell) {}
159
160        public void cellCleared(Cell cell) {}
161
162        public void cellCopied(Cell cell, Cell source) {}
163}