Esempio n. 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="argument"></param>
        public virtual void OnDeleteReversalIndex(object argument)
        {
            CheckDisposed();

            string sGuid = m_mediator.PropertyTable.GetStringProperty("ReversalIndexGuid", null);

            if (sGuid == null)
            {
                return;
            }
            Guid oldGuid;

            try
            {
                oldGuid = new Guid(sGuid);
            }
            catch
            {
                return;                 // Can't delete an index if we have a bad guid.
            }
            if (Cache == null)
            {
                return;
            }
            IReversalIndex ri = (IReversalIndex)Cache.ServiceLocator.GetObject(oldGuid);

            DeleteReversalIndex(ri);
        }
Esempio n. 2
0
 protected virtual void ReallyDeleteReversalIndex(IReversalIndex ri)
 {
     try
     {
         Debug.Assert(ri.Hvo == m_list.OwningObject.Hvo);
         m_list.ListModificationInProgress = true;                       // can't reload deleted list! (LT-5353)
         // We're about to do a MasterRefresh which clobbers the Undo stack,
         // so we might as well make this UOW not undoable
         NonUndoableUnitOfWorkHelper.Do(Cache.ActionHandlerAccessor,
                                        () =>
         {
             Cache.DomainDataByFlid.DeleteObj(ri.Hvo);
             int cobjNew;
             var idxNew = ReversalIndexAfterDeletion(Cache, out cobjNew);
             SetReversalIndexGuid(idxNew.Guid);
         });
         ChangeOwningObjectIfPossible();
     }
     finally
     {
         m_list.ListModificationInProgress = false;
     }
     // Without this, stale data can still display in the BulkEditSenses tool if you
     // recreate the deleted reversal index.
     m_mediator.SendMessage("MasterRefresh", null);
 }
        public bool OnPromoteReversalindexEntry(object cmd)
        {
            //Command command = (Command) cmd;
            Slice slice = m_dataEntryForm.CurrentSlice;

            Debug.Assert(slice != null, "No slice was current");
            if (slice != null)
            {
                FdoCache            cache = m_dataEntryForm.Cache;
                IReversalIndexEntry entry = slice.Object as IReversalIndexEntry;
                int hvoNewOwner           = cache.GetOwnerOfObject(entry.OwnerHVO);
                switch (cache.GetClassOfObject(hvoNewOwner))
                {
                default:
                    throw new ArgumentException("Illegal class.");

                case ReversalIndex.kclsidReversalIndex:
                {
                    IReversalIndex ri = ReversalIndex.CreateFromDBObject(cache, hvoNewOwner);
                    ri.EntriesOC.Add(entry);
                    break;
                }

                case ReversalIndexEntry.kclsidReversalIndexEntry:
                {
                    IReversalIndexEntry rie = ReversalIndexEntry.CreateFromDBObject(cache, hvoNewOwner);
                    rie.SubentriesOC.Add(entry);
                    break;
                }
                }
                // We may need to notify everyone that a virtual property changed.
                //NotifyVirtualChanged(cache, slice);
            }
            return(true);
        }
 internal int CountReversalIndexEntries(IReversalIndex ri)
 {
     int[] entries;
     using (ReversalIndexActivator.ActivateReversalIndex(ri.Guid, m_mediator))
         ConfiguredXHTMLGenerator.GetPublicationDecoratorAndEntries(m_mediator, out entries, ReversalType);
     return(entries.Length);
 }
Esempio n. 5
0
        public override void Init(FdoCache cache, Mediator mediator, XmlNode recordListNode)
        {
            CheckDisposed();

            // <recordList owner="ReversalIndex" property="AllEntries" assemblyPath="RBRExtensions.dll" class="RBRExtensions.AllReversalEntriesRecordList"/>
            BaseInit(cache, mediator, recordListNode);
            //string owner = XmlUtils.GetOptionalAttributeValue(recordListNode, "owner");
            IVwVirtualHandler vh = cache.VwCacheDaAccessor.GetVirtualHandlerName("ReversalIndex", "AllEntries");

            if (vh == null)
            {
                vh = new AllReversalEntriesVh(null, cache);
                cache.VwCacheDaAccessor.InstallVirtual(vh);
            }
            m_flid = vh.Tag;
            int rih = GetReversalIndexHvo(mediator);

            if (rih > 0)
            {
                IReversalIndex ri = ReversalIndex.CreateFromDBObject(cache, rih);
                m_owningObject = ri;
                m_fontName     = ri.WritingSystemRA.DefaultSerif;
            }
            m_oldLength = 0;
        }
Esempio n. 6
0
        /// <summary>
        /// Resets the sorter so that it will use the writing system of the given reversal index.
        /// </summary>
        /// <param name="ri"></param>
        private void ResetListSorter(IReversalIndex ri)
        {
            var sorter        = Sorter as GenRecordSorter;
            var writingSystem = (IWritingSystem)Cache.WritingSystemFactory.get_Engine(ri.WritingSystem);

            if (sorter != null)
            {
                var stringFinderComparer = sorter.Comparer as StringFinderCompare;
                if (stringFinderComparer != null)
                {
                    var comparer = new StringFinderCompare(stringFinderComparer.Finder, new WritingSystemComparer(writingSystem));
                    sorter.Comparer = comparer;
                }
            }
            else if (Sorter == null)
            {
                var fakevc = new XmlBrowseViewBaseVc {
                    SuppressPictures = true, Cache = Cache
                };                                                                                              // SuppressPictures to make sure that we don't leak anything as this will not be disposed.
                m_list.Sorter = new GenRecordSorter(new StringFinderCompare(LayoutFinder.CreateFinder(Cache,
                                                                                                      BrowseViewFormCol,
                                                                                                      fakevc,
                                                                                                      (IApp)m_mediator.PropertyTable.GetValue("App")),
                                                                            new WritingSystemComparer(writingSystem)));
            }
        }
