public RNavigatorButton(int depth, NAV_DIRECTION direction) { Depth = depth; Direction = direction; }
//public void NavigatorSetPointer(PBaseObject obj) //{ // _navigator.Pointer = obj; //} // int level //public IPBaseObject Navigate(PModelObjectNavigatorPathLevel level, NAV_DIRECTION dir) //{ // return _navigator.Navigate(level, dir); //} public IPBaseObject Navigate(int depth, NAV_DIRECTION direction) { if (_navigator == null) throw new Exception("Попытка выполнить относительную навигацию без полной (Navigate(string))"); return _navigator.Navigate(depth, direction); }
//public PBaseObject Navigate(int depth, NAV_DIRECTION direction) //{ // if (_owner == null) // throw new Exception("Текущий объект не задан"); // PBaseObject obj = Pointer; // // есть уровень? // if (depth < _levels.Count()) // { // // навигация в текущем уровне? // if (Pointer._ownerCollection.Name == _levels[depth]) // { // int index = Pointer._ownerCollection.IndexOf(Pointer); // if (index != -1) // { // if (direction == NAV_DIRECTION.DOWN) // { // // можно вниз? // if (index < Pointer._ownerCollection.Count() - 1) // { // _positionInLevel[depth] = _positionInLevel[depth] + 1; // } // } // else { // // можно вверх? // if (index > 0) { // _positionInLevel[depth] = _positionInLevel[depth] + 1; // } // } // obj = Pointer._ownerCollection.GetObject(_positionInLevel[depth]); // } // } // else // { // PCollection collection = _owner.GetCollection(_levels[depth], true) // if (collection != null) // { // if (direction == NAV_DIRECTION.DOWN) // { // } // } // } // } // Pointer = obj; // return obj; //} //public PBaseObject Navigate(string level, NAV_DIRECTION dir) //{ // if (_owner == null) // throw new Exception("Текущий объект не задан"); // int cnt = _indexOf(level) + 1; // int[] newPath = new int[cnt]; // for (int ii = 0; ii < cnt; ii++) // { // newPath[ii] = Levels[ii].Index; // } // if (_tryGetNewPath(ref newPath, dir)) // { // for (int ii = 0; ii < Levels.Count(); ii++) // { // Levels[ii].Index = (ii < cnt) ? newPath[ii] : 0; // } // return _updatePointer(); // } // else // { // return Pointer; // } //} private bool _tryGetNewPath(ref List<int> path, NAV_DIRECTION dir) { for (int ii = path.Count() - 1; ii >= 0; ii--) { path[ii] += (dir == NAV_DIRECTION.UP) ? -1 : 1; if (_validatePath(path, ii)) { return true; } else { path[ii] = (dir == NAV_DIRECTION.UP) ? -1 : 0; } } return false; }
//public PBaseObject Navigate(int depth, NAV_DIRECTION dir) //{ // if (_owner == null) // throw new Exception("Текущий объект не задан"); // int cnt = depth + 1; // if (cnt > _levels.Count) // throw new Exception("Задана глубина больше чем уровней в навигаторе"); // List<int> newPath = new List<int>(); // for (int ii = 0; ii < cnt; ii++ ) // { // newPath.Add(_positionInLevel[ii]); // } // //_positionInLevel.ToList(); // if (_tryGetNewPath(ref newPath, dir)) // { // for (int ii = 0; ii < _levels.Count(); ii++) // { // _positionInLevel[ii] = (ii < cnt) ? newPath[ii] : 0; // } // //_positionInLevel = newPath; // //for (int ii = 0; ii < _levels.Count(); ii++) // //{ // // _positionInLevel[ii] = (ii < cnt) ? newPath[ii] : 0; // //} // _updatePointer(); // return Pointer; // } // else // { // return Pointer; // } //} public PBaseObject Navigate(int depth, NAV_DIRECTION dir) { if (_owner == null) throw new Exception("Текущий объект не задан"); int cnt = depth + 1; if (cnt > _path.Parts.Count()) throw new Exception("Задана глубина больше чем уровней в навигаторе"); List<int> newPath = new List<int>(); for (int ii = 0; ii < cnt; ii++) { newPath.Add(_path.Parts[ii].PositionInLevel); } if (_tryGetNewPath(ref newPath, dir)) { for (int ii = 0; ii < _path.Parts.Count(); ii++) { _path.Parts[ii].PositionInLevel = (ii < cnt) ? newPath[ii] : 0; } _updatePointer(); return Pointer; } else { return Pointer; } }
public IPObject Navigate(int depth, NAV_DIRECTION dir, bool overStep) { if (this._base == null) throw new Exception("Текущий объект не задан"); if (depth >= this._path.Parts.Count()) throw new Exception("Задана глубина больше чем уровней в навигаторе"); List<int> newPath = new List<int>(); for (int ii = 0; ii <= depth; ii++) { newPath.Add(this._path.Parts[ii].PositionInLevel); } if (_tryGetNewPath(ref newPath, dir, overStep)) { int cnt = this._path.Parts.Count; for (int ii = 0; ii < cnt; ii++) { _path.Parts[ii].PositionInLevel = (ii <= depth) ? newPath[ii] : 0; } this._path.Normalize(this._base); this.Pointer = this.GetObjectAtPathLevel(_path.Parts.Count-1, false); return Pointer; } else { if (this.OnNavigated != null) { OnNavigated(this, new NavigatedEventArgs(this.Pointer, this.Pointer)); } return null; } }
private bool _navigate(RModelObjectNavigatorPathLevel level, NAV_DIRECTION dir) { if (this._current == null) throw new Exception("Текущий объект не задан"); int cnt = _indexOf(level) + 1; int[] newPath = new int[cnt]; for (int ii = 0; ii < cnt; ii++) { newPath[ii] = _levels[ii].Index; } if (_tryGetNewPath(ref newPath, dir)) { for (int ii = 0; ii < _levels.Count(); ii++) { _levels[ii].Index = (ii < cnt) ? newPath[ii] : 0; } _updatePointer(); return true; } else { return false; } }