示例#1
0
        private bool _ignoreSplitterMoveFlag;         //OnResizeの中でSplitPositionをセットするとOnSplitterMovedも呼ばれてしまうのでこれを防止するためにフラグをセット
        private void OnSplitterMoved(object sender, SplitterEventArgs args)
        {
            if (_ignoreSplitterMoveFlag)
            {
                return;
            }

            GFrameStyle s           = GApp.Options.FrameStyle;
            bool        is_vertical = (s == GFrameStyle.DivVertical || s == GFrameStyle.DivVertical3);
            int         pane_count  = StyleToPaneCount(s);

            for (int i = 0; i < pane_count; i++)
            {
                _panes[i].SplitterDragging(_panes[i].Width, _panes[i].Height);
            }

            //スプリッタのインデクス
            int splitter_index = 0;
            int total          = 0;

            for (int i = 0; i < pane_count - 1; i++)
            {
                total += _splitters[i].SplitPosition;
                if (_splitters[i] == sender)
                {
                    splitter_index = i;
                    break;
                }
            }

            double r = (double)(total) / (is_vertical? this.Width : this.Height);

            //Debug.WriteLine("Ratio="+r);
            _splitterRatio[pane_count - 2][splitter_index] = r;
        }
示例#2
0
        public void ApplyOptions(ContainerOptions opt)
        {
            GFrameStyle f = opt.FrameStyle;

            _singleStyle.Checked         = f == GFrameStyle.Single;
            _divHorizontalStyle.Checked  = f == GFrameStyle.DivHorizontal;
            _divVerticalStyle.Checked    = f == GFrameStyle.DivVertical;
            _divHorizontal3Style.Checked = f == GFrameStyle.DivHorizontal3;
            _divVertical3Style.Checked   = f == GFrameStyle.DivVertical3;
            Invalidate(true);
        }
 public void SetFrameStyle(GFrameStyle style, int w1, int h1, int w2, int h2)
 {
     lock (this) {
         _style   = style;
         _width1  = w1;
         _height1 = h1;
         _width2  = w2;
         _height2 = h2;
         SendMessageCore(CService.SetFrameStyle);
     }
 }
        public CommandResult SetFrameStyle(GFrameStyle fs)
        {
            if (fs == GApp.Options.FrameStyle)
            {
                return(CommandResult.Ignored);
            }
            GEnv.TextSelection.Clear();

            ContainerOptions opt = (ContainerOptions)GApp.Options.Clone();

            opt.FrameStyle = fs;
            GApp.UpdateOptions(opt);
            return(CommandResult.Success);
        }
示例#5
0
        private void OnSplitterMoving(object sender, SplitterEventArgs args)
        {
            GFrameStyle s           = GApp.Options.FrameStyle;
            bool        is_vertical = s == GFrameStyle.DivVertical || s == GFrameStyle.DivVertical3;

            int[] ws = new int[_panes.Length];
            for (int i = 0; i < _panes.Length; i++)
            {
                ws[i] = _panes[i] == null? 0 : is_vertical? _panes[i].Width : _panes[i].Height;
            }

            //スプリッタのインデクス
            int splitter_index = 0;

            for (int i = 0; i < _panes.Length - 1; i++)
            {
                if (_splitters[i] == sender)
                {
                    splitter_index = i;
                    break;
                }
            }

            int diff = (is_vertical? args.SplitX - _panes[splitter_index].Right : args.SplitY - _panes[splitter_index].Bottom);

            ws[splitter_index]     += diff;
            ws[splitter_index + 1] -= diff;

            for (int i = 0; i < _panes.Length; i++)
            {
                if (_panes[i] == null)
                {
                    break;
                }
                if (is_vertical)
                {
                    _panes[i].SplitterDragging(ws[i], this.Height);
                }
                else
                {
                    _panes[i].SplitterDragging(this.Width, ws[i]);
                }
            }
        }
示例#6
0
        protected override void OnResize(EventArgs args)
        {
            base.OnResize(args);
            if (_splitters == null || _ignoreResize || !GApp.Options.SplitterPreservesRatio)
            {
                return;
            }
            GFrameStyle s = GApp.Options.FrameStyle;

            if (s == GFrameStyle.Single)
            {
                return;
            }
            if (_splitters[0] == null)
            {
                return;                                 //未初期化時はスキップ
            }
            AdjustSplitters();
        }