Esempio n. 7
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="argument"></param>
        public virtual void OnDeleteReversalIndex(object argument)
        {
            CheckDisposed();

            string sHvo = m_mediator.PropertyTable.GetStringProperty("ReversalIndexHvo", null);

            if (sHvo == null)
            {
                return;
            }
            int hvo = Convert.ToInt32(sHvo);

            if (hvo <= 0)
            {
                return;
            }
            if (m_cache == null)
            {
                m_cache = (FdoCache)m_mediator.PropertyTable.GetValue("cache");
            }
            if (m_cache == null)
            {
                return;
            }
            IReversalIndex ri = ReversalIndex.CreateFromDBObject(m_cache, hvo);

            DeleteReversalIndex(ri);
        }
        protected IReversalIndexEntry CreateReversalIndexEntry(string riForm)
        {
            var            revIndexEntry = m_revIndexEntryFactory.Create();
            var            wsObj         = Cache.LanguageProject.DefaultAnalysisWritingSystem;
            IReversalIndex revIndex      = m_revIndexRepo.FindOrCreateIndexForWs(wsObj.Handle);

            //Add an entry to the Reveral index
            revIndex.EntriesOC.Add(revIndexEntry);
            revIndexEntry.ReversalForm.set_String(wsObj.Handle, Cache.TsStrFactory.MakeString(riForm, wsObj.Handle));
            return(revIndexEntry);
        }
        /// <summary>
        /// Any db object created here or in tests must be added to m_createdObjectList.
        /// </summary>
        protected void CreateTestData()
        {
            var rootMT = GetMorphTypeOrCreateOne("root");
            var adjPOS = GetGrammaticalCategoryOrCreateOne("adjective", Cache.LangProject.PartsOfSpeechOA);

            // le='pus' mtype='root' Sense1(gle='green' pos='adj.')
            var lexEntry = AddLexeme(m_createdObjectList, "pus", rootMT, "green", adjPOS);

            var revEntry = GetOrCreateReversalIndexEntry(m_createdObjectList);

            m_revIndex = AddReversalIndex(m_createdObjectList, revEntry);
        }
Esempio n. 10
0
        private static int GetWs(Mediator mediator, FdoCache cache, XmlNode node, string sAttr)
        {
            string wsSpec = XmlUtils.GetOptionalAttributeValue(node, sAttr);

            if (wsSpec != null)
            {
                IWritingSystemContainer wsContainer = cache.ServiceLocator.WritingSystems;
                int ws = 0;
                switch (wsSpec)
                {
                case "vernacular":
                    ws = wsContainer.DefaultVernacularWritingSystem.Handle;
                    break;

                case "analysis":
                    ws = wsContainer.DefaultAnalysisWritingSystem.Handle;
                    break;

                case "pronunciation":
                    ws = wsContainer.DefaultPronunciationWritingSystem.Handle;
                    break;

                case "reversal":
                    string sGuid = (string)mediator.PropertyTable.GetValue("ReversalIndexGuid", null);
                    if (sGuid != null)
                    {
                        try
                        {
                            Guid           riGuid = new Guid(sGuid);
                            IReversalIndex ri     = cache.ServiceLocator.GetObject(riGuid) as IReversalIndex;
                            ws = cache.ServiceLocator.WritingSystemManager.GetWsFromStr(ri.WritingSystem);
                        }
                        catch
                        {
                            throw new ApplicationException("Couldn't find current reversal index.");
                        }
                    }
                    else
                    {
                        throw new ApplicationException("Couldn't find current reversal index.");
                    }
                    break;

                default:
                    throw new ApplicationException("ws must be 'vernacular', 'analysis', 'pronunciation',  or 'reversal';" + " it said '" + wsSpec + "'.");
                }
                return(ws);
            }

            return(0);
        }
