예제 #1
0
        public CommandResult Close()
        {
            try {
                _connection.Disconnect();
                _connection.Close();
            }
            catch (Exception ex) {
                //ここでエラーが発生しても処理は続行してアプリ自体は実行を継続
                GUtil.Warning(GEnv.Frame, GEnv.Strings.GetString("Message.ConnectionCommandTarget.CloseError") + ex.Message);
            }
            bool          active = _connection == GEnv.Connections.ActiveConnection;
            ConnectionTag ct     = GEnv.Connections.FindTag(_connection);

            //Debug.WriteLine("ct==null? " + (ct==null));
            if (ct == null)
            {
                return(CommandResult.Ignored);
            }

            TerminalPane pane = ct.AttachedPane;

            ct.IsTerminated = true;
            GEnv.Frame.RemoveConnection(ct);
            ConnectionTag next = GEnv.Connections.GetCandidateOfActivation(ct.PositionIndex, ct);

            GEnv.Connections.Remove(_connection);
            if (next != null)
            {
                if (pane != null)
                {
                    pane.Attach(next);
                }
                if (active)
                {
                    GEnv.Frame.ActivateConnection(next);                     //もともとアクティブでない接続が切れたときは変更しない
                }
            }
            else
            {
                if (pane != null)
                {
                    pane.FakeVisible = false;
                    pane.Detach();
                }
                GEnv.Frame.RefreshConnection(null);
            }

            if (GEnv.Options.QuitAppWithLastPane && GEnv.Connections.Count == 0)
            {
                GEnv.Frame.AsForm().Close();
            }

            return(CommandResult.Success);
        }
예제 #2
0
        private void MovePane(ConnectionTag ct, int destinationIndex)
        {
            //位置の変更
            //移動先に表示
            //Debug.WriteLine("--------");
            //GEnv.Connections.Dump();
            int originalPos = ct.PositionIndex;

            Debug.Assert(originalPos != destinationIndex);
            ct.PositionIndex = destinationIndex;
            TerminalPane pane = GetPane(destinationIndex);

            if (ct.AttachedPane != null)
            {
                ct.AttachedPane.Detach();
            }
            if (pane.FakeVisible)
            {
                pane.Detach();
            }
            pane.FakeVisible = true;
            pane.Attach(ct);
            pane.Focus();
            GEnv.Frame.RefreshConnection(ct);
            //GEnv.Connections.Dump();

            //ここでPreservedPositionIndexを設定
            ct.PreservedPositionIndex = destinationIndex;

            //移動元に別の候補がいればそれを表示
            ConnectionTag orig = GEnv.Connections.GetCandidateOfActivation(originalPos, ct);

            if (orig != null)
            {
                //orig.PaneType = CalcPaneType(orig);
                GetPane(originalPos).Attach(orig);
                GEnv.Frame.RefreshConnection(orig);
            }
            else
            {
                GetPane(originalPos).FakeVisible = false;
            }
        }
예제 #3
0
        //
        public void ActivateConnection(ConnectionTag ct)
        {
            //ct.PaneType = CalcPaneType(ct);
            TerminalPane pane = GetPane(ct.PositionIndex);

            //既にコネクションがあればそれのUIをリフレッシュ
            if (pane.Connection != null)
            {
                ConnectionTag k = GEnv.Connections.FindTag(pane.Connection);
                if (k != null)                //ここで既に閉じた接続が得られてしまうことがある。本当は接続を閉じるときに参照を解消すべきだが手抜き
                {
                    pane.Detach();
                    GEnv.Frame.RefreshConnection(k);
                }
            }

            pane.FakeVisible = true;
            pane.Attach(ct);
            if (!pane.AsControl().Focused)
            {
                pane.AsControl().Focus();
            }
            GEnv.Frame.RefreshConnection(ct);
        }