/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Mozilla Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * The Original Code is the Grendel mail/news client.
 *
 * The Initial Developer of the Original Code is Netscape Communications
 * Corporation.  Portions created by Netscape are
 * Copyright (C) 1997 Netscape Communications Corporation. All
 * Rights Reserved.
 *
 * Contributor(s): 
 *
 * Created: Mauro Botelho <mabotelh@email.com>, 20 Mar 1999.
 */

package grendel.storage.mdb;

/*| nsIMdbCell: the text in a single column of a row.  The base nsIMdbBlob
**| class provides all the interface related to accessing cell text.
**|
**|| column: each cell in a row appears in a specific column, where this
**| column is identified by the an integer mdb_scope value (generated by
**| the StringToScopeToken() method in the containing nsIMdbPort instance).
**| Because a row cannot have more than one cell with the same column,
**| something must give if one calls SetColumn() with an existing column
**| in the same row. When this happens, the other cell is replaced with
**| this cell (and the old cell is closed if it has outstanding refs).
**|
**|| row: every cell instance is a part of some row, and every cell knows
**| which row is the parent row.  (Note this should be represented by a
**| weak backpointer, so that outstanding cell references cannot keep a
**| row open that should be closed. Otherwise we'd have ref graph cycles.)
**|
**|| text: a cell can either be text, or it can have a child row or table,
**| but not both at once.  If text is read from a cell with a child, the text
**| content should be empty (for AliasYarn()) or a description of the type
**| of child (perhaps "mdb:cell:child:row" or "mdb:cell:child:table").
**|
**|| child: a cell might reference another row or a table, rather than text.
**| The interface for putting and getting children rows and tables was first
**| defined in the nsIMdbTable interface, but then this was moved to this cell
**| interface as more natural. 
|*/
interface nsIMdbCell extends nsIMdbBlob { // text attribute in row with column scope
  
  // { ===== begin nsIMdbCell methods =====
  
  // { ----- begin attribute methods -----
  public void SetColumn(nsIMdbEnv ev, int inColumn); 
  public int GetColumn(nsIMdbEnv ev);
  public int GetBlobFill(nsIMdbEnv ev);
  public mdbOid GetChildOid(nsIMdbEnv ev);
  public boolean IsRowChild(nsIMdbEnv ev);
  
  /*
    public mdb_err GetCellInfo(  // all cell metainfo except actual content
    nsIMdbEnv* ev, 
    mdb_column* outColumn,           // the column in the containing row
    mdb_fill*   outBlobFill,         // the size of text content in bytes
    mdbOid*     outChildOid,         // oid of possible row or table child
    mdb_bool*   outIsRowChild) = 0;  // nonzero if child, and a row child
  */
  
  // Checking all cell metainfo is a good way to avoid forcing a large cell
  // in to memory when you don't actually want to use the content.
  
  public nsIMdbRow GetRow(nsIMdbEnv ev); // parent row for this cell
  public nsIMdbPort GetPort(nsIMdbEnv ev); // port containing cell
  // } ----- end attribute methods -----
  
  // { ----- begin children methods -----
  public mdbOid HasAnyChild( // does cell have a child instead of text?
                            nsIMdbEnv ev);
  // out id of row or table (or unbound if no child)
  // nonzero if child is a row (rather than a table)
  public boolean IsChildRow(nsIMdbEnv ev);
  
  public nsIMdbRow GetChildRow( // access table of specific attribute
                               nsIMdbEnv ev); // context
  
  public nsIMdbTable GetChildTable( // access table of specific attribute
                                   nsIMdbEnv ev); // context
  
  
  public void SetChildRow( // access table of specific attribute
                          nsIMdbEnv ev, // context
                          nsIMdbRow ioRow); // inRow must be bound inside this same db port
  
  
  public void SetChildTable( // access table of specific attribute
                            nsIMdbEnv ev, // context
                            nsIMdbTable inTable); // table must be bound inside this same db port
  
  // acquire child table (or nil if no child)
  // } ----- end children methods -----
  
  // } ===== end nsIMdbCell methods =====
};