Esempio n. 11
0
 protected virtual void ReallyDeleteReversalIndex(IReversalIndex ri)
 {
     try
     {
         Debug.Assert(ri.Hvo == m_list.OwningObject.Hvo);
         m_list.ListModificationInProgress = true;                       // can't reload deleted list! (LT-5353)
         // Clear out any virtual data stored in the cache for this reversal index.
         IVwCacheDa        cda = m_cache.MainCacheAccessor as IVwCacheDa;
         IVwVirtualHandler vh  = cda.GetVirtualHandlerName("LexSense",
                                                           LexSenseReversalEntriesTextHandler.StandardFieldName);
         if (vh != null)
         {
             int wsDel = ri.WritingSystemRAHvo;
             IEnumerator <IReversalIndexEntry> erie = ri.EntriesOC.GetEnumerator();
             while (erie.MoveNext())
             {
                 foreach (LinkedObjectInfo loi in erie.Current.BackReferences)
                 {
                     if (loi.RelObjClass == (int)LexSense.kClassId)
                     {
                         vh.Load(loi.RelObjId, vh.Tag, wsDel, cda);
                     }
                 }
             }
         }
         m_cache.BeginUndoTask(LexEdStrings.ksUndoDelete, LexEdStrings.ksRedoDelete);
         int cobjOld = m_cache.LangProject.LexDbOA.ReversalIndexesOC.Count;
         ri.DeleteUnderlyingObject();
         int cobjNew;
         int hvoIdxNew = ReversalIndexAfterDeletion(m_cache, out cobjNew);
         m_cache.EndUndoTask();
         SetReversalIndexHvo(hvoIdxNew);
         // Without this, switching to the ReversalEntries tool can crash if it was
         // displaying data from the deleted reversal entry.
         m_cache.PropChanged(null, PropChangeType.kpctNotifyAll,
                             m_cache.LangProject.LexDbOAHvo,
                             (int)LexDb.LexDbTags.kflidReversalIndexes,
                             0, cobjNew, cobjOld);
     }
     finally
     {
         m_list.ListModificationInProgress = false;
     }
     // Can't do this until ListModificationInProgress flag is cleared because it
     // redisplays everything after reloading the list: if the list isn't actually
     // reloaded, it tries to display a deleted object -- CRASH!
     ChangeOwningObjectIfPossible();
     // Without this, stale data can still display in the BulkEditSenses tool if you
     // recreate the deleted reversal index.
     m_mediator.SendMessage("MasterRefresh", null);
 }
Esempio n. 12
0
        protected override FdoObjectSet <ICmObject> GetObjectSet()
        {
            IVwVirtualHandler handler = (m_cache.MainCacheAccessor as IVwCacheDa).GetVirtualHandlerId(m_flid);

            Debug.Assert(handler != null);

            IReversalIndex ri = m_owningObject as IReversalIndex;

            Debug.Assert(ri != null && ri.IsValidObject(), "The owning ReversalIndex object is invalid!?");
            // Force the handler to (re)load the property.
            handler.Load(ri.Hvo, m_flid, ri.WritingSystemRAHvo, m_cache.MainCacheAccessor as IVwCacheDa);
            int[] items = m_cache.GetVectorProperty(ri.Hvo, m_flid, true);
            return(new FdoObjectSet <ICmObject>(m_cache, items, true));
        }
Esempio n. 13
0
        protected override IEnumerable <int> GetObjectSet()
        {
            IReversalIndex ri = m_owningObject as IReversalIndex;

            Debug.Assert(ri != null && ri.IsValidObject, "The owning IReversalIndex object is invalid!?");
            // Review: is there a better to to convert from List<Subclass> to List<Class>???
            List <IReversalIndexEntry> rgrie = ri.AllEntries;
            var rgcmo = new List <int>(rgrie.Count);

            foreach (IReversalIndexEntry rie in rgrie)
            {
                rgcmo.Add(rie.Hvo);
            }
            return(rgcmo);
        }
        protected IReversalIndex AddReversalIndex(List <ICmObject> addList, IReversalIndexEntry revIndexEntry)
        {
            Assert.IsNotNull(m_revIndexFactory, "Fixture Initialization is not complete.");
            Assert.IsNotNull(m_window, "No window.");

            //create a reversal index for this project.
            var            wsObj    = Cache.LanguageProject.DefaultAnalysisWritingSystem;
            IReversalIndex revIndex = m_revIndexRepo.FindOrCreateIndexForWs(wsObj.Handle);

            //Add an entry to the Reveral index
            revIndex.EntriesOC.Add(revIndexEntry);

            addList.Add(revIndex);
            return(revIndex);
        }
Esempio n. 15
0
		public override void Init(LcmCache cache, Mediator mediator, PropertyTable propertyTable, XmlNode recordListNode)
		{
			CheckDisposed();

			// <recordList owner="IReversalIndex" property="AllEntries" assemblyPath="RBRExtensions.dll" class="RBRExtensions.AllReversalEntriesRecordList"/>
			BaseInit(cache, mediator, propertyTable, recordListNode);
			m_flid = CmPossibilityListTags.kflidPossibilities;
			Guid riGuid = AllReversalEntriesRecordList.GetReversalIndexGuid(mediator, propertyTable);
			if (riGuid != Guid.Empty)
			{
				IReversalIndex ri = cache.ServiceLocator.GetObject(riGuid) as IReversalIndex;
				m_owningObject = ri.PartsOfSpeechOA;
				m_fontName = cache.ServiceLocator.WritingSystemManager.Get(ri.WritingSystem).DefaultFontName;
			}
			m_oldLength = 0;
		}