示例#7
0
        private static int StyleToPaneCount(GFrameStyle style)
        {
            switch (style)
            {
            case GFrameStyle.Single:
                return(1);

            case GFrameStyle.DivVertical:
            case GFrameStyle.DivHorizontal:
                return(2);

            case GFrameStyle.DivVertical3:
            case GFrameStyle.DivHorizontal3:
                return(3);

            default:
                Debug.Assert(false);
                return(0);
            }
        }
示例#8
0
        private void AdjustSplitters()
        {
            if (_ignoreSplitterMoveFlag)
            {
                return;
            }

            _ignoreSplitterMoveFlag = true;
            GFrameStyle s = GApp.Options.FrameStyle;

            bool   is_vertical = IsVerticalFrameStyle(s);
            int    pane_count  = StyleToPaneCount(s);
            double offset      = 0;

            for (int i = 0; i < pane_count - 1; i++)
            {
                double next = _splitterRatio[pane_count - 2][i];
                if (is_vertical)
                {
                    //Debug.WriteLine(String.Format("{0} {1}", i, (int)(this.Width * next)));
                    _splitters[i].SplitPosition = (int)(this.Width * (next - offset));
                    _panes[i].SplitterDragging((int)(this.Width * (next - offset)), this.Height);
                }
                else
                {
                    _splitters[i].SplitPosition = (int)(this.Height * (next - offset));
                    _panes[i].SplitterDragging(this.Width, (int)(this.Height * (next - offset)));
                }
                offset = next;
            }
            //ラスト
            if (is_vertical)
            {
                _panes[pane_count - 1].SplitterDragging((int)(this.Width * (1 - offset)), this.Height);
            }
            else
            {
                _panes[pane_count - 1].SplitterDragging(this.Width, (int)(this.Height * (1 - offset)));
            }
            _ignoreSplitterMoveFlag = false;
        }
示例#9
0
 private static int StyleToPaneCount(GFrameStyle style)
 {
     switch(style) {
         case GFrameStyle.Single:
             return 1;
         case GFrameStyle.DivVertical:
         case GFrameStyle.DivHorizontal:
             return 2;
         case GFrameStyle.DivVertical3:
         case GFrameStyle.DivHorizontal3:
             return 3;
         default:
             Debug.Assert(false);
             return 0;
     }
 }
示例#10
0
 private static bool IsVerticalFrameStyle(GFrameStyle style)
 {
     return style==GFrameStyle.DivVertical || style==GFrameStyle.DivVertical3;
 }
        public CommandResult SetFrameStyle(GFrameStyle fs)
        {
            if(fs==GApp.Options.FrameStyle) return CommandResult.Ignored;
            GEnv.TextSelection.Clear();

            ContainerOptions opt = (ContainerOptions)GApp.Options.Clone();
            opt.FrameStyle = fs;
            GApp.UpdateOptions(opt);
            return CommandResult.Success;
        }
示例#12
0
 public void SetFrameStyle(GFrameStyle style, int w1, int h1, int w2, int h2)
 {
     lock(this) {
         _style = style;
         _width1 = w1;
         _height1 = h1;
         _width2 = w2;
         _height2 = h2;
         SendMessageCore(CService.SetFrameStyle);
     }
 }
