//
// SSCellData.java
//
/*
VisAD system for interactive analysis and visualization of numerical
data. Copyright (C) 1996 - 2017 Bill Hibbard, Curtis Rueden, Tom
Rink, Dave Glowacki, Steve Emmerson, Tom Whittaker, Don Murray, and
Tommy Jasmin.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA
*/
package visad.ss;
import java.rmi.RemoteException;
import visad.*;
import visad.formula.*;
import visad.util.*;
/**
* Class for encapsulating all needed information
* about a Data object present in a BasicSSCell.
*/
public class SSCellData {
// --- FIELDS ---
/**
* Associated spreadsheet cell for the data.
*/
BasicSSCell ssCell;
/**
* The id number the Data object.
*/
private int id;
/**
* The DataReference that points to the actual Data.
*/
private DataReferenceImpl ref;
/**
* The ConstantMaps associated with the reference.
*/
private ConstantMap[] cmaps;
/**
* Remote copy of the DataReference.
*/
private RemoteDataReferenceImpl remoteRef;
/**
* The Data object's source, in string form.
*/
private String source;
/**
* The Data object's source type.
*/
private int type;
/**
* The name of the Data object's associated spreadsheet cell.
*/
private String cellName;
/**
* The variable name of the Data object.
*/
private String varName;
/**
* Errors encountered when computing the Data object.
*/
private String[] errors;
/**
* The formula manager of the data's spreadsheet cell.
*/
private FormulaManager fm;
/**
* Whether other data depends on this data.
*/
boolean othersDepend;
/**
* VisAD Cell for monitoring local data changes.
*/
SSCellImpl cell;
// --- CONSTRUCTORS ---
/**
* Constructs a new SSCellData object, for encapsulating
* a Data object and related information.
*/
public SSCellData(int id, BasicSSCell ssCell, DataReferenceImpl ref,
ConstantMap[] cmaps, String source, int type, boolean checkErrors)
throws VisADException, RemoteException
{
this.ssCell = ssCell;
this.id = id;
this.ref = (DataReferenceImpl) ref;
this.remoteRef = new RemoteDataReferenceImpl(ref);
this.source = source;
this.type = type;
this.cellName = ssCell.getName();
this.varName = cellName + "d" + id;
this.errors = new String[0];
this.othersDepend = false;
this.fm = ssCell.getFormulaManager();
// set variable name's reference in formula manager database
fm.setReference(varName, ref);
if (this.id == 1) {
// make CELL default to CELLd1
fm.setReference(cellName, ref);
}
// detect changes to the data
this.cell = new SSCellImpl(this, ref, varName, checkErrors);
}
// --- ACCESSORS ---
/**
* Gets the ID number.
*/
public int getId() {
return id;
}
/**
* Gets the Data object.
*/
public Data getData() {
return ref.getData();
}
/**
* Gets the DataReference pointing to the data. Changes to the
* reference's data automatically propagate to all linked cells.
*/
public DataReferenceImpl getReference() {
return ref;
}
/**
* Gets the ConstantMaps associated with the reference.
*/
public ConstantMap[] getConstantMaps() {
return cmaps;
}
/**
* Gets the remote copy of the DataReference.
*/
public RemoteDataReferenceImpl getRemoteReference() {
return remoteRef;
}
/**
* Gets the source of the data, in String form.
*/
public String getSource() {
return source;
}
/**
* Gets the source type of the data.
* @return Source type. Valid types are:
* <UL>
* <LI>BasicSSCell.UNKNOWN_SOURCE
* <LI>BasicSSCell.DIRECT_SOURCE
* <LI>BasicSSCell.URL_SOURCE
* <LI>BasicSSCell.FORMULA_SOURCE
* <LI>BasicSSCell.RMI_SOURCE
* <LI>BasicSSCell.REMOTE_SOURCE
* </UL>
*/
public int getSourceType() {
return type;
}
/**
* Gets the variable name used for the data in the formula manager.
*/
public String getVariableName() {
return varName;
}
/**
* Gets the errors encountered when generating the Data object.
*/
public String[] getErrors() {
return errors;
}
/**
* Gets whether other data depends on this data.
*/
public boolean othersDepend() {
return othersDepend;
}
/**
* Returns whether this data's cell has finished initializing.
*/
public boolean isInited() {
return cell.isInited();
}
// --- MODIFIERS ---
/**
* Sets the data.
*/
public void setData(Data data) throws VisADException, RemoteException {
setData(data, true);
}
/**
* Sets the data, broadcasting data change notification if flag is set.
*/
void setData(Data data, boolean notify)
throws VisADException, RemoteException
{
DataImpl d = data.local();
if (!notify) cell.skipNextNotify();
ref.setData(d);
}
/**
* Sets a single error for the Data object.
*/
public void setError(String error) {
setErrors(new String[] {error}, true, true);
}
/**
* Sets the errors for the Data object.
*/
public void setErrors(String[] errors) {
setErrors(errors, true, true);
}
/**
* Sets the errors for the Data object, notifying
* linked cells if notify flag is set.
*/
void setErrors(String[] errors, boolean notify) {
setErrors(errors, notify, true);
}
/**
* Sets the errors for the Data object, notifying linked cells if
* notify flag is set, and updating display if update flag is set.
*/
void setErrors(String[] errors, boolean notify, boolean update) {
if (Util.arraysEqual(this.errors, errors)) return;
this.errors = errors;
if (update) ssCell.updateDisplay();
if (notify) {
try {
ssCell.sendMessage(BasicSSCell.SET_ERRORS, varName,
DataUtility.stringsToTuple(errors, BasicSSCell.DEBUG));
}
catch (RemoteException exc) {
if (BasicSSCell.DEBUG) exc.printStackTrace();
}
}
}
/**
* Sets whether others depend on this data.
*/
public void setDependencies(Real real) {
othersDepend = real.equals(SSCellImpl.TRUE);
}
/**
* Stops monitoring the data for changes.
*/
public void destroy() {
// set data's variable to null in formula manager database
try {
fm.setThing(varName, null);
if (id == 1) fm.setThing(cellName, null);
}
catch (VisADException exc) {
if (BasicSSCell.DEBUG) exc.printStackTrace();
}
catch (RemoteException exc) {
if (BasicSSCell.DEBUG) exc.printStackTrace();
}
// stop local data change monitoring
try {
cell.removeAllReferences();
}
catch (VisADException exc) {
if (BasicSSCell.DEBUG) exc.printStackTrace();
}
catch (RemoteException exc) {
if (BasicSSCell.DEBUG) exc.printStackTrace();
}
cell.stop();
cell = null;
// broadcast data change event
ssCell.notifySSCellListeners(SSCellChangeEvent.DATA_CHANGE, varName);
}
}