Esempio n. 16
0
        public override void Init(FdoCache cache, Mediator mediator, XmlNode recordListNode)
        {
            CheckDisposed();

            // <recordList owner="ReversalIndex" property="AllEntries" assemblyPath="RBRExtensions.dll" class="RBRExtensions.AllReversalEntriesRecordList"/>
            BaseInit(cache, mediator, recordListNode);
            m_flid = (int)CmPossibilityList.CmPossibilityListTags.kflidPossibilities;
            int rih = AllReversalEntriesRecordList.GetReversalIndexHvo(mediator);

            if (rih > 0)
            {
                IReversalIndex ri = ReversalIndex.CreateFromDBObject(cache, rih);
                m_owningObject = ri.PartsOfSpeechOA;
                m_fontName     = ri.WritingSystemRA.DefaultSerif;
            }
            m_oldLength = 0;
        }
        public override void Init(FdoCache cache, Mediator mediator, XmlNode recordListNode)
        {
            CheckDisposed();

            // <recordList owner="IReversalIndex" property="AllEntries" assemblyPath="RBRExtensions.dll" class="RBRExtensions.AllReversalEntriesRecordList"/>
            BaseInit(cache, mediator, recordListNode);
            //string owner = XmlUtils.GetOptionalAttributeValue(recordListNode, "owner");
            m_flid = ReversalIndexTags.kflidEntries;             //LT-12577 a record list needs a real flid.
            Guid riGuid = GetReversalIndexGuid(mediator);

            if (riGuid != Guid.Empty)
            {
                IReversalIndex ri = cache.ServiceLocator.GetObject(riGuid) as IReversalIndex;
                m_owningObject = ri;
                m_fontName     = cache.ServiceLocator.WritingSystemManager.Get(ri.WritingSystem).DefaultFontName;
            }
            m_oldLength = 0;
        }
Esempio n. 18
0
        /// <summary>
        /// Look for a simple writing system spec as part of a node...currently either 'analysis' or 'vernacular'.
        /// If not found, answer 0.
        /// If found, answer the ID of the appropriate writing system, or throw exception if not valid.
        /// </summary>
        /// <param name="cache"></param>
        /// <param name="node"></param>
        /// <returns></returns>
        static int GetWs(Mediator mediator, FdoCache cache, XmlNode node)
        {
            string wsSpec = XmlUtils.GetOptionalAttributeValue(node, "ws");

            if (wsSpec != null)
            {
                int ws = 0;
                switch (wsSpec)
                {
                case "vernacular":
                    ws = cache.LangProject.DefaultVernacularWritingSystem;
                    break;

                case "analysis":
                    ws = cache.LangProject.DefaultAnalysisWritingSystem;
                    break;

                case "pronunciation":
                    ws = cache.LangProject.DefaultPronunciationWritingSystem;
                    break;

                case "reversal":
                    int rih = int.Parse((string)mediator.PropertyTable.GetValue("ReversalIndexHvo"));
                    if (rih > 0)
                    {
                        IReversalIndex ri = ReversalIndex.CreateFromDBObject(cache, rih);
                        ws = ri.WritingSystemRAHvo;
                    }
                    else
                    {
                        throw new ApplicationException("Couldn't find current reversal index.");
                    }
                    break;

                default:
                    throw new ApplicationException("ws must be 'vernacular', 'analysis', 'pronunciation',  or 'reversal';" + " it said '" + wsSpec + "'.");
                }
                return(ws);
            }
            else
            {
                return(0);
            }
        }
Esempio n. 19
0
        private void CreateReversalIndexDlg_FormClosing(object sender, FormClosingEventArgs e)
        {
            switch (DialogResult)
            {
            default:
            {
                Debug.Assert(false, "Unexpected DialogResult.");
                break;
            }

            case DialogResult.Cancel:
            {
                if (!m_btnCancel.Visible)
                {
                    e.Cancel = true;
                    MessageBox.Show(LexEdStrings.ksMustSelectOne);
                }
                break;
            }

            case DialogResult.OK:
            {
                NamedWritingSystem nws = m_cbWritingSystems.SelectedItem as NamedWritingSystem;
                if (nws != null)
                {
                    ILgWritingSystem lgws   = LgWritingSystem.CreateFromDBObject(m_cache, nws.Hvo);
                    IReversalIndex   newIdx = m_cache.LangProject.LexDbOA.ReversalIndexesOC.Add(new ReversalIndex());
                    newIdx.WritingSystemRA = lgws;
                    // Copy any and all alternatives from lgws.Name to newIdx.Name
                    // LT-4907 dies here.
                    foreach (ILgWritingSystem lgwsLoop in m_cache.LanguageEncodings)
                    {
                        string lgsNameAlt = lgws.Name.GetAlternative(lgwsLoop.Hvo);
                        if (lgsNameAlt != null && lgsNameAlt.Length > 0)
                        {
                            newIdx.Name.SetAlternative(lgsNameAlt, lgws.Hvo);
                        }
                    }
                    m_hvoRevIdx = newIdx.Hvo;
                }
                break;
            }
            }
        }
Esempio n. 20
0
 private void ChangeOwningObject(int id)
 {
     if (id > 0)
     {
         if (m_cache == null)
         {
             m_cache = (FdoCache)m_mediator.PropertyTable.GetValue("cache");
         }
         IReversalIndex ri           = ReversalIndex.CreateFromDBObject(m_cache, id);
         ICmObject      newOwningObj = NewOwningObject(ri);
         if (newOwningObj != OwningObject)
         {
             OwningObject = newOwningObj;
             m_mediator.PropertyTable.SetProperty("ActiveClerkOwningObject", newOwningObj, false);
             m_mediator.PropertyTable.SetPropertyPersistence("ActiveClerkOwningObject", false);
             m_mediator.SendMessage("ClerkOwningObjChanged", this);
         }
     }
 }
Esempio n. 21
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="argument"></param>
        public virtual void OnDeleteReversalIndex(object argument)
        {
            CheckDisposed();

            var oldGuid = ReversalIndexEntryUi.GetObjectGuidIfValid(m_propertyTable, "ReversalIndexGuid");

            if (oldGuid.Equals(Guid.Empty))
            {
                return;
            }

            if (Cache == null)
            {
                return;
            }
            IReversalIndex ri = (IReversalIndex)Cache.ServiceLocator.GetObject(oldGuid);

            DeleteReversalIndex(ri);
        }
