Browse Source

All top-level GUI sessions are managed, so treat them as such, to simplify a code

Source commit: 2ec1f86123529455ecd74c7bc2046be997e10573
Martin Prikryl 6 years ago
parent
commit
7fc860b312

+ 40 - 53
source/forms/CustomScpExplorer.cpp

@@ -154,7 +154,7 @@ public:
 class TTerminalNoteData : public TObject
 {
 public:
-  TTerminal * Terminal;
+  TManagedTerminal * Terminal;
 };
 //---------------------------------------------------------------------------
 __fastcall TCustomScpExplorerForm::TCustomScpExplorerForm(TComponent* Owner):
@@ -529,7 +529,7 @@ bool __fastcall TCustomScpExplorerForm::CommandLineFromAnotherInstance(
   return Result;
 }
 //---------------------------------------------------------------------------
-void __fastcall TCustomScpExplorerForm::SetTerminal(TTerminal * value)
+void __fastcall TCustomScpExplorerForm::SetTerminal(TManagedTerminal * value)
 {
   if (FTerminal != value)
   {
@@ -538,7 +538,7 @@ void __fastcall TCustomScpExplorerForm::SetTerminal(TTerminal * value)
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TCustomScpExplorerForm::DoSetTerminal(TTerminal * value, bool Replace)
+void __fastcall TCustomScpExplorerForm::DoSetTerminal(TManagedTerminal * value, bool Replace)
 {
   FTerminal = value;
   bool PrevAllowTransferPresetAutoSelect = FAllowTransferPresetAutoSelect;
@@ -558,7 +558,7 @@ void __fastcall TCustomScpExplorerForm::DoSetTerminal(TTerminal * value, bool Re
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TCustomScpExplorerForm::ReplaceTerminal(TTerminal * value)
+void __fastcall TCustomScpExplorerForm::ReplaceTerminal(TManagedTerminal * value)
 {
   DoSetTerminal(value, true);
 }
@@ -573,10 +573,9 @@ void __fastcall TCustomScpExplorerForm::TerminalChanging()
 //---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::TerminalChanged(bool Replaced)
 {
-  TManagedTerminal * ManagedTerminal = dynamic_cast<TManagedTerminal *>(Terminal);
-  if (ManagedTerminal != NULL)
+  if (Terminal != NULL)
   {
-    UpdateSessionColor((TColor)ManagedTerminal->StateData->Color);
+    UpdateSessionColor((TColor)Terminal->StateData->Color);
   }
   DoTerminalListChanged();
 
@@ -598,13 +597,11 @@ void __fastcall TCustomScpExplorerForm::TerminalChanged(bool Replaced)
       Terminal->RefreshDirectory();
     }
 
-    DebugAssert(ManagedTerminal == Terminal);
-
     if (WinConfiguration->PreservePanelState)
     {
-      if (ManagedTerminal->RemoteExplorerState != NULL)
+      if (Terminal->RemoteExplorerState != NULL)
       {
-        DirView(osRemote)->RestoreState(ManagedTerminal->RemoteExplorerState);
+        DirView(osRemote)->RestoreState(Terminal->RemoteExplorerState);
       }
       else
       {
@@ -1232,12 +1229,11 @@ void __fastcall TCustomScpExplorerForm::AddQueueItem(
   AddQueueItem(Queue, QueueItem, Terminal);
 }
 //---------------------------------------------------------------------------
-void __fastcall TCustomScpExplorerForm::AddQueueItem(TTerminalQueue * Queue, TQueueItem * QueueItem, TTerminal * Terminal)
+void __fastcall TCustomScpExplorerForm::AddQueueItem(TTerminalQueue * Queue, TQueueItem * QueueItem, TManagedTerminal * Terminal)
 {
   if (Queue->IsEmpty)
   {
-    TManagedTerminal * ManagedTerminal = DebugNotNull(dynamic_cast<TManagedTerminal *>(Terminal));
-    ManagedTerminal->QueueOperationStart = Now();
+    Terminal->QueueOperationStart = Now();
   }
   Queue->AddItem(QueueItem);
 }
@@ -2824,7 +2820,7 @@ bool __fastcall TCustomScpExplorerForm::ExecuteFileOperation(TFileOperation Oper
   {
     DebugAssert(!IsSideLocalBrowser(Side));
     Result = RemoteTransferFiles(FileList, NoConfirmation,
-      (Operation == foRemoteMove), reinterpret_cast<TTerminal *>(Param));
+      (Operation == foRemoteMove), reinterpret_cast<TManagedTerminal *>(Param));
   }
   else if (Operation == foLock)
   {
@@ -3747,7 +3743,7 @@ void __fastcall TCustomScpExplorerForm::ExecutedFileReload(
       (ExtractFileName(FileName), Data->SessionName)));
   }
 
-  TTerminal * PrevTerminal = TTerminalManager::Instance()->ActiveTerminal;
+  TManagedTerminal * PrevTerminal = TTerminalManager::Instance()->ActiveTerminal;
   TTerminalManager::Instance()->ActiveTerminal = Data->Terminal;
   NonVisualDataModule->StartBusy();
   try
@@ -4003,7 +3999,7 @@ void __fastcall TCustomScpExplorerForm::LockFiles(TStrings * FileList, bool Lock
   RemoteDirView->RestoreSelection();
 }
 //---------------------------------------------------------------------------
-bool __fastcall TCustomScpExplorerForm::RemoteTransferDialog(TTerminal *& Session,
+bool __fastcall TCustomScpExplorerForm::RemoteTransferDialog(TManagedTerminal *& Session,
   TStrings * FileList, UnicodeString & Target, UnicodeString & FileMask, bool & DirectCopy,
   bool NoConfirmation, bool Move)
 {
@@ -4035,8 +4031,7 @@ bool __fastcall TCustomScpExplorerForm::RemoteTransferDialog(TTerminal *& Sessio
   }
   else
   {
-    TManagedTerminal * ManagedTerminal = DebugNotNull(dynamic_cast<TManagedTerminal *>(Session));
-    Target = ManagedTerminal->StateData->RemoteDirectory;
+    Target = Session->StateData->RemoteDirectory;
   }
 
   Target = UnixIncludeTrailingBackslash(Target);
@@ -4090,7 +4085,7 @@ bool __fastcall TCustomScpExplorerForm::RemoteTransferDialog(TTerminal *& Sessio
         void * ASession = Session;
         Result = DoRemoteCopyDialog(Sessions, Directories, AllowDirectCopy,
           Multi, ASession, Target, FileMask, DirectCopy, TTerminalManager::Instance()->ActiveTerminal);
-        Session = static_cast<TTerminal *>(ASession);
+        Session = static_cast<TManagedTerminal *>(ASession);
       }
       __finally
       {
@@ -4102,7 +4097,7 @@ bool __fastcall TCustomScpExplorerForm::RemoteTransferDialog(TTerminal *& Sessio
 }
 //---------------------------------------------------------------------------
 bool __fastcall TCustomScpExplorerForm::RemoteTransferFiles(
-  TStrings * FileList, bool NoConfirmation, bool Move, TTerminal * Session)
+  TStrings * FileList, bool NoConfirmation, bool Move, TManagedTerminal * Session)
 {
   DebugAssert(!IsLocalBrowserMode());
   bool DirectCopy;
@@ -4621,11 +4616,8 @@ void __fastcall TCustomScpExplorerForm::Idle()
 
       if (WinConfiguration->RefreshRemotePanel)
       {
-        TManagedTerminal * ManagedTerminal =
-          dynamic_cast<TManagedTerminal *>(Terminal);
-        if ((ManagedTerminal != NULL) && (Terminal->Status == ssOpened) &&
-            (Now() - ManagedTerminal->DirectoryLoaded >
-               WinConfiguration->RefreshRemotePanelInterval))
+        if ((Terminal != NULL) && (Terminal->Status == ssOpened) &&
+            (Now() - Terminal->DirectoryLoaded > WinConfiguration->RefreshRemotePanelInterval))
         {
           RemoteDirView->ReloadDirectory();
         }
@@ -4797,7 +4789,7 @@ void __fastcall TCustomScpExplorerForm::DuplicateSession()
     std::unique_ptr<TSessionData> SessionData(CloneCurrentSessionData());
 
     TTerminalManager * Manager = TTerminalManager::Instance();
-    TTerminal * Terminal = Manager->NewTerminal(SessionData.get());
+    TManagedTerminal * Terminal = Manager->NewManagedTerminal(SessionData.get());
     Manager->ActiveTerminal = Terminal;
   }
 }
@@ -4877,7 +4869,7 @@ void __fastcall TCustomScpExplorerForm::OpenStoredSession(TSessionData * Data)
   else
   {
     TTerminalManager * Manager = TTerminalManager::Instance();
-    TTerminal * Terminal = Manager->NewTerminal(Data);
+    TManagedTerminal * Terminal = Manager->NewManagedTerminal(Data);
     Manager->ActiveTerminal = Terminal;
   }
 }
@@ -6065,20 +6057,17 @@ bool __fastcall TCustomScpExplorerForm::SaveWorkspace(bool EnableAutoSave)
   return Result;
 }
 //---------------------------------------------------------------------------
-void __fastcall TCustomScpExplorerForm::UpdateTerminal(TTerminal * Terminal)
+void __fastcall TCustomScpExplorerForm::UpdateTerminal(TManagedTerminal * Terminal)
 {
   DebugAssert(!IsLocalBrowserMode());
-  TManagedTerminal * ManagedTerminal = dynamic_cast<TManagedTerminal *>(Terminal);
-  DebugAssert(ManagedTerminal != NULL);
-
-  SAFE_DESTROY(ManagedTerminal->RemoteExplorerState);
+  SAFE_DESTROY(Terminal->RemoteExplorerState);
 
   if (WinConfiguration->PreservePanelState)
   {
-    ManagedTerminal->RemoteExplorerState = RemoteDirView->SaveState();
+    Terminal->RemoteExplorerState = RemoteDirView->SaveState();
   }
 
-  UpdateSessionData(ManagedTerminal->StateData);
+  UpdateSessionData(Terminal->StateData);
 }
 //---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::UpdateSessionData(TSessionData * Data)
@@ -6627,29 +6616,28 @@ void __fastcall TCustomScpExplorerForm::UpdateNewSessionTab()
       UnicodeString();
 }
 //---------------------------------------------------------------------------
-TTerminal * __fastcall TCustomScpExplorerForm::GetSessionTabTerminal(TTabSheet * TabSheet)
+TManagedTerminal * __fastcall TCustomScpExplorerForm::GetSessionTabTerminal(TTabSheet * TabSheet)
 {
-  return reinterpret_cast<TTerminal *>(TabSheet->Tag);
+  return reinterpret_cast<TManagedTerminal *>(TabSheet->Tag);
 }
 //---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::UpdateSessionTab(TTabSheet * TabSheet)
 {
   if (DebugAlwaysTrue(TabSheet != NULL))
   {
-    TManagedTerminal * ManagedTerminal =
-      dynamic_cast<TManagedTerminal *>(GetSessionTabTerminal(TabSheet));
-    if (DebugAlwaysTrue(ManagedTerminal != NULL))
+    TManagedTerminal * ATerminal = GetSessionTabTerminal(TabSheet);
+    if (DebugAlwaysTrue(ATerminal != NULL))
     {
-      TColor Color = (ManagedTerminal == FTerminal) ? FSessionColor : ManagedTerminal->StateData->Color;
+      TColor Color = (ATerminal == FTerminal) ? FSessionColor : ATerminal->StateData->Color;
       TabSheet->ImageIndex = AddSessionColor(Color);
 
-      UnicodeString TabCaption = TTerminalManager::Instance()->GetTerminalTitle(ManagedTerminal, true);
+      UnicodeString TabCaption = TTerminalManager::Instance()->GetTerminalTitle(ATerminal, true);
       TabSheet->Caption = SessionsPageControl->FormatCaptionWithCloseButton(TabCaption);
 
       TThemeTabSheet * ThemeTabSheet = dynamic_cast<TThemeTabSheet *>(TabSheet);
       if (DebugAlwaysTrue(ThemeTabSheet != NULL))
       {
-        ThemeTabSheet->Shadowed = !ManagedTerminal->Active;
+        ThemeTabSheet->Shadowed = !ATerminal->Active;
       }
     }
   }
@@ -6658,7 +6646,7 @@ void __fastcall TCustomScpExplorerForm::UpdateSessionTab(TTabSheet * TabSheet)
 bool __fastcall TCustomScpExplorerForm::SessionTabSwitched()
 {
   DebugAssert(SessionsPageControl->ActivePage != NULL);
-  TTerminal * Terminal = GetSessionTabTerminal(SessionsPageControl->ActivePage);
+  TManagedTerminal * Terminal = GetSessionTabTerminal(SessionsPageControl->ActivePage);
   bool Result = (Terminal != NULL);
   if (Result)
   {
@@ -7120,7 +7108,7 @@ void __fastcall TCustomScpExplorerForm::QueueEmptyNoteClicked(TObject * Sender)
   if (DebugAlwaysTrue(TerminalNoteData != NULL) &&
       !NonVisualDataModule->Busy)
   {
-    TTerminal * Terminal = TerminalNoteData->Terminal;
+    TManagedTerminal * Terminal = TerminalNoteData->Terminal;
     TTerminalManager::Instance()->ActiveTerminal = Terminal;
     if (!ComponentVisible[fcQueueView])
     {
@@ -7130,10 +7118,9 @@ void __fastcall TCustomScpExplorerForm::QueueEmptyNoteClicked(TObject * Sender)
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TCustomScpExplorerForm::QueueEvent(TTerminal * ATerminal,
+void __fastcall TCustomScpExplorerForm::QueueEvent(TManagedTerminal * ATerminal,
   TTerminalQueue * /*Queue*/, TQueueEvent Event)
 {
-  TManagedTerminal * ManagedTerminal = DebugNotNull(dynamic_cast<TManagedTerminal *>(ATerminal));
   UnicodeString Message;
   TNotifyEvent OnClick = NULL;
   TObject * UserData = NULL;
@@ -7152,7 +7139,7 @@ void __fastcall TCustomScpExplorerForm::QueueEvent(TTerminal * ATerminal,
       break;
 
     case qeEmpty:
-      OperationComplete(ManagedTerminal->QueueOperationStart);
+      OperationComplete(ATerminal->QueueOperationStart);
       break;
 
     case qePendingUserAction:
@@ -8314,7 +8301,7 @@ UnicodeString __fastcall TCustomScpExplorerForm::FileStatusBarText(
   {
     Result = FormatIncrementalSearchStatus(FIncrementalSearch, FIncrementalSearchHaveNext);
   }
-  else if (!IsSideLocalBrowser(Side) && ((Terminal == NULL) || (dynamic_cast<TManagedTerminal *>(Terminal)->Disconnected)))
+  else if (!IsSideLocalBrowser(Side) && ((Terminal == NULL) || Terminal->Disconnected))
   {
     // noop
   }
@@ -9528,7 +9515,7 @@ void __fastcall TCustomScpExplorerForm::DoFindFiles(
 {
   if (!NonVisualDataModule->Busy)
   {
-    TTerminalManager::Instance()->ActiveTerminal = ATerminal;
+    TTerminalManager::Instance()->ActiveTerminal = DebugNotNull(dynamic_cast<TManagedTerminal *>(ATerminal));
     Configuration->Usage->Inc(L"FileFinds");
     LockWindow(true);
     NonVisualDataModule->StartBusy();
@@ -9550,7 +9537,7 @@ void __fastcall TCustomScpExplorerForm::DoFocusRemotePath(TTerminal * ATerminal,
 {
   if (!NonVisualDataModule->Busy)
   {
-    TTerminalManager::Instance()->ActiveTerminal = ATerminal;
+    TTerminalManager::Instance()->ActiveTerminal = DebugNotNull(dynamic_cast<TManagedTerminal *>(ATerminal));
     SetFocus();
     RemoteDirView->Path = UnixExtractFilePath(Path);
     UnicodeString FileName = UnixExtractFileName(Path);
@@ -9576,7 +9563,7 @@ bool __fastcall TCustomScpExplorerForm::CanOperateOnFoundFiles(TTerminal * ATerm
   bool Result = !NonVisualDataModule->Busy;
   if (Result)
   {
-    TTerminalManager::Instance()->ActiveTerminal = ATerminal;
+    TTerminalManager::Instance()->ActiveTerminal = DebugNotNull(dynamic_cast<TManagedTerminal *>(ATerminal));
   }
   return Result;
 }
@@ -9732,7 +9719,7 @@ void __fastcall TCustomScpExplorerForm::SessionsDDProcessDropped(
 {
   int Index = SessionsPageControl->IndexOfTabAt(Point.X, Point.Y);
   // do not allow dropping on the "+" tab
-  TTerminal * TargetTerminal = GetSessionTabTerminal(SessionsPageControl->Pages[Index]);
+  TManagedTerminal * TargetTerminal = GetSessionTabTerminal(SessionsPageControl->Pages[Index]);
   if (TargetTerminal != NULL)
   {
     DebugAssert(!IsFileControl(DropSourceControl, osRemote));

+ 13 - 12
source/forms/CustomScpExplorer.h

@@ -49,6 +49,7 @@ struct TEditedFileData;
 class ITaskbarList3;
 struct TSynchronizeParams;
 class TBookmark;
+class TManagedTerminal;
 //---------------------------------------------------------------------------
 enum TActionAllowed { aaShortCut, aaUpdate, aaExecute };
 enum TActionFlag { afLocal = 1, afRemote = 2, afExplorer = 4 , afCommander = 8 };
@@ -208,7 +209,7 @@ __published:
   void __fastcall RemoteDirViewResize(TObject *Sender);
 
 private:
-  TTerminal * FTerminal;
+  TManagedTerminal * FTerminal;
   TTerminalQueue * FQueue;
   TTerminalQueueStatus * FQueueStatus;
   TCriticalSection * FQueueStatusSection;
@@ -226,7 +227,7 @@ private:
   UnicodeString FClipboardFakeDirectory;
   std::unique_ptr<TObjectList> FClipboardFakeMonitors;
   std::unique_ptr<TDragDropFilesEx> FClipboardDragDropFilesEx;
-  TTerminal * FClipboardTerminal;
+  TManagedTerminal * FClipboardTerminal;
   std::unique_ptr<TStrings> FClipboardFileList;
   TStrings * FDelayedDeletionList;
   TTimer * FDelayedDeletionTimer;
@@ -282,8 +283,8 @@ private:
 
   bool __fastcall GetEnableFocusedOperation(TOperationSide Side, int FilesOnly);
   bool __fastcall GetEnableSelectedOperation(TOperationSide Side, int FilesOnly);
-  void __fastcall SetTerminal(TTerminal * value);
-  void __fastcall DoSetTerminal(TTerminal * value, bool Replace);
+  void __fastcall SetTerminal(TManagedTerminal * value);
+  void __fastcall DoSetTerminal(TManagedTerminal * value, bool Replace);
   void __fastcall SetQueue(TTerminalQueue * value);
   void __fastcall TransferListChange(TObject * Sender);
   void __fastcall TransferListDrawItem(TTBXCustomList * Sender, TCanvas * ACanvas,
@@ -300,7 +301,7 @@ private:
   void __fastcall AddQueueItem(TTerminalQueue * Queue, TTransferDirection Direction,
     TStrings * FileList, const UnicodeString TargetDirectory,
     const TGUICopyParamType & CopyParam, int Params);
-  void __fastcall AddQueueItem(TTerminalQueue * Queue, TQueueItem * QueueItem, TTerminal * Terminal);
+  void __fastcall AddQueueItem(TTerminalQueue * Queue, TQueueItem * QueueItem, TManagedTerminal * Terminal);
   void __fastcall ClearTransferSourceSelection(TTransferDirection Direction);
   void __fastcall SessionsDDDragOver(int KeyState, const TPoint & Point, int & Effect);
   void __fastcall SessionsDDProcessDropped(TObject * Sender, int KeyState, const TPoint & Point, int Effect);
@@ -368,13 +369,13 @@ protected:
     UnicodeString & TargetDirectory, TGUICopyParamType & CopyParam, bool Confirm,
     bool DragDrop, int Options);
   virtual void __fastcall CopyParamDialogAfter(TTransferDirection Direction, bool Temp, const UnicodeString & TargetDirectory);
-  virtual bool __fastcall RemoteTransferDialog(TTerminal *& Session,
+  virtual bool __fastcall RemoteTransferDialog(TManagedTerminal *& Session,
     TStrings * FileList, UnicodeString & Target, UnicodeString & FileMask, bool & DirectCopy,
     bool NoConfirmation, bool Move);
   virtual void __fastcall CreateParams(TCreateParams & Params);
   void __fastcall DeleteFiles(TOperationSide Side, TStrings * FileList, bool Alternative);
   bool __fastcall RemoteTransferFiles(TStrings * FileList, bool NoConfirmation,
-    bool Move, TTerminal * Session);
+    bool Move, TManagedTerminal * Session);
   virtual void __fastcall DoDirViewExecFile(TObject * Sender, TListItem * Item, bool & AllowExec);
   virtual TControl * __fastcall GetComponent(Byte Component);
   bool __fastcall GetComponentVisible(Byte Component);
@@ -626,7 +627,7 @@ protected:
   void __fastcall SetTaskbarListProgressState(TBPFLAG Flags);
   void __fastcall SetTaskbarListProgressValue(int Progress);
   void __fastcall SetTaskbarListProgressValue(TFileOperationProgressType * ProgressData);
-  TTerminal * __fastcall GetSessionTabTerminal(TTabSheet * TabSheet);
+  TManagedTerminal * __fastcall GetSessionTabTerminal(TTabSheet * TabSheet);
   bool __fastcall SessionTabSwitched();
   void __fastcall RestoreApp();
   void __fastcall GoToQueue();
@@ -734,7 +735,7 @@ public:
   virtual void __fastcall CompareDirectories();
   void __fastcall ExecuteCurrentFile();
   virtual void __fastcall OpenConsole(UnicodeString Command = L"");
-  virtual void __fastcall UpdateTerminal(TTerminal * Terminal);
+  virtual void __fastcall UpdateTerminal(TManagedTerminal * Terminal);
   virtual void __fastcall SynchronizeDirectories();
   virtual void __fastcall FullSynchronizeDirectories() = 0;
   virtual void __fastcall ExploreLocalDirectory();
@@ -770,7 +771,7 @@ public:
   void __fastcall ShowExtendedException(TTerminal * Terminal, Exception * E);
   void __fastcall InactiveTerminalException(TTerminal * Terminal, Exception * E);
   void __fastcall TerminalReady();
-  void __fastcall QueueEvent(TTerminal * Terminal, TTerminalQueue * Queue, TQueueEvent Event);
+  void __fastcall QueueEvent(TManagedTerminal * Terminal, TTerminalQueue * Queue, TQueueEvent Event);
   void __fastcall QueueEmptyNoteClicked(TObject * Sender);
   bool __fastcall DoSynchronizeDirectories(UnicodeString & LocalDirectory,
     UnicodeString & RemoteDirectory, bool UseDefaults);
@@ -812,7 +813,7 @@ public:
   bool __fastcall CanPrivateKeyUpload();
   void __fastcall PrivateKeyUpload();
   bool __fastcall IsComponentPossible(Byte Component);
-  void __fastcall ReplaceTerminal(TTerminal * value);
+  void __fastcall ReplaceTerminal(TManagedTerminal * value);
 
   __property bool ComponentVisible[Byte Component] = { read = GetComponentVisible, write = SetComponentVisible };
   __property bool EnableFocusedOperation[TOperationSide Side] = { read = GetEnableFocusedOperation, index = 0 };
@@ -820,7 +821,7 @@ public:
   __property bool EnableFocusedFileOperation[TOperationSide Side] = { read = GetEnableFocusedOperation, index = 1 };
   __property bool EnableSelectedFileOperation[TOperationSide Side] = { read = GetEnableSelectedOperation, index = 1 };
   __property bool HasDirView[TOperationSide Side] = { read = GetHasDirView };
-  __property TTerminal * Terminal = { read = FTerminal, write = SetTerminal };
+  __property TManagedTerminal * Terminal = { read = FTerminal, write = SetTerminal };
   __property TTerminalQueue * Queue = { read = FQueue, write = SetQueue };
   __property TColor SessionColor = { read = FSessionColor, write = SetSessionColor };
 };

+ 3 - 3
source/forms/NonVisual.cpp

@@ -402,8 +402,8 @@ void __fastcall TNonVisualDataModule::ExplorerActionsUpdate(
   UPD(DuplicateSessionAction, HasTerminal)
   UPD(RenameSessionAction, HasTerminal)
   UPD(CloseSessionAction2, (ScpExplorer->Terminal != NULL))
-  UPDEX1(DisconnectSessionAction, HasTerminal, DisconnectSessionAction->Visible = (ScpExplorer->Terminal == NULL) || !dynamic_cast<TManagedTerminal *>(ScpExplorer->Terminal)->Disconnected)
-  UPDEX1(ReconnectSessionAction, (ScpExplorer->Terminal != NULL) && dynamic_cast<TManagedTerminal *>(ScpExplorer->Terminal)->Disconnected, ReconnectSessionAction->Visible = ReconnectSessionAction->Enabled)
+  UPDEX1(DisconnectSessionAction, HasTerminal, DisconnectSessionAction->Visible = (ScpExplorer->Terminal == NULL) || !ScpExplorer->Terminal->Disconnected)
+  UPDEX1(ReconnectSessionAction, (ScpExplorer->Terminal != NULL) && ScpExplorer->Terminal->Disconnected, ReconnectSessionAction->Visible = ReconnectSessionAction->Enabled)
   UPD(SavedSessionsAction2, true)
   UPD(WorkspacesAction, StoredSessions->HasAnyWorkspace())
   UPD(OpenedSessionsAction, HasTerminal)
@@ -1459,7 +1459,7 @@ void __fastcall TNonVisualDataModule::CreateOpenedSessionListMenu(TAction * Acti
 //---------------------------------------------------------------------------
 void __fastcall TNonVisualDataModule::OpenedSessionItemClick(TObject * Sender)
 {
-  TTerminalManager::Instance()->ActiveTerminal = (TTerminal*)(((TMenuItem *)Sender)->Tag);
+  TTerminalManager::Instance()->ActiveTerminal = (TManagedTerminal*)(((TMenuItem *)Sender)->Tag);
 }
 //---------------------------------------------------------------------------
 void __fastcall TNonVisualDataModule::CreateEditorListMenu(TTBCustomItem * Menu, bool OnFocused)

+ 7 - 12
source/forms/ScpCommander.cpp

@@ -246,20 +246,18 @@ void __fastcall TScpCommanderForm::StoreParams()
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TScpCommanderForm::UpdateTerminal(TTerminal * Terminal)
+void __fastcall TScpCommanderForm::UpdateTerminal(TManagedTerminal * Terminal)
 {
   DebugAssert(!IsLocalBrowserMode());
   TCustomScpExplorerForm::UpdateTerminal(Terminal);
 
-  TManagedTerminal * ManagedTerminal = dynamic_cast<TManagedTerminal *>(Terminal);
-  DebugAssert(ManagedTerminal != NULL);
   DebugAssert(LocalDirView != NULL);
 
-  SAFE_DESTROY(ManagedTerminal->LocalExplorerState);
+  SAFE_DESTROY(Terminal->LocalExplorerState);
 
   if (WinConfiguration->PreservePanelState)
   {
-    ManagedTerminal->LocalExplorerState = LocalDirView->SaveState();
+    Terminal->LocalExplorerState = LocalDirView->SaveState();
   }
 }
 //---------------------------------------------------------------------------
@@ -528,15 +526,12 @@ void __fastcall TScpCommanderForm::TerminalChanged(bool Replaced)
     // do not attempt to select previously selected directory
     LocalDirView->ContinueSession(false);
 
-    TManagedTerminal * ManagedTerminal = dynamic_cast<TManagedTerminal *>(Terminal);
-    DebugAssert(ManagedTerminal != NULL);
-
     // reset home directory
     LocalDirView->HomeDirectory = L"";
 
     if (FFirstTerminal || !WinConfiguration->ScpCommander.PreserveLocalDirectory)
     {
-      UnicodeString LocalDirectory = ManagedTerminal->StateData->LocalDirectory;
+      UnicodeString LocalDirectory = Terminal->StateData->LocalDirectory;
 
       if (!LocalDirectory.IsEmpty())
       {
@@ -564,16 +559,16 @@ void __fastcall TScpCommanderForm::TerminalChanged(bool Replaced)
     if (WinConfiguration->PreservePanelState &&
         !WinConfiguration->ScpCommander.PreserveLocalDirectory)
     {
-      if (ManagedTerminal->LocalExplorerState != NULL)
+      if (Terminal->LocalExplorerState != NULL)
       {
-        LocalDirView->RestoreState(ManagedTerminal->LocalExplorerState);
+        LocalDirView->RestoreState(Terminal->LocalExplorerState);
       }
       else
       {
         LocalDirView->ClearState();
       }
 
-      NonVisualDataModule->SynchronizeBrowsingAction->Checked = ManagedTerminal->StateData->SynchronizeBrowsing;
+      NonVisualDataModule->SynchronizeBrowsingAction->Checked = Terminal->StateData->SynchronizeBrowsing;
     }
   }
 }

+ 1 - 1
source/forms/ScpCommander.h

@@ -607,7 +607,7 @@ public:
   virtual bool __fastcall AllowedAction(TAction * Action, TActionAllowed Allowed);
   virtual void __fastcall ChangePath(TOperationSide Side);
   virtual void __fastcall CompareDirectories();
-  virtual void __fastcall UpdateTerminal(TTerminal * Terminal);
+  virtual void __fastcall UpdateTerminal(TManagedTerminal * Terminal);
   virtual void __fastcall SynchronizeDirectories();
   virtual void __fastcall FullSynchronizeDirectories();
   virtual void __fastcall StoreParams();

+ 2 - 2
source/windows/EditorManager.h

@@ -4,7 +4,7 @@
 //---------------------------------------------------------------------------
 #include <vector>
 //---------------------------------------------------------------------------
-class TTerminal;
+class TManagedTerminal;
 class TTerminalQueue;
 //---------------------------------------------------------------------------
 struct TEditedFileData
@@ -15,7 +15,7 @@ struct TEditedFileData
   UnicodeString LocalRootDirectory;
   UnicodeString RemoteDirectory;
   bool ForceText;
-  TTerminal * Terminal;
+  TManagedTerminal * Terminal;
   TSessionData * SessionData;
   TTerminalQueue * Queue;
   UnicodeString SessionName;

+ 29 - 14
source/windows/TerminalManager.cpp

@@ -145,11 +145,21 @@ TTerminalQueue * __fastcall TTerminalManager::NewQueue(TTerminal * Terminal)
   return Queue;
 }
 //---------------------------------------------------------------------------
-TTerminal * __fastcall TTerminalManager::CreateTerminal(TSessionData * Data)
+TManagedTerminal * __fastcall TTerminalManager::CreateManagedTerminal(TSessionData * Data)
 {
   return new TManagedTerminal(Data, Configuration);
 }
 //---------------------------------------------------------------------------
+TTerminal * __fastcall TTerminalManager::CreateTerminal(TSessionData * Data)
+{
+  return CreateManagedTerminal(Data);
+}
+//---------------------------------------------------------------------------
+TManagedTerminal * __fastcall TTerminalManager::GetTerminal(int Index)
+{
+  return DebugNotNull(dynamic_cast<TManagedTerminal *>(TTerminalList::Terminals[Index]));
+}
+//---------------------------------------------------------------------------
 void __fastcall TTerminalManager::SetupTerminal(TTerminal * Terminal)
 {
   Terminal->OnQueryUser = TerminalQueryUser;
@@ -164,9 +174,9 @@ void __fastcall TTerminalManager::SetupTerminal(TTerminal * Terminal)
   Terminal->OnCustomCommand = TerminalCustomCommand;
 }
 //---------------------------------------------------------------------------
-TTerminal * __fastcall TTerminalManager::DoNewTerminal(TSessionData * Data)
+TManagedTerminal * __fastcall TTerminalManager::DoNewTerminal(TSessionData * Data)
 {
-  TTerminal * Terminal = TTerminalList::NewTerminal(Data);
+  TManagedTerminal * Terminal = DebugNotNull(dynamic_cast<TManagedTerminal *>(TTerminalList::NewTerminal(Data)));
   try
   {
     FQueues->Add(NewQueue(Terminal));
@@ -193,12 +203,17 @@ TTerminal * __fastcall TTerminalManager::NewTerminal(TSessionData * Data)
   return Terminal;
 }
 //---------------------------------------------------------------------------
-TTerminal * __fastcall TTerminalManager::NewTerminals(TList * DataList)
+TManagedTerminal * __fastcall TTerminalManager::NewManagedTerminal(TSessionData * Data)
 {
-  TTerminal * Result = NULL;
+  return DebugNotNull(dynamic_cast<TManagedTerminal *>(NewTerminal(Data)));
+}
+//---------------------------------------------------------------------------
+TManagedTerminal * __fastcall TTerminalManager::NewTerminals(TList * DataList)
+{
+  TManagedTerminal * Result = NULL;
   for (int Index = 0; Index < DataList->Count; Index++)
   {
-    TTerminal * Terminal =
+    TManagedTerminal * Terminal =
       DoNewTerminal(reinterpret_cast<TSessionData *>(DataList->Items[Index]));
     if (Index == 0)
     {
@@ -274,16 +289,16 @@ void __fastcall TTerminalManager::DoConnectTerminal(TTerminal * Terminal, bool R
         if (!AdHoc && (DebugAlwaysTrue(Terminal == FActiveTerminal)))
         {
           // terminal was abandoned, must create a new one to replace it
-          Terminal = CreateTerminal(new TSessionData(L""));
+          Terminal = ManagedTerminal = CreateManagedTerminal(new TSessionData(L""));
           SetupTerminal(Terminal);
           OwnsObjects = false;
           Items[ActiveTerminalIndex] = Terminal;
           OwnsObjects = true;
-          FActiveTerminal = Terminal;
+          FActiveTerminal = ManagedTerminal;
           // Can be NULL, when opening the first session from command-line
           if (FScpExplorer != NULL)
           {
-            FScpExplorer->ReplaceTerminal(Terminal);
+            FScpExplorer->ReplaceTerminal(ManagedTerminal);
           }
         }
         // Now we do not have any reference to an abandoned terminal, so we can safely allow the thread
@@ -601,17 +616,17 @@ void __fastcall TTerminalManager::SetScpExplorer(TCustomScpExplorerForm * value)
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TTerminalManager::SetActiveTerminal(TTerminal * value)
+void __fastcall TTerminalManager::SetActiveTerminal(TManagedTerminal * value)
 {
   DoSetActiveTerminal(value, false);
 }
 //---------------------------------------------------------------------------
-void __fastcall TTerminalManager::SetActiveTerminalWithAutoReconnect(TTerminal * value)
+void __fastcall TTerminalManager::SetActiveTerminalWithAutoReconnect(TManagedTerminal * value)
 {
   DoSetActiveTerminal(value, true);
 }
 //---------------------------------------------------------------------------
-void __fastcall TTerminalManager::DoSetActiveTerminal(TTerminal * value, bool AutoReconnect)
+void __fastcall TTerminalManager::DoSetActiveTerminal(TManagedTerminal * value, bool AutoReconnect)
 {
   if (ActiveTerminal != value)
   {
@@ -1303,7 +1318,7 @@ TStrings * __fastcall TTerminalManager::GetTerminalList()
   FTerminalList->Clear();
   for (int i = 0; i < Count; i++)
   {
-    TTerminal * Terminal = Terminals[i];
+    TManagedTerminal * Terminal = Terminals[i];
     UnicodeString Name = GetTerminalTitle(Terminal, true);
     FTerminalList->AddObject(Name, Terminal);
   }
@@ -1563,7 +1578,7 @@ void __fastcall TTerminalManager::Idle(bool SkipCurrentTerminal)
       // the session may not exist anymore
       if (Index >= 0)
       {
-        TTerminal * Terminal = Terminals[Index];
+        TManagedTerminal * Terminal = Terminals[Index];
         // we can hardly have a queue event without explorer
         DebugAssert(ScpExplorer != NULL);
         if (ScpExplorer != NULL)

+ 12 - 8
source/windows/TerminalManager.h

@@ -42,8 +42,8 @@ public:
   __fastcall TTerminalManager();
   __fastcall ~TTerminalManager();
 
-  virtual TTerminal * __fastcall NewTerminal(TSessionData * Data);
-  TTerminal * __fastcall NewTerminals(TList * DataList);
+  TManagedTerminal * __fastcall NewManagedTerminal(TSessionData * Data);
+  TManagedTerminal * __fastcall NewTerminals(TList * DataList);
   virtual void __fastcall FreeTerminal(TTerminal * Terminal);
   void __fastcall Move(TTerminal * Source, TTerminal * Target);
   void __fastcall DisconnectActiveTerminal();
@@ -51,7 +51,7 @@ public:
   void __fastcall FreeActiveTerminal();
   void __fastcall CycleTerminals(bool Forward);
   bool __fastcall ConnectTerminal(TTerminal * Terminal);
-  void __fastcall SetActiveTerminalWithAutoReconnect(TTerminal * value);
+  void __fastcall SetActiveTerminalWithAutoReconnect(TManagedTerminal * value);
   void __fastcall UpdateAppTitle();
   bool __fastcall CanOpenInPutty();
   void __fastcall OpenInPutty();
@@ -69,22 +69,24 @@ public:
   bool __fastcall UploadPublicKey(TTerminal * Terminal, TSessionData * Data, UnicodeString & FileName);
 
   __property TCustomScpExplorerForm * ScpExplorer = { read = FScpExplorer, write = SetScpExplorer };
-  __property TTerminal * ActiveTerminal = { read = FActiveTerminal, write = SetActiveTerminal };
+  __property TManagedTerminal * ActiveTerminal = { read = FActiveTerminal, write = SetActiveTerminal };
   __property TTerminalQueue * ActiveQueue = { read = GetActiveQueue };
   __property int ActiveTerminalIndex = { read = GetActiveTerminalIndex, write = SetActiveTerminalIndex };
   __property TStrings * TerminalList = { read = GetTerminalList };
   __property TNotifyEvent OnLastTerminalClosed = { read = FOnLastTerminalClosed, write = FOnLastTerminalClosed };
   __property TNotifyEvent OnTerminalListChanged = { read = FOnTerminalListChanged, write = FOnTerminalListChanged };
   __property TTerminal * LocalTerminal = { read = FLocalTerminal };
+  __property TManagedTerminal * Terminals[int Index]  = { read=GetTerminal };
 
 protected:
   virtual TTerminal * __fastcall CreateTerminal(TSessionData * Data);
   void __fastcall DoConnectTerminal(TTerminal * Terminal, bool Reopen, bool AdHoc);
+  virtual TTerminal * __fastcall NewTerminal(TSessionData * Data);
 
 private:
   static TTerminalManager * FInstance;
   TCustomScpExplorerForm * FScpExplorer;
-  TTerminal * FActiveTerminal;
+  TManagedTerminal * FActiveTerminal;
   TTerminal * FLocalTerminal;
   bool FDestroying;
   TTerminalPendingAction FTerminalPendingAction;
@@ -114,8 +116,8 @@ private:
   bool __fastcall ConnectActiveTerminal();
   TTerminalQueue * __fastcall NewQueue(TTerminal * Terminal);
   void __fastcall SetScpExplorer(TCustomScpExplorerForm * value);
-  void __fastcall DoSetActiveTerminal(TTerminal * value, bool AutoReconnect);
-  void __fastcall SetActiveTerminal(TTerminal * value);
+  void __fastcall DoSetActiveTerminal(TManagedTerminal * value, bool AutoReconnect);
+  void __fastcall SetActiveTerminal(TManagedTerminal * value);
   void __fastcall UpdateAll();
   void __fastcall ApplicationException(TObject * Sender, Exception * E);
   void __fastcall ApplicationShowHint(UnicodeString & HintStr, bool & CanShow,
@@ -162,7 +164,7 @@ private:
   void __fastcall UpdateTaskbarList();
   void __fastcall AuthenticateFormCancel(TObject * Sender);
   void __fastcall DoTerminalListChanged();
-  TTerminal * __fastcall DoNewTerminal(TSessionData * Data);
+  TManagedTerminal * __fastcall DoNewTerminal(TSessionData * Data);
   static void __fastcall TerminalThreadIdle(void * Data, TObject * Sender);
   void __fastcall SetQueueConfiguration(TTerminalQueue * Queue);
   void __fastcall ApplicationModalBegin(TObject * Sender);
@@ -175,6 +177,8 @@ private:
   void __fastcall AuthenticatingDone();
   TRemoteFile * __fastcall CheckRights(
     TTerminal * Terminal, const UnicodeString & EntryType, const UnicodeString & FileName, bool & WrongRights);
+  TManagedTerminal * __fastcall CreateManagedTerminal(TSessionData * Data);
+  TManagedTerminal * __fastcall GetTerminal(int Index);
 };
 //---------------------------------------------------------------------------
 #endif

+ 3 - 4
source/windows/UserInterface.cpp

@@ -292,11 +292,10 @@ void __fastcall ShowExtendedExceptionEx(TTerminal * Terminal,
         if (ForActiveTerminal)
         {
           int SessionReopenTimeout = 0;
-          TManagedTerminal * ManagedTerminal = dynamic_cast<TManagedTerminal *>(Manager->ActiveTerminal);
-          if ((ManagedTerminal != NULL) &&
+          if (DebugAlwaysTrue(Manager->ActiveTerminal != NULL) &&
               ((Configuration->SessionReopenTimeout == 0) ||
-               ((double)ManagedTerminal->ReopenStart == 0) ||
-               (int(double(Now() - ManagedTerminal->ReopenStart) * MSecsPerDay) < Configuration->SessionReopenTimeout)))
+               ((double)Manager->ActiveTerminal->ReopenStart == 0) ||
+               (int(double(Now() - Manager->ActiveTerminal->ReopenStart) * MSecsPerDay) < Configuration->SessionReopenTimeout)))
           {
             SessionReopenTimeout = GUIConfiguration->SessionReopenAutoIdle;
           }

+ 2 - 3
source/windows/WinMain.cpp

@@ -1093,14 +1093,13 @@ int __fastcall Execute()
               bool CanStart;
               if (DataList->Count > 0)
               {
-                TTerminal * Terminal = TerminalManager->NewTerminals(DataList.get());
+                TManagedTerminal * Terminal = TerminalManager->NewTerminals(DataList.get());
                 if (!DownloadFile.IsEmpty())
                 {
                   Terminal->AutoReadDirectory = false;
                   DownloadFile = UnixIncludeTrailingBackslash(Terminal->SessionData->RemoteDirectory) + DownloadFile;
                   Terminal->SessionData->RemoteDirectory = L"";
-                  TManagedTerminal * ManagedTerminal = DebugNotNull(dynamic_cast<TManagedTerminal *>(Terminal));
-                  ManagedTerminal->StateData->RemoteDirectory = Terminal->SessionData->RemoteDirectory;
+                  Terminal->StateData->RemoteDirectory = Terminal->SessionData->RemoteDirectory;
                 }
                 TerminalManager->ActiveTerminal = Terminal;
                 CanStart = (TerminalManager->Count > 0);