/// <summary>
/// See http://www.theswamp.org/index.php?topic=42034.msg471839#msg471839
/// </summary>
public class RefSearchFiler : Autodesk.AutoCAD.DatabaseServices.DwgFiler
{
        private ObjectId referencedId;
        private DBObject current = null;
        
        private ObjectIdCollection referencingObjectIds = new ObjectIdCollection();
        // Pass the Id of the object to find references to:
        
        public RefSearchFiler( ObjectId referencedId )
        {
                this.referencedId = referencedId;
        }
        
        // Search the parameter for references to the referencedId:
        
        public void Find( DBObject obj )
        {
                this.current = obj;
                try
                {
                        obj.DwgOut( this );
                }
                finally
                {
                        this.current = null;
                }
        }
        
        // The ObjectIds of all referencing objects:
        
        public ObjectIdCollection ReferencingObjectIds
        {
                get
                {
                        return referencingObjectIds;
                }
        }
        
        public override void WriteSoftOwnershipId( ObjectId value )
        {
                OnWriteReference( value );
        }
        
        public override void WriteSoftPointerId( ObjectId value )
        {
                OnWriteReference( value );
        }
        
        public override void WriteHardOwnershipId( ObjectId value )
        {
                OnWriteReference( value );
        }
        
        public override void WriteHardPointerId( ObjectId value )
        {
                OnWriteReference( value );
        }
        
        // In this case, we don't care about whether a reference
        // is hard/soft/owner/pointer, but we could discriminate
        // further if needed.
        
        void OnWriteReference( ObjectId value )
        {
                if( value == referencedId && this.current != null )
                {
                        referencingObjectIds.Add( this.current.ObjectId );
                        this.current = null;
                }
        }
        // ************************************************************
        
        public override void WriteVector3d(Autodesk.AutoCAD.Geometry.Vector3d value)
        {
        }
        
        public override void WriteVector2d(Autodesk.AutoCAD.Geometry.Vector2d value)
        {
        }
        
        public override void WriteUInt64(ulong value)
        {
        }
        
        public override void WriteUInt32(uint value)
        {
        }
        
        public override void WriteUInt16(ushort value)
        {
        }
        
        public override void WriteString(string value)
        {
        }
        
        public override void WriteScale3d(Autodesk.AutoCAD.Geometry.Scale3d value)
        {
        }
        
        public override void WritePoint3d(Autodesk.AutoCAD.Geometry.Point3d value)
        {
        }
        
        public override void WritePoint2d(Autodesk.AutoCAD.Geometry.Point2d value)
        {
        }
        
        public override void WriteInt64(long value)
        {
        }
        
        public override void WriteInt32(int value)
        {
        }
        
        public override void WriteInt16(short value)
        {
        }
        
        public override void WriteHandle(Autodesk.AutoCAD.DatabaseServices.Handle handle)
        {
        }
        
        public override void WriteDouble(double value)
        {
        }
        
        public override void WriteBytes(byte[] value)
        {
        }
        
        public override void WriteByte(byte value)
        {
        }
        
        public override void WriteBoolean(bool value)
        {
        }
        
        public override void WriteBinaryChunk(byte[] chunk)
        {
        }
        
        public override void WriteAddress(IntPtr value)
        {
        }
        
        public override void Seek(long offset, int method)
        {
        }
        
        public override void ResetFilerStatus()
        {
        }
        
        public override Autodesk.AutoCAD.Geometry.Vector3d ReadVector3d()
        {
                throw new NotImplementedException();
        }
        
        public override Autodesk.AutoCAD.Geometry.Vector2d ReadVector2d()
        {
                throw new NotImplementedException();
        }
        
        public override ulong ReadUInt64()
        {
                throw new NotImplementedException();
        }
        
        public override uint ReadUInt32()
        {
                throw new NotImplementedException();
        }
        
        public override ushort ReadUInt16()
        {
                throw new NotImplementedException();
        }
        
        public override string ReadString()
        {
                throw new NotImplementedException();
        }
        
        public override Autodesk.AutoCAD.DatabaseServices.ObjectId ReadSoftPointerId()
        {
                throw new NotImplementedException();
        }
        
        public override Autodesk.AutoCAD.DatabaseServices.ObjectId ReadSoftOwnershipId()
        {
                throw new NotImplementedException();
        }
        
        public override Autodesk.AutoCAD.Geometry.Scale3d ReadScale3d()
        {
                throw new NotImplementedException();
        }
        
        public override Autodesk.AutoCAD.Geometry.Point3d ReadPoint3d()
        {
                throw new NotImplementedException();
        }
        
        public override Autodesk.AutoCAD.Geometry.Point2d ReadPoint2d()
        {
                throw new NotImplementedException();
        }
        
        public override long ReadInt64()
        {
                throw new NotImplementedException();
        }
        
        public override int ReadInt32()
        {
                throw new NotImplementedException();
        }
        
        public override short ReadInt16()
        {
                throw new NotImplementedException();
        }
        
        public override Autodesk.AutoCAD.DatabaseServices.ObjectId ReadHardPointerId()
        {
                throw new NotImplementedException();
        }
        
        public override Autodesk.AutoCAD.DatabaseServices.ObjectId ReadHardOwnershipId()
        {
                throw new NotImplementedException();
        }
        
        public override Autodesk.AutoCAD.DatabaseServices.Handle ReadHandle()
        {
                throw new NotImplementedException();
        }
        
        public override double ReadDouble()
        {
                throw new NotImplementedException();
        }
        
        public override void ReadBytes(byte[] value)
        {
                throw new NotImplementedException();
        }
        
        public override byte ReadByte()
        {
                throw new NotImplementedException();
        }
        
        public override bool ReadBoolean()
        {
                throw new NotImplementedException();
        }
        
        public override byte[] ReadBinaryChunk()
        {
                throw new NotImplementedException();
        }
        
        public override IntPtr ReadAddress()
        {
                throw new NotImplementedException();
        }
        
        public override long Position {
                get {
                        throw new NotImplementedException();
                }
        }
        
        public override Autodesk.AutoCAD.DatabaseServices.FilerType FilerType {
                get {
                        return FilerType.BagFiler;
                }
        }
        
        public override Autodesk.AutoCAD.Runtime.ErrorStatus FilerStatus {
                get {
                        return new ErrorStatus();
                }
                set {
                        throw new NotImplementedException();
                }
        }
}