Esempio n. 22
0
        private void CreateReversalIndexDlg_FormClosing(object sender, FormClosingEventArgs e)
        {
            switch (DialogResult)
            {
            default:
            {
                Debug.Assert(false, "Unexpected DialogResult.");
                break;
            }

            case DialogResult.Cancel:
            {
                if (!m_btnCancel.Visible)
                {
                    e.Cancel = true;
                    MessageBox.Show(LexEdStrings.ksMustSelectOne);
                }
                break;
            }

            case DialogResult.OK:
            {
                var wsObj = m_cbWritingSystems.SelectedItem as IWritingSystem;
                if (wsObj != null)
                {
                    UndoableUnitOfWorkHelper.Do(LexEdStrings.ksUndoCreateReversalIndex, LexEdStrings.ksRedoCreateReversalIndex,
                                                m_cache.ActionHandlerAccessor,
                                                () =>
                        {
                            IReversalIndex newIdx = m_cache.ServiceLocator.GetInstance <IReversalIndexFactory>().Create();
                            m_cache.LanguageProject.LexDbOA.ReversalIndexesOC.Add(newIdx);
                            newIdx.WritingSystem = wsObj.Id;
                            // TODO WS: should we use the DisplayLabel here?
                            newIdx.Name.SetAnalysisDefaultWritingSystem(wsObj.DisplayLabel);
                            newIdx.PartsOfSpeechOA = m_cache.ServiceLocator.GetInstance <ICmPossibilityListFactory>().Create();
                            m_hvoRevIdx            = newIdx.Hvo;
                        });
                }
                break;
            }
            }
        }
Esempio n. 23
0
        public void DeleteReversalIndex(IReversalIndex ri)
        {
            CheckDisposed();

            Form mainWindow = (Form)m_mediator.PropertyTable.GetValue("window");

            mainWindow.Cursor = Cursors.WaitCursor;
            using (ConfirmDeleteObjectDlg dlg = new ConfirmDeleteObjectDlg())
            {
                SIL.FieldWorks.FdoUi.CmObjectUi ui = new SIL.FieldWorks.FdoUi.CmObjectUi(ri);
                dlg.SetDlgInfo(ui, m_cache, m_mediator);
                dlg.TopMessage     = LexEdStrings.ksDeletingThisRevIndex;
                dlg.BottomQuestion = LexEdStrings.ksReallyWantToDeleteRevIndex;
                if (DialogResult.Yes == dlg.ShowDialog(mainWindow))
                {
                    ReallyDeleteReversalIndex(ri);
                }
            }
            mainWindow.Cursor = Cursors.Default;
        }
Esempio n. 24
0
        public void DeleteReversalIndex(IReversalIndex ri)
        {
            CheckDisposed();

            var mainWindow = (Form)m_mediator.PropertyTable.GetValue("window");

            using (new WaitCursor(mainWindow))
            {
                using (var dlg = new ConfirmDeleteObjectDlg(m_mediator.HelpTopicProvider))
                {
                    var ui = new CmObjectUi(ri);
                    dlg.SetDlgInfo(ui, Cache, m_mediator);
                    dlg.TopMessage     = LexEdStrings.ksDeletingThisRevIndex;
                    dlg.BottomQuestion = LexEdStrings.ksReallyWantToDeleteRevIndex;
                    if (DialogResult.Yes == dlg.ShowDialog(mainWindow))
                    {
                        ReallyDeleteReversalIndex(ri);
                    }
                }
            }
        }
Esempio n. 25
0
        public override void PropChanged(int hvo, int tag, int ivMin, int cvIns, int cvDel)
        {
            CheckDisposed();

            if (hvo == m_cache.LangProject.LexDbOAHvo &&
                tag == (int)LexDb.LexDbTags.kflidReversalIndexes &&
                cvDel > 0)
            {
                // Our owning object may have been deleted.
                int rih = int.Parse((string)m_mediator.PropertyTable.GetValue("ReversalIndexHvo"));
                if (rih > 0 && !m_cache.IsValidObject(rih))
                {
                    if (m_owningObject != null && m_owningObject.Hvo != rih && m_owningObject.IsValidObject())
                    {
                        rih = m_owningObject.Hvo;
                    }
                    else
                    {
                        int cobjNew;
                        rih = ReversalClerk.ReversalIndexAfterDeletion(m_cache, out cobjNew);
                    }
                    m_mediator.PropertyTable.SetProperty("ReversalIndexHvo", rih.ToString());
                }
                if (rih > 0 && (m_owningObject == null || m_owningObject.Hvo != rih))
                {
                    IReversalIndex ri = ReversalIndex.CreateFromDBObject(m_cache, rih);
                    m_owningObject = ri;
                    m_fontName     = ri.WritingSystemRA.DefaultSerif;
                }
                else
                {
                    return;                             // We're still okay without any changes.
                }
            }
            else if (m_owningObject != null && m_owningObject.Hvo != hvo)
            {
                return;                         // This PropChanged doesn't apply to us.
            }
            ReloadListIfPossible();
        }