示例#13
0
        public void InitUI(ContainerOptions prev, ContainerOptions opt)
        {
            ConnectionTag[] cons = new ConnectionTag[_panes.Length];
            for (int i = 0; i < _panes.Length; i++)
            {
                cons[i] = (_panes[i] == null || !_panes[i].FakeVisible)? null : _panes[i].ConnectionTag;
                if (_panes[i] != null)
                {
                    _panes[i].Detach();
                }
                _panes[i] = null;
            }

            Controls.Clear();

            GFrameStyle style           = opt.FrameStyle;
            int         pane_count      = StyleToPaneCount(style);
            int         prev_pane_count = prev == null? 1 : StyleToPaneCount(prev.FrameStyle);
            bool        is_vertical     = style == GFrameStyle.DivVertical || style == GFrameStyle.DivVertical3;

            //Controlの初期化
            this.SuspendLayout();
            for (int i = pane_count - 1; i >= 0; i--)
            {
                TerminalPane p = new TerminalPane();
                _panes[i] = p;
                p.Visible = true;
                p.Dock    = i == pane_count - 1? DockStyle.Fill : is_vertical? DockStyle.Left : DockStyle.Top;
                if (i < pane_count - 1)
                {
                    int a = (int)((is_vertical? this.Width : this.Height) * (i == 0? 0 : _splitterRatio[pane_count - 2][i - 1]));
                    int b = (int)((is_vertical? this.Width : this.Height) * (_splitterRatio[pane_count - 2][i] - (i == 0? 0 : _splitterRatio[pane_count - 2][i - 1])));
                    if (is_vertical)
                    {
                        p.Left  = a;
                        p.Width = b;
                    }
                    else
                    {
                        p.Top    = a;
                        p.Height = b;
                    }
                }
                this.Controls.Add(p);

                if (i > 0)
                {
                    Splitter s = new Splitter();
                    _splitters[i - 1] = s;
                    s.SplitterMoving += new SplitterEventHandler(this.OnSplitterMoving);
                    s.SplitterMoved  += new SplitterEventHandler(this.OnSplitterMoved);
                    s.Dock            = is_vertical? DockStyle.Left : DockStyle.Top;
                    s.BorderStyle     = BorderStyle.Fixed3D;
                    s.MinSize         = 8;
                    s.SplitPosition   = (int)((is_vertical? this.Width : this.Height) * _splitterRatio[pane_count - 2][i - 1]);
                    this.Controls.Add(s);
                }
            }
            this.ResumeLayout(true);


            //必要なものをAttach
            foreach (ConnectionTag ct in GEnv.Connections.OrderedConnections)
            {
                int pos = ct.PositionIndex;
                if (prev_pane_count < pane_count && ct.PreservedPositionIndex >= prev_pane_count)              //増えたペインへの強制割り当て
                {
                    pos = ct.PreservedPositionIndex;
                    if (pos >= pane_count)
                    {
                        pos = pane_count - 1;
                    }
                    ct.PositionIndex = pos;
                    if (_panes[pos].ConnectionTag == null)
                    {
                        _panes[pos].Attach(ct);
                        _panes[pos].FakeVisible = true;
                        GEnv.Frame.RefreshConnection(ct);
                    }
                }
                else if (pos < pane_count)                  //平和な場合
                {
                    if (_panes[pos].ConnectionTag == null)
                    {
                        _panes[pos].Attach(ct);
                        _panes[pos].FakeVisible = true;
                        GEnv.Frame.RefreshConnection(ct);
                    }
                }
                else                   //隠れる場合
                {
                    ct.PositionIndex = pane_count - 1;
                    if (ct != null && _panes[pane_count - 1].ConnectionTag == null)
                    {
                        _panes[pane_count - 1].Attach(ct);
                        _panes[pane_count - 1].FakeVisible = true;
                        GEnv.Frame.RefreshConnection(ct);
                    }
                }
            }
        }
示例#14
0
 private static bool IsVerticalFrameStyle(GFrameStyle style)
 {
     return(style == GFrameStyle.DivVertical || style == GFrameStyle.DivVertical3);
 }
示例#15
0
        public bool MoveActivePane(Keys direction)
        {
            ConnectionTag ct = GEnv.Connections.ActiveTag;

            if (ct == null || ct.AttachedPane == null)
            {
                return(false);                                              //!!本来この条件になることはないはずだが、激しくタブを移動させているとこうなることがあった。
            }
            Debug.Assert(ct.AttachedPane.FakeVisible);

            GFrameStyle style = GApp.Options.FrameStyle;

            if (style == GFrameStyle.Single)
            {
                return(false);
            }

            int  pane_count       = style == GFrameStyle.DivVertical3 || style == GFrameStyle.DivHorizontal3? 3 : 2;
            bool is_vertical      = style == GFrameStyle.DivVertical3 || style == GFrameStyle.DivVertical;
            int  destinationIndex = ct.PositionIndex;

            switch (direction)
            {
            case Keys.Up:
                if (!is_vertical)
                {
                    destinationIndex--;
                }
                else
                {
                    return(false);
                }
                break;

            case Keys.Down:
                if (!is_vertical)
                {
                    destinationIndex++;
                }
                else
                {
                    return(false);
                }
                break;

            case Keys.Left:
                if (is_vertical)
                {
                    destinationIndex--;
                }
                else
                {
                    return(false);
                }
                break;

            case Keys.Right:
                if (is_vertical)
                {
                    destinationIndex++;
                }
                else
                {
                    return(false);
                }
                break;
            }

            if (destinationIndex < 0)
            {
                return(false);
            }
            if (destinationIndex >= pane_count)
            {
                return(false);
            }

            MovePane(ct, destinationIndex);
            return(true);
        }