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; }
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); }
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]); } } }
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(); }
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); } }
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; }
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; } }
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; }
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 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); } } } }
private static bool IsVerticalFrameStyle(GFrameStyle style) { return(style == GFrameStyle.DivVertical || style == GFrameStyle.DivVertical3); }
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); }