Esempio n. 26
0
        public override void Init(LcmCache cache, Mediator mediator, PropertyTable propertyTable, XmlNode recordListNode)
        {
            CheckDisposed();

            // <recordList owner="IReversalIndex" property="AllEntries" assemblyPath="RBRExtensions.dll" class="RBRExtensions.AllReversalEntriesRecordList"/>
            BaseInit(cache, mediator, propertyTable, recordListNode);
            //string owner = XmlUtils.GetOptionalAttributeValue(recordListNode, "owner");
            m_flid = ReversalIndexTags.kflidEntries;             //LT-12577 a record list needs a real flid.
            //LT-14722 Crash when clicking Reversal Indexes
            //Clerk is null when going to Reversal Indexes for the first time.
            if (Clerk != null)
            {
                Guid riGuid = GetReversalIndexGuid(mediator, propertyTable);
                if (riGuid != Guid.Empty)
                {
                    IReversalIndex ri = cache.ServiceLocator.GetObject(riGuid) as IReversalIndex;
                    m_owningObject = ri;
                    m_fontName     = cache.ServiceLocator.WritingSystemManager.Get(ri.WritingSystem).DefaultFontName;
                }
            }
            m_oldLength = 0;
        }
        public bool OnPromoteReversalindexEntry(object cmd)
        {
            //Command command = (Command) cmd;
            Slice slice = m_dataEntryForm.CurrentSlice;

            Debug.Assert(slice != null, "No slice was current");
            if (slice != null)
            {
                FdoCache            cache    = m_dataEntryForm.Cache;
                IReversalIndexEntry entry    = slice.Object as IReversalIndexEntry;
                ICmObject           newOwner = entry.Owner.Owner;
                UndoableUnitOfWorkHelper.Do(((Command)cmd).UndoText, ((Command)cmd).RedoText, newOwner,
                                            () =>
                {
                    switch (newOwner.ClassID)
                    {
                    default:
                        throw new ArgumentException("Illegal class.");

                    case ReversalIndexTags.kClassId:
                        {
                            IReversalIndex ri = (IReversalIndex)newOwner;
                            ri.EntriesOC.Add(entry);
                            break;
                        }

                    case ReversalIndexEntryTags.kClassId:
                        {
                            IReversalIndexEntry rie = (IReversalIndexEntry)newOwner;
                            rie.SubentriesOS.Add(entry);
                            break;
                        }
                    }
                });
                // We may need to notify everyone that a virtual property changed.
                //NotifyVirtualChanged(cache, slice);
            }
            return(true);
        }
Esempio n. 28
0
        public void DummyReversalCreatedOnFocusLost()
        {
            NonUndoableUnitOfWorkHelper.Do(Cache.ActionHandlerAccessor, () =>
            {
                m_lexEntry      = Cache.ServiceLocator.GetInstance <ILexEntryFactory>().Create();
                ILexSense sense = Cache.ServiceLocator.GetInstance <ILexSenseFactory>().Create();
                m_lexEntry.SensesOS.Add(sense);
            });
            int engWsId = Cache.DefaultAnalWs;

            m_reversalSlice       = new DummyReversalIndexEntrySlice(m_lexEntry.SensesOS[0]);
            m_reversalSlice.Cache = Cache;

            // Creating the reversal index before the slice is fully initialized ensures the reversal index gets loaded into the dummy cache
            IReversalIndex ri = m_revIndexRepo.FindOrCreateIndexForWs(engWsId);

            m_reversalSlice.FinishInit();
            DummyReversalIndexEntrySliceView reversalView = m_reversalSlice.DummyControl;
            int indexFirstEntry = 0;

            reversalView.CacheNewDummyEntry(ri.Hvo, engWsId);             // Create an additional dummy reversal entry before we edit one
            reversalView.EditRevIndexEntryInCache(ri.Hvo, indexFirstEntry, engWsId, TsStringUtils.MakeString("first", engWsId));

            // The dummy cache will have two dummy reversal index entries, but non exists in the real data yet.
            // The reversal index entry control must maintain a dummy entry at the end to allow a place to click to add new entries.
            Assert.AreEqual(0, m_revIndexEntryRepo.Count);
            Assert.AreEqual(2, reversalView.GetIndexSize(ri.Hvo));             // The second dummy entry will remain a dummy
            reversalView.KillFocus(new Control());
            Assert.AreEqual(1, m_revIndexEntryRepo.Count);
            Assert.AreEqual(2, reversalView.GetIndexSize(ri.Hvo));
            IReversalIndexEntry rie = m_revIndexEntryRepo.AllInstances().First();

            Assert.AreEqual("first", rie.ShortName);
            Assert.AreEqual(1, m_lexEntry.SensesOS[0].ReferringReversalIndexEntries.Count());
            Assert.True(m_lexEntry.SensesOS[0].ReferringReversalIndexEntries.Contains(rie));
        }
Esempio n. 29
0
        internal static int ReversalIndexAfterDeletion(FdoCache cache, out int cobjNew)
        {
            int hvoIdxNew = 0;

            cobjNew = cache.LangProject.LexDbOA.ReversalIndexesOC.Count;
            if (cobjNew == 0)
            {
                // Big trouble ensues if we don't have any reversal indexes at all, so ...
                // Create a reversal index for the current default analysis writing system.
                IReversalIndex   newIdx     = cache.LangProject.LexDbOA.ReversalIndexesOC.Add(new ReversalIndex());
                ILgWritingSystem wsAnalysis = cache.LangProject.CurAnalysisWssRS[0];
                newIdx.WritingSystemRA = wsAnalysis;
                newIdx.Name.AnalysisDefaultWritingSystem = wsAnalysis.Name.AnalysisDefaultWritingSystem;
                hvoIdxNew = newIdx.Hvo;
                cobjNew   = 1;
            }
            else
            {
                // Regardless, we need to change the reversal index hvo since the old one just
                // disappeared.
                hvoIdxNew = cache.LangProject.LexDbOA.ReversalIndexesOC.HvoArray[0];
            }
            return(hvoIdxNew);
        }
