예제 #1
0
        // Event handlers
        void m_afterObjectAdded_Fire(int eventFlag, MmEventTime time, object pSource, ref object pExtra)
        {
            if (received)
            {
                return;
            }

            if (copypast) // Skip all add-events in a paste scope
            {
                return;
            }
            else
            {
                if (paste)
                {
                    MMBase.SendMessage("paste", m_document);
                    copypast = true; // resets in the m_afterObjectChanged_Fire via SendMessage()
                    return;
                }
            }

            string _what = "", _extra = "";

            objectAdded = true;

            foreach (MMBase _parent in DocumentStorage.m_parent)
            {
                _parent.onAfterObjectAddedBase(new MMEventArgs(pSource, _what, _extra, this));
            }
        }
예제 #2
0
 public static void Unsubscribe(MMBase aParent)
 {
     if (!m_parent.Contains(aParent))
     {
         return;
     }
     m_parent.Remove(aParent);
 }
예제 #3
0
 public static void Subscribe(MMBase aParent)
 {
     if (m_parent.Contains(aParent))
     {
         return;
     }
     m_parent.Add(aParent);
 }
예제 #4
0
        void m_afterObjectChanged_Fire(int eventFlag, MmEventTime time, object pSource, ref object pExtra)
        {
            if (received)
            {
                return;
            }

            if (extracase == "deleteimage")
            {
                extracase = "";  // отбиваем таймер удаления картинки
            }

            // TODO при добавлении связи может быть _what "AutoRoute"! И выходит исключение

            string _what = "", _extra = "";

            if (pExtra is Array)
            {
                Array _pExtraAsArray = pExtra as Array;
                if (_pExtraAsArray.GetLength(0) > 0 && eventFlag == DocumentStorage.EventObjectModified)
                {
                    _what = _pExtraAsArray.GetValue(0).ToString().ToLower();
                }
                if (_pExtraAsArray.GetLength(0) > 1)
                {
                    _extra = _pExtraAsArray.GetValue(1).ToString();
                }
            }

            // TODO если выбран не топик, не граница и не связь, то выбран фоновой объект!
            if (_what == "collapsed" || _what == "selection")
            {
                return;
            }

            //if (paste && _what == "oneimage")
            //{
            //    extraTopic = null;
            //    return;
            //}

            if (objectAdded)
            {
                if (_what != "offset") // все оффсетные события нахер
                {
                    objectAdded = false;
                }
                return;
            }

            string sMessage = MMBase.SynergyMessage(m_document);

            //// Message sent from m_beforeObjectChanged_Fire when image deleted
            //if (sMessage == "deleteimage" && _what != "oneimage")
            //{
            //    MMBase.SendMessage("", m_document);
            //    _what = "oneimage";
            //    pSource = extraTopic;
            //}

            //extraTopic = null;

            if (paste && sMessage != "paste") // отбиваем все пасты, которые не от копипаста или драгдропа ТОПИКОВ
            {
                paste = false;
            }
            if (paste && _what == "offset")
            {
                return;
            }
            //if (paste && !_topic.IsCentralTopic) // учитываем только paste, который пришел от message
            //    return;

            if (_extra == SUtils.SYNERGYNAMESPACE) // отбиваются synergy-изменения в атрибутах объекта
            {
                return;
            }

            Topic _topic = pSource as Topic;

            if (_what == "custom" && _topic != null)                          // TODO (addins only?) addins: Synergy, Numbering, Rollup(Gantt)
            {
                if (_topic.IsCentralTopic && _extra == SUtils.SYNERGYMESSAGE) //SendMessage went off
                {
                    if (sMessage == "paste")                                  // SendMessage was emited from m_afterObjectAdded_Fire at starting paste copied objects
                    {                                                         // so, paste events now is ended, we can process pasted objects
                        foreach (MMBase _parent in DocumentStorage.m_parent)
                        {
                            _parent.onAfterPasteBase(new MMEventArgs(pSource, _what, _extra, this));
                        }
                        paste    = false;
                        copypast = false;
                    }
                    //else if (sMessage == "received") // SendMessage was emited from ReceiveChanges
                    //    received = false; // прием закончен

                    m_document.CentralTopic.get_Attributes(SUtils.SYNERGYMESSAGE).DeleteAll();

                    _topic = null;
                    return;
                }

                if (_extra == SUtils.SYNERGYNAMESPACE && rollup) // all subtopics already skipped, rollup operation finished
                {
                    rollup = false;
                    _topic = null;
                    return;
                }
            }

            if (rollup) // skip all rollup subtopics, change only parent
            {
                _topic = null;
                return;
            }

            if (_what == "task") // TODO впадает в цикл, если изменять Duration, Effort и ресурсы через панель Task Info
            {
                if (Changes.SaveChanges._topicxml == MMUtils.getCleanTopicXML(_topic.Xml))
                {
                    _topic = null; return;
                }
            }

            if (_topic != null)
            {
                // TODO надо как-то уловить последний оффсет для них и процессировать
                if ((_topic.IsFloatingTopic || _topic.IsCalloutTopic) && _what == "offset")
                {
                    _topic = null; return; // number of offsets = number of floating topics in the map
                }

                if (_what == "task" && _extra == "")
                {   // если при запуске карты выбран топик с задачей, то почему-то сразу срабатывает событие на task
                    _topic = null; return;
                }

                //if (_what == "task" && _topic.Task.IsEmpty)
                //    return; // при запуске карты может быть такое, если выбрано несколько топиков, один из который задача

                if (_extra == SUtils.numberinguri)
                {
                    _what = "numbering";
                }

                _extra = Changes.PortraitGet.TopicPortrait(_topic, ref _what, _extra, mc_MapFolderPath);
                //System.Windows.Forms.Clipboard.SetText(_extra);

                if (_extra == SUtils.rollupuri)
                {
                    System.Windows.Forms.MessageBox.Show("'Комбинировать информацию о задании' пока не поддерживается, другие пользователи не получат это изменение",
                                                         MMUtils.GetString("maps.synergywarning.caption"));
                    return;
                }

                if (_extra == "queue")
                {
                    System.Windows.Forms.MessageBox.Show("Произведенное изменение пока не поддерживается в Synergy, другие пользователи не получат это изменение",
                                                         MMUtils.GetString("maps.synergywarning.caption"));
                    return;
                }
            }

            foreach (MMBase _parent in DocumentStorage.m_parent)
            {
                _parent.onAfterObjectChangedBase(new MMEventArgs(pSource, _what, _extra, this));
            }
        }