Esempio n. 30
0
		public void DeleteReversalIndex(IReversalIndex ri)
		{
			CheckDisposed();

			var mainWindow = (Form)m_mediator.PropertyTable.GetValue("window");
			using (new WaitCursor(mainWindow))
			{
				using (var dlg = new ConfirmDeleteObjectDlg(m_mediator.HelpTopicProvider))
				{
					var ui = new CmObjectUi(ri);
					dlg.SetDlgInfo(ui, Cache, m_mediator);
					dlg.TopMessage = LexEdStrings.ksDeletingThisRevIndex;
					dlg.BottomQuestion = LexEdStrings.ksReallyWantToDeleteRevIndex;
					if (DialogResult.Yes == dlg.ShowDialog(mainWindow))
						ReallyDeleteReversalIndex(ri);
				}
			}
		}
Esempio n. 31
0
		protected virtual void ReallyDeleteReversalIndex(IReversalIndex ri)
		{
			try
			{
				Debug.Assert(ri.Hvo == m_list.OwningObject.Hvo);
				m_list.ListModificationInProgress = true;	// can't reload deleted list! (LT-5353)
				// We're about to do a MasterRefresh which clobbers the Undo stack,
				// so we might as well make this UOW not undoable
				NonUndoableUnitOfWorkHelper.Do(Cache.ActionHandlerAccessor,
					() =>
					{
						Cache.DomainDataByFlid.DeleteObj(ri.Hvo);
						int cobjNew;
						var idxNew = ReversalIndexAfterDeletion(Cache, out cobjNew);
						SetReversalIndexGuid(idxNew.Guid);
					});
				ChangeOwningObjectIfPossible();
			}
			finally
			{
				m_list.ListModificationInProgress = false;
			}
			// Without this, stale data can still display in the BulkEditSenses tool if you
			// recreate the deleted reversal index.
			m_mediator.SendMessage("MasterRefresh", null);
		}
Esempio n. 32
0
		abstract protected ICmObject NewOwningObject(IReversalIndex ri);
Esempio n. 33
0
		public void DeleteReversalIndex(IReversalIndex ri)
		{
			CheckDisposed();

			Form mainWindow = (Form)m_mediator.PropertyTable.GetValue("window");
			mainWindow.Cursor = Cursors.WaitCursor;
			using (ConfirmDeleteObjectDlg dlg = new ConfirmDeleteObjectDlg())
			{
				SIL.FieldWorks.FdoUi.CmObjectUi ui = new SIL.FieldWorks.FdoUi.CmObjectUi(ri);
				dlg.SetDlgInfo(ui, m_cache, m_mediator);
				dlg.TopMessage = LexEdStrings.ksDeletingThisRevIndex;
				dlg.BottomQuestion = LexEdStrings.ksReallyWantToDeleteRevIndex;
				if (DialogResult.Yes == dlg.ShowDialog(mainWindow))
					ReallyDeleteReversalIndex(ri);
			}
			mainWindow.Cursor = Cursors.Default;
		}
Esempio n. 34
0
 protected override ICmObject NewOwningObject(IReversalIndex ri)
 {
     return(ri);
 }
		public ReversalEntryGoSearchEngine(FdoCache cache, IReversalIndex reversalIndex)
			: base(cache, SearchType.Prefix)
		{
			m_reversalIndex = reversalIndex;
			m_revEntryRepository = Cache.ServiceLocator.GetInstance<IReversalIndexEntryRepository>();
		}
		private IReversalIndexEntry MakeReversalIndexReference(ILexSense sense, string gloss, IReversalIndex ri)
		{
			var rie = Cache.ServiceLocator.GetInstance<IReversalIndexEntryFactory>().Create();
			ri.EntriesOC.Add(rie);
			rie.ReversalForm.AnalysisDefaultWritingSystem = Cache.TsStrFactory.MakeString(gloss,
				Cache.DefaultAnalWs);
			sense.ReversalEntriesRC.Add(rie);
			return rie;
		}
Esempio n. 37
0
		protected override ICmObject NewOwningObject(IReversalIndex ri)
		{
			return ri.PartsOfSpeechOA;
		}
Esempio n. 38
0
		protected override ICmObject NewOwningObject(IReversalIndex ri)
		{
			return ri;
		}
Esempio n. 39
0
		protected virtual void ReallyDeleteReversalIndex(IReversalIndex ri)
		{
			try
			{
				Debug.Assert(ri.Hvo == m_list.OwningObject.Hvo);
				m_list.ListModificationInProgress = true;	// can't reload deleted list! (LT-5353)
				// Clear out any virtual data stored in the cache for this reversal index.
				IVwCacheDa cda = m_cache.MainCacheAccessor as IVwCacheDa;
				IVwVirtualHandler vh = cda.GetVirtualHandlerName("LexSense",
					LexSenseReversalEntriesTextHandler.StandardFieldName);
				if (vh != null)
				{
					int wsDel = ri.WritingSystemRAHvo;
					IEnumerator<IReversalIndexEntry> erie = ri.EntriesOC.GetEnumerator();
					while (erie.MoveNext())
					{
						foreach (LinkedObjectInfo loi in erie.Current.BackReferences)
						{
							if (loi.RelObjClass == (int)LexSense.kClassId)
								vh.Load(loi.RelObjId, vh.Tag, wsDel, cda);
						}
					}
				}
				m_cache.BeginUndoTask(LexEdStrings.ksUndoDelete, LexEdStrings.ksRedoDelete);
				int cobjOld = m_cache.LangProject.LexDbOA.ReversalIndexesOC.Count;
				ri.DeleteUnderlyingObject();
				int cobjNew;
				int hvoIdxNew = ReversalIndexAfterDeletion(m_cache, out cobjNew);
				m_cache.EndUndoTask();
				SetReversalIndexHvo(hvoIdxNew);
				// Without this, switching to the ReversalEntries tool can crash if it was
				// displaying data from the deleted reversal entry.
				m_cache.PropChanged(null, PropChangeType.kpctNotifyAll,
					m_cache.LangProject.LexDbOAHvo,
					(int)LexDb.LexDbTags.kflidReversalIndexes,
					0, cobjNew, cobjOld);
			}
			finally
			{
				m_list.ListModificationInProgress = false;
			}
			// Can't do this until ListModificationInProgress flag is cleared because it
			// redisplays everything after reloading the list: if the list isn't actually
			// reloaded, it tries to display a deleted object -- CRASH!
			ChangeOwningObjectIfPossible();
			// Without this, stale data can still display in the BulkEditSenses tool if you
			// recreate the deleted reversal index.
			m_mediator.SendMessage("MasterRefresh", null);
		}
		/// <summary>
		/// Any db object created here or in tests must be added to m_createdObjectList.
		/// </summary>
		protected void CreateTestData()
		{
			var rootMT = GetMorphTypeOrCreateOne("root");
			var adjPOS = GetGrammaticalCategoryOrCreateOne("adjective", Cache.LangProject.PartsOfSpeechOA);

			// le='pus' mtype='root' Sense1(gle='green' pos='adj.')
			var lexEntry = AddLexeme(m_createdObjectList, "pus", rootMT, "green", adjPOS);

			var revEntry = GetOrCreateReversalIndexEntry(m_createdObjectList);

			m_revIndex = AddReversalIndex(m_createdObjectList, revEntry);
		}
			/// <summary>
			/// Find the reversal index entry given by rgsForms, or if it doesn't exist, create
			/// it.  In either case, return its hvo.
			/// </summary>
			public static int FindOrCreateReversalEntry(IReversalIndex revIndex, List<string> rgsForms,
				FdoCache cache)
			{
				List<List<IReversalIndexEntry>> rgrieMatching = new List<List<IReversalIndexEntry>>(rgsForms.Count);
				// This could be SLOOOOOOOOOOW!  But I don't see a better way of doing it...
				for (int i = 0; i < rgsForms.Count; ++i)
					rgrieMatching.Add(new List<IReversalIndexEntry>());
				int wsIndex = cache.ServiceLocator.WritingSystemManager.GetWsFromStr(revIndex.WritingSystem);
				foreach (IReversalIndexEntry rie in revIndex.AllEntries)
				{
					string form = rie.ReversalForm.get_String(wsIndex).Text;
					int idx = rgsForms.IndexOf(form);
					if (idx >= 0)
						rgrieMatching[idx].Add(rie);
				}
				List<int> rghvoOwners = new List<int>(rgsForms.Count);
				rghvoOwners.Add(revIndex.Hvo);
				// The next two variables record the best partial match, if any.
				int maxLevel = 0;
				int maxOwner = revIndex.Hvo;
				int hvo = FindMatchingReversalEntry(rgsForms, rghvoOwners, rgrieMatching,
					0, ref maxLevel, ref maxOwner);
				if (hvo == 0)
				{
					cache.DomainDataByFlid.BeginUndoTask(LexEdStrings.ksCreateReversal,
						LexEdStrings.ksRecreateReversal);
					// Create whatever we need to since we didn't find a full match.
					ICmObject owner =
						cache.ServiceLocator.GetInstance<ICmObjectRepository>().GetObject(maxOwner);
					Debug.Assert(maxLevel < rgsForms.Count);
					IReversalIndexEntryFactory fact = cache.ServiceLocator.GetInstance<IReversalIndexEntryFactory>();
					for (int i = maxLevel; i < rgsForms.Count; ++i)
					{
						IReversalIndexEntry rie = fact.Create();
						if (owner is IReversalIndex)
						{
							(owner as IReversalIndex).EntriesOC.Add(rie);
						}
						else
						{
							Debug.Assert(owner is IReversalIndexEntry);
							(owner as IReversalIndexEntry).SubentriesOS.Add(rie);
						}
						rie.ReversalForm.set_String(wsIndex, rgsForms[i]);
						owner = rie;
						hvo = rie.Hvo;
					}
					Debug.Assert(hvo != 0);
					cache.DomainDataByFlid.EndUndoTask();
				}
				return hvo;
			}
Esempio n. 42
0
			public ReversalEntrySearchEngine(FdoCache cache, IReversalIndex revIndex) : base(cache, revIndex) {}