//--------------------------------------------------------------------------- #include #pragma hdrstop #include "NonVisual.h" #include #include #include #include #include #include #include #include "WinConfiguration.h" #include "TerminalManager.h" #include "TBX.hpp" #include "VCLCommon.h" #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "TB2Item" #pragma link "TBX" #pragma link "TB2ExtItems" #pragma link "TBXExtItems" #pragma resource "*.dfm" TNonVisualDataModule *NonVisualDataModule; //--------------------------------------------------------------------------- #define SCPCOMMANDER ((TScpCommanderForm *)ScpExplorer) #define UPDEX(HandleAction, Condition, OtherEnabled, OtherDisabled) if (Action == HandleAction) { \ ((TCustomAction *)Action)->Enabled = (Condition); \ if (((TCustomAction *)Action)->Enabled) { OtherEnabled; } else { OtherDisabled; }; \ Handled = true; } else #define UPDEX1(HandleAction, Condition, Other) UPDEX(HandleAction, Condition, Other, Other) #define UPD(HandleAction, Condition) if (Action == HandleAction) { \ ((TCustomAction *)Action)->Enabled = (Condition); Handled = true; } else #define UPDFUNC(HandleAction, Function) if (Action == HandleAction) { Function; Handled = true; } else #define EXE(HandleAction, Command) if (Action == HandleAction) { \ Command; Handled = true; } else #define UPDACT(HandleAction, Command) \ EXE(HandleAction, ((TCustomAction *)Action)->Enabled = true; Command) #define UPDCOMP(COMP) if (Action == COMP ## Action) { COMP ## Action->Enabled = true; \ COMP ## Action->Checked = ScpExplorer->ComponentVisible[fc ## COMP]; Handled = true; } else #define EXECOMP(COMP) EXE(COMP ## Action, \ ScpExplorer->ComponentVisible[fc ## COMP] = !ScpExplorer->ComponentVisible[fc ## COMP] ) #define COLPROPS(SIDE) \ ((TCustomDirViewColProperties*)ScpExplorer->DirView(os ## SIDE)->ColProperties) #define UPDSORT(SIDE, PREFIX, COL) if (Action == SIDE ## SortBy ## COL ## Action) { \ SIDE ## SortBy ## COL ## Action->Enabled = true; Handled = true; \ SIDE ## SortBy ## COL ## Action->Checked = (COLPROPS(SIDE)->SortColumn == PREFIX ## COL); } else #define EXESORT(SIDE, PREFIX, COL) EXE(SIDE ## SortBy ## COL ## Action, \ if (COLPROPS(SIDE)->SortColumn == PREFIX ## COL) \ COLPROPS(SIDE)->SortAscending = !COLPROPS(SIDE)->SortAscending; \ else COLPROPS(SIDE)->SortColumn = PREFIX ## COL ) #define UPDSORTA(SIDE) if (Action == SIDE ## SortAscendingAction) { \ SIDE ## SortAscendingAction->Enabled = true; Handled = true; \ SIDE ## SortAscendingAction->Checked = COLPROPS(SIDE)->SortAscending; } else #define EXESORTA(SIDE) EXE(SIDE ## SortAscendingAction, \ COLPROPS(SIDE)->SortAscending = !COLPROPS(SIDE)->SortAscending; ) #define UPDSORTC(LPREFIX, LCOL, RPREFIX, RCOL) if (Action == CurrentSortBy ## RCOL ## Action) { \ CurrentSortBy ## RCOL ## Action->Enabled = ScpExplorer->AllowedAction((TAction *)Action, aaShortCut); \ if (CurrentSortBy ## RCOL ## Action->Enabled) { \ if (ScpExplorer->DirView(osCurrent) == ScpExplorer->DirView(osRemote)) \ CurrentSortBy ## RCOL ## Action->Checked = (COLPROPS(Current)->SortColumn == RPREFIX ## RCOL); \ else CurrentSortBy ## RCOL ## Action->Checked = (COLPROPS(Current)->SortColumn == LPREFIX ## LCOL); \ } else CurrentSortBy ## RCOL ## Action->Checked = false; Handled = true; } else #define EXESORTC(COL, LCOL, RCOL) \ EXE(CurrentSortBy ## COL ## Action, \ Integer NewSortCol = \ ((ScpExplorer->DirView(osCurrent) == ScpExplorer->DirView(osRemote)) ? RCOL : LCOL); \ if (COLPROPS(Current)->SortColumn == NewSortCol) \ COLPROPS(Current)->SortAscending = !COLPROPS(Current)->SortAscending; \ else COLPROPS(Current)->SortColumn = NewSortCol \ ) #define UPDSHCOL(SIDE, PREFIX, COL) \ EXE(ShowHide ## SIDE ## COL ## ColumnAction, \ ShowHide ## SIDE ## COL ## ColumnAction->Checked = COLPROPS(SIDE)->Visible[PREFIX ## COL]) #define EXESHCOL(SIDE, PREFIX, COL) \ EXE(ShowHide ## SIDE ## COL ## ColumnAction, \ COLPROPS(SIDE)->Visible[PREFIX ## COL] = !COLPROPS(SIDE)->Visible[PREFIX ## COL]) //--------------------------------------------------------------------------- __fastcall TNonVisualDataModule::TNonVisualDataModule(TComponent* Owner) : TDataModule(Owner) { InitSystemSettings(this); FListColumn = NULL; FSessionIdleTimerExecuting = false; FIdle = 0; // IDE often looses this link QueueSpeedComboBoxItem->OnAcceptText = QueueSpeedComboBoxItemAcceptText; } //--------------------------------------------------------------------------- __fastcall TNonVisualDataModule::~TNonVisualDataModule() { } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::LogActionsUpdate( TBasicAction *Action, bool &Handled) { TLogMemo * LogMemo = TTerminalManager::Instance()->LogMemo; bool ValidLogMemo = LogMemo && LogMemo->Parent; UPD(LogClearAction, ValidLogMemo && LogMemo->Lines->Count) // removed potentially CPU intensive check for "all selected already" UPD(LogSelectAllAction, ValidLogMemo && LogMemo->Lines->Count) UPD(LogCopyAction, ValidLogMemo && LogMemo->SelLength) UPD(LogCloseAction, Configuration->Logging && (WinConfiguration->LogView == lvWindow)) UPD(LogPreferencesAction, true) ; } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::LogActionsExecute( TBasicAction *Action, bool &Handled) { FIdle--; try { TLogMemo * LogMemo = TTerminalManager::Instance()->LogMemo; assert(LogMemo && LogMemo->Parent); EXE(LogClearAction, LogMemo->SessionLog->Clear()) EXE(LogSelectAllAction, LogMemo->SelectAll()) EXE(LogCopyAction, LogMemo->CopyToClipboard()) EXE(LogCloseAction, WinConfiguration->LogView = lvNone) EXE(LogPreferencesAction, PreferencesDialog(pmLogging)); ; } __finally { assert(FIdle < 0); FIdle++; } DoIdle(); } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::ExplorerActionsUpdate( TBasicAction *Action, bool &Handled) { if (!ScpExplorer || !ScpExplorer->AllowedAction((TAction *)Action, aaUpdate)) { ((TAction *)Action)->Enabled = false; Handled = true; return; } void * Param; // CURRENT DIRVIEW bool EnableSelectedOperation = ScpExplorer->EnableSelectedOperation[osCurrent]; bool EnableFocusedOperation = ScpExplorer->EnableFocusedOperation[osCurrent]; bool EnableSelectedFileOperation = ScpExplorer->EnableSelectedFileOperation[osCurrent]; bool EnableFocusedFileOperation = ScpExplorer->EnableFocusedFileOperation[osCurrent]; // focused operation UPD(CurrentCopyFocusedAction, EnableFocusedOperation) UPD(CurrentMoveFocusedAction, EnableFocusedOperation) UPD(CurrentDeleteFocusedAction, EnableFocusedOperation) UPD(CurrentPropertiesFocusedAction, EnableFocusedOperation) UPD(RemoteMoveToFocusedAction, EnableFocusedOperation && (DirView(osRemote) == DirView(osCurrent)) && ScpExplorer->Terminal->IsCapable[fcRemoteMove]) UPD(RemoteCopyToFocusedAction, EnableFocusedOperation && DirView(osRemote) == DirView(osCurrent)) UPD(CurrentEditFocusedAction, EnableFocusedFileOperation && !WinConfiguration->DisableOpenEdit) // file operation UPD(CurrentRenameAction, EnableFocusedOperation && ((ScpExplorer->HasDirView[osLocal] && DirView(osLocal) == DirView(osCurrent)) || ScpExplorer->Terminal->IsCapable[fcRename])) UPD(CurrentEditAction, EnableSelectedFileOperation && !WinConfiguration->DisableOpenEdit) UPD(CurrentEditAlternativeAction, EnableSelectedFileOperation && !WinConfiguration->DisableOpenEdit) UPD(CurrentOpenAction, EnableFocusedOperation && !WinConfiguration->DisableOpenEdit && !DirView(osCurrent)->ItemIsDirectory(DirView(osCurrent)->ItemFocused)) UPD(AddEditLinkAction, ScpExplorer->CanAddEditLink()) UPDEX1(AddEditLinkContextAction, ScpExplorer->CanAddEditLink(), ((TAction *)Action)->Visible = ScpExplorer->LinkFocused()) UPD(NewLinkAction, ScpExplorer->CanAddEditLink()) // selected operaton UPD(CurrentCopyAction, EnableSelectedOperation) UPD(RemoteCopyAction, ScpExplorer->EnableSelectedOperation[osRemote]) UPD(LocalCopyAction, ScpExplorer->HasDirView[osLocal] && ScpExplorer->EnableSelectedOperation[osLocal]) UPD(CurrentMoveAction, EnableSelectedOperation) UPD(CurrentDeleteAction, EnableSelectedOperation) UPD(CurrentDeleteAlternativeAction, EnableSelectedOperation) UPD(CurrentPropertiesAction, EnableSelectedOperation) UPD(RemoteMoveToAction, EnableSelectedOperation && (DirView(osRemote) == DirView(osCurrent)) && ScpExplorer->Terminal->IsCapable[fcRemoteMove]) UPD(RemoteCopyToAction, EnableSelectedOperation && (DirView(osRemote) == DirView(osCurrent))) UPD(FileListToCommandLineAction, EnableSelectedOperation) UPD(FileListToClipboardAction, EnableSelectedOperation) UPD(FullFileListToClipboardAction, EnableSelectedOperation) UPD(UrlToClipboardAction, EnableSelectedOperation && (DirView(osRemote) == DirView(osCurrent))) UPD(FileListFromClipboardAction, IsFormatInClipboard(CF_TEXT)); // directory UPD(CurrentCreateDirAction, true) UPD(NewDirAction, true) // selection UPD(SelectOneAction, DirView(osCurrent)->FilesCount) UPD(SelectAction, DirView(osCurrent)->FilesCount) UPD(UnselectAction, DirView(osCurrent)->SelCount) UPD(SelectAllAction, DirView(osCurrent)->FilesCount) UPD(InvertSelectionAction, DirView(osCurrent)->FilesCount) UPD(ClearSelectionAction, DirView(osCurrent)->SelCount) UPD(RestoreSelectionAction, DirView(osCurrent)->SelectedNamesSaved) UPD(PasteAction, ScpExplorer->CanPasteFromClipBoard()) //style UPDACT(CurrentCycleStyleAction, CurrentCycleStyleAction->ImageIndex = 8 + (DirView(osCurrent)->ViewStyle + 1) % 4) #define STYLEACTION(Style) UPDACT(Current ## Style ## Action, \ Current ## Style ## Action->Checked = (DirView(osCurrent)->ViewStyle == vs ## Style)) STYLEACTION(Icon) STYLEACTION(SmallIcon) STYLEACTION(List) STYLEACTION(Report) #undef STYLEACTION // REMOTE+LOCAL // back/forward #define HISTORYACTION(SIDE, DIRECTION, HINTFMT, DELTA) \ UPDEX(SIDE ## DIRECTION ## Action, (DirView(os ## SIDE)->DIRECTION ## Count > 0), \ SIDE ## DIRECTION ## Action->Hint = FMTLOAD(HINTFMT, (DirView(os ## SIDE)->HistoryPath[DELTA])), \ SIDE ## DIRECTION ## Action->Hint = "") HISTORYACTION(Local, Back, EXPLORER_BACK_HINT, -1) HISTORYACTION(Local, Forward, EXPLORER_FORWARD_HINT, 1) HISTORYACTION(Remote, Back, EXPLORER_BACK_HINT, -1) HISTORYACTION(Remote, Forward, EXPLORER_FORWARD_HINT, 1) #undef HISTORYACTION #define PANEL_ACTIONS(SIDE) \ UPD(SIDE ## ParentDirAction, !DirView(os ## SIDE)->IsRoot) \ UPD(SIDE ## RootDirAction, !DirView(os ## SIDE)->IsRoot) \ UPD(SIDE ## HomeDirAction, true) \ UPD(SIDE ## RefreshAction, DirView(os ## SIDE)->DirOK) \ UPD(SIDE ## OpenDirAction, true) \ UPD(SIDE ## ChangePathAction, true) \ UPD(SIDE ## AddBookmarkAction, true) \ UPD(SIDE ## PathToClipboardAction, true) PANEL_ACTIONS(Local) PANEL_ACTIONS(Remote) #undef PANEL_ACTIONS UPD(LocalExploreDirectoryAction, true) // HELP UPD(AboutAction, true) UPD(HomepageAction, true) UPD(HistoryPageAction, true) UPD(TableOfContentsAction, true) UPD(ForumPageAction, true) UPD(CheckForUpdatesAction, true) UPDACT(ShowUpdatesAction, ShowUpdatesUpdate()) UPD(UpdatesPreferencesAction, true) UPD(DonatePageAction, true) UPD(DownloadPageAction, true) // VIEW UPDCOMP(StatusBar) UPDCOMP(ToolBar) UPDCOMP(LocalStatusBar) UPDCOMP(RemoteStatusBar) UPDCOMP(CommandLinePanel) UPDCOMP(RemoteTree) UPDCOMP(LocalTree) UPDCOMP(ExplorerMenuBand) UPDCOMP(ExplorerAddressBand) UPDCOMP(ExplorerToolbarBand) UPDCOMP(ExplorerSelectionBand) UPDCOMP(ExplorerSessionBand) UPDCOMP(ExplorerPreferencesBand) UPDCOMP(ExplorerSortBand) UPDCOMP(ExplorerUpdatesBand) UPDCOMP(ExplorerTransferBand) UPDCOMP(ExplorerCustomCommandsBand) UPDCOMP(CommanderMenuBand) UPDCOMP(CommanderSessionBand) UPDCOMP(CommanderPreferencesBand) UPDCOMP(CommanderSelectionBand) UPDCOMP(CommanderToolbarBand) UPDCOMP(CommanderSortBand) UPDCOMP(CommanderCommandsBand) UPDCOMP(CommanderUpdatesBand) UPDCOMP(CommanderTransferBand) UPDCOMP(CommanderUploadDownloadBand) UPDCOMP(CommanderCustomCommandsBand) UPDCOMP(CommanderLocalHistoryBand) UPDCOMP(CommanderLocalNavigationBand) UPDCOMP(CommanderRemoteHistoryBand) UPDCOMP(CommanderRemoteNavigationBand) UPD(GoToCommandLineAction, true) UPD(GoToTreeAction, true) UPDEX(ViewLogAction, Configuration->Logging, ViewLogAction->Checked = (WinConfiguration->LogView == lvWindow), ViewLogAction->Checked = false ) UPDEX(ShowHiddenFilesAction, true, ShowHiddenFilesAction->Checked = WinConfiguration->ShowHiddenFiles, ) UPDEX(AutoReadDirectoryAfterOpAction, true, AutoReadDirectoryAfterOpAction->Checked = Configuration->AutoReadDirectoryAfterOp, ) UPD(PreferencesAction, true) UPD(PresetsPreferencesAction, true) UPDEX(LockToolbarsAction, true, LockToolbarsAction->Checked = WinConfiguration->LockToolbars, ) UPDCOMP(CustomCommandsBand) UPD(ColorMenuAction, true) UPDACT(ColorDefaultAction, ColorDefaultAction->Checked = (ScpExplorer->SessionColor == 0)); UPD(ColorPickAction, true); // SORT UPDSORTA(Local) UPDSORT(Local, dv, Name) UPDSORT(Local, dv, Ext) UPDSORT(Local, dv, Size) UPDSORT(Local, dv, Type) UPDSORT(Local, dv, Changed) UPDSORT(Local, dv, Attr) UPDSORTA(Remote) UPDSORT(Remote, uv, Name) UPDSORT(Remote, uv, Ext) UPDSORT(Remote, uv, Size) UPDSORT(Remote, uv, Changed) UPDSORT(Remote, uv, Rights) UPDSORT(Remote, uv, Owner) UPDSORT(Remote, uv, Group) UPDSORT(Remote, uv, Type) UPDSORTA(Current) UPDSORTC(dv, Name, uv, Name) UPDSORTC(dv, Ext, uv, Ext) UPDSORTC(dv, Size, uv, Size) UPDSORTC(dv, Type, uv, Type) UPDSORTC(dv, Changed, uv, Changed) UPDSORTC(dv, Attr, uv, Rights) UPDSORTC(dv, Name, uv, Owner) UPDSORTC(dv, Name, uv, Group) #define COLVIEWPROPS ((TCustomDirViewColProperties*)(((TCustomDirView*)(((TListColumns*)(ListColumn->Collection))->Owner()))->ColProperties)) UPDEX(SortColumnAscendingAction, (ListColumn != NULL), SortColumnAscendingAction->Checked = (COLVIEWPROPS->SortColumn == ListColumn->Index) && COLVIEWPROPS->SortAscending, /*assert(false)*/ ) UPDEX(SortColumnDescendingAction, (ListColumn != NULL), SortColumnDescendingAction->Checked = (COLVIEWPROPS->SortColumn == ListColumn->Index) && !COLVIEWPROPS->SortAscending, /*assert(false)*/ ) #undef COLVIEWPROPS // SHOW/HIDE COLUMN UPDSHCOL(Local, dv, Name) UPDSHCOL(Local, dv, Ext) UPDSHCOL(Local, dv, Size) UPDSHCOL(Local, dv, Type) UPDSHCOL(Local, dv, Changed) UPDSHCOL(Local, dv, Attr) UPDSHCOL(Remote, uv, Name) UPDSHCOL(Remote, uv, Ext) UPDSHCOL(Remote, uv, Size) UPDSHCOL(Remote, uv, Changed) UPDSHCOL(Remote, uv, Rights) UPDSHCOL(Remote, uv, Owner) UPDSHCOL(Remote, uv, Group) UPDSHCOL(Remote, uv, LinkTarget) UPDSHCOL(Remote, uv, Type) UPD(HideColumnAction, (ListColumn != NULL)) UPD(BestFitColumnAction, (ListColumn != NULL)) // SESSION UPD(NewSessionAction, true) UPD(DuplicateSessionAction, true) UPD(CloseSessionAction, true) UPD(SavedSessionsAction, (StoredSessions->Count > 0)) UPD(OpenedSessionsAction, true) UPD(SaveCurrentSessionAction, true) // COMMAND UPD(CompareDirectoriesAction, true) UPD(SynchronizeAction, true) UPD(FullSynchronizeAction, true) UPD(ConsoleAction, true) UPD(PuttyAction, TTerminalManager::Instance()->CanOpenInPutty()) UPD(SynchronizeBrowsingAction, true) UPD(CloseApplicationAction, true) UPD(FileSystemInfoAction, true) UPD(ClearCachesAction, (ScpExplorer->Terminal != NULL) && !ScpExplorer->Terminal->AreCachesEmpty) UPD(NewFileAction, !WinConfiguration->DisableOpenEdit) UPD(EditorListCustomizeAction, true) // CUSTOM COMMANDS UPD(CustomCommandsAction, true) UPD(CustomCommandsEnterAction, true) UPD(CustomCommandsEnterFocusedAction, true) UPDFUNC(CustomCommandsLastAction, CustomCommandsLastUpdate(CustomCommandsLastAction)) UPDFUNC(CustomCommandsLastFocusedAction, CustomCommandsLastUpdate(CustomCommandsLastFocusedAction)) UPD(CustomCommandsCustomizeAction, true) // QUEUE #define UPDQUEUE(OPERATION) UPD(Queue ## OPERATION ## Action, \ ScpExplorer->AllowQueueOperation(qo ## OPERATION)) UPDQUEUE(GoTo) UPDQUEUE(Preferences) UPDEX(QueueItemQueryAction, ScpExplorer->AllowQueueOperation(qoItemQuery), ((TAction *)Action)->Visible = true, ((TAction *)Action)->Visible = false) UPDEX(QueueItemErrorAction, ScpExplorer->AllowQueueOperation(qoItemError), ((TAction *)Action)->Visible = true, ((TAction *)Action)->Visible = false) UPDEX(QueueItemPromptAction, ScpExplorer->AllowQueueOperation(qoItemPrompt), ((TAction *)Action)->Visible = true, ((TAction *)Action)->Visible = false) UPDQUEUE(ItemDelete) UPDEX(QueueItemExecuteAction, ScpExplorer->AllowQueueOperation(qoItemExecute), ((TAction *)Action)->Visible = true, ((TAction *)Action)->Visible = !ScpExplorer->AllowQueueOperation(qoItemPause) && !ScpExplorer->AllowQueueOperation(qoItemResume)) UPDEX(QueueItemPauseAction, ScpExplorer->AllowQueueOperation(qoItemPause), ((TAction *)Action)->Visible = true, ((TAction *)Action)->Visible = false) UPDEX(QueueItemResumeAction, ScpExplorer->AllowQueueOperation(qoItemResume), ((TAction *)Action)->Visible = true, ((TAction *)Action)->Visible = false) UPDQUEUE(ItemUp) UPDQUEUE(ItemDown) UPDQUEUE(PauseAll) UPDQUEUE(ResumeAll) #undef UPDQUEUE UPDEX(QueueItemSpeedAction, ScpExplorer->AllowQueueOperation(qoItemSpeed, &Param), QueueItemSpeedAction->Text = SetSpeedLimit(reinterpret_cast(Param)), QueueItemSpeedAction->Text = "") UPDACT(QueueToggleShowAction, ((TAction *)Action)->Checked = ScpExplorer->ComponentVisible[fcQueueView]) #define QUEUEACTION(SHOW) UPDACT(Queue ## SHOW ## Action, \ ((TAction *)Action)->Checked = WinConfiguration->QueueView.Show == qv ## SHOW) QUEUEACTION(Show) QUEUEACTION(HideWhenEmpty) QUEUEACTION(Hide) #undef QUEUEACTION UPD(QueueDisconnectOnceEmptyAction, ScpExplorer->AllowQueueOperation(qoDisconnectOnceEmpty)) UPDCOMP(CommanderPreferencesBand) UPDACT(QueueToolbarAction, ((TAction *)Action)->Enabled = ScpExplorer->ComponentVisible[fcQueueView]; ((TAction *)Action)->Checked = ScpExplorer->ComponentVisible[fcQueueToolbar]) ; } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::ExplorerActionsExecute( TBasicAction *Action, bool &Handled) { assert(ScpExplorer); if (!ScpExplorer->AllowedAction((TAction *)Action, aaExecute)) { Handled = true; return; } ScpExplorer->BeforeAction(); FIdle--; try { // focused operation EXE(CurrentCopyFocusedAction, ScpExplorer->ExecuteFileOperation(foCopy, osCurrent, true)) EXE(CurrentMoveFocusedAction, ScpExplorer->ExecuteFileOperation(foMove, osCurrent, true)) EXE(CurrentDeleteFocusedAction, ScpExplorer->ExecuteFileOperation(foDelete, osCurrent, true)) EXE(CurrentPropertiesFocusedAction, ScpExplorer->ExecuteFileOperation(foSetProperties, osCurrent, true)) EXE(RemoteMoveToFocusedAction, ScpExplorer->ExecuteFileOperation(foRemoteMove, osCurrent, true)) EXE(RemoteCopyToFocusedAction, ScpExplorer->ExecuteFileOperation(foRemoteCopy, osCurrent, true)) EXE(CurrentEditFocusedAction, ScpExplorer->ExecuteFile(osCurrent, efDefaultEditor, NULL, true, true)) // operation EXE(CurrentCopyAction, ScpExplorer->ExecuteFileOperation(foCopy, osCurrent, false)) EXE(RemoteCopyAction, ScpExplorer->ExecuteFileOperation(foCopy, osRemote, false)) EXE(LocalCopyAction, ScpExplorer->ExecuteFileOperation(foCopy, osLocal, false)) EXE(CurrentMoveAction, ScpExplorer->ExecuteFileOperation(foMove, osCurrent, false)) EXE(CurrentEditAction, ScpExplorer->ExecuteFile(osCurrent, efDefaultEditor, NULL, true, false)) EXE(CurrentEditAlternativeAction, CreateEditorListMenu(CurrentEditAlternativeAction)) EXE(CurrentOpenAction, ScpExplorer->ExecuteCurrentFile()) EXE(AddEditLinkAction, ScpExplorer->AddEditLink(false)) EXE(AddEditLinkContextAction, ScpExplorer->AddEditLink(false)) EXE(NewLinkAction, ScpExplorer->AddEditLink(true)) EXE(CurrentRenameAction, ScpExplorer->ExecuteFileOperation(foRename, osCurrent, false)) EXE(CurrentDeleteAction, ScpExplorer->ExecuteFileOperation(foDelete, osCurrent, false)) EXE(CurrentDeleteAlternativeAction, ScpExplorer->ExecuteFileOperation(foDelete, osCurrent, false, false, (void*)true)) EXE(CurrentPropertiesAction, ScpExplorer->ExecuteFileOperation(foSetProperties, osCurrent, false)) EXE(RemoteMoveToAction, ScpExplorer->ExecuteFileOperation(foRemoteMove, osCurrent, false)) EXE(RemoteCopyToAction, ScpExplorer->ExecuteFileOperation(foRemoteCopy, osCurrent, false)) EXE(FileListToCommandLineAction, ScpExplorer->PanelExport(osCurrent, peFileList, pedCommandLine)) EXE(FileListToClipboardAction, ScpExplorer->PanelExport(osCurrent, peFileList, pedClipboard)) EXE(FullFileListToClipboardAction, ScpExplorer->PanelExport(osCurrent, peFullFileList, pedClipboard)) EXE(UrlToClipboardAction, ScpExplorer->PanelExport(osCurrent, peUrl, pedClipboard)) EXE(FileListFromClipboardAction, ScpExplorer->FileListFromClipboard()) // directory EXE(CurrentCreateDirAction, ScpExplorer->CreateDirectory(osCurrent)) EXE(NewDirAction, ScpExplorer->CreateDirectory(osCurrent)) //selection EXE(SelectOneAction, DirView(osCurrent)->SelectCurrentItem(DirView(osCurrent)->NortonLike)) EXE(SelectAction, DirView(osCurrent)->DoSelectByMask(true)) EXE(UnselectAction, DirView(osCurrent)->DoSelectByMask(false)) EXE(SelectAllAction, DirView(osCurrent)->SelectAll(smAll)) EXE(InvertSelectionAction, DirView(osCurrent)->SelectAll(smInvert)) EXE(ClearSelectionAction, DirView(osCurrent)->SelectAll(smNone)) EXE(RestoreSelectionAction, DirView(osCurrent)->RestoreSelectedNames()) EXE(PasteAction, ScpExplorer->PasteFromClipBoard()) // style EXE(CurrentCycleStyleAction, if (DirView(osCurrent)->ViewStyle == vsReport) DirView(osCurrent)->ViewStyle = vsIcon; else DirView(osCurrent)->ViewStyle = (TViewStyle)(DirView(osCurrent)->ViewStyle + 1); ) #define STYLEACTION(Style) EXE(Current ## Style ## Action, \ DirView(osCurrent)->ViewStyle = vs ## Style) STYLEACTION(Icon) STYLEACTION(SmallIcon) STYLEACTION(List) STYLEACTION(Report) #undef STYLEACTION #define PANEL_ACTIONS(SIDE) \ EXE(SIDE ## BackAction, DirView(os ## SIDE)->HistoryGo(-1)) \ EXE(SIDE ## ForwardAction, DirView(os ## SIDE)->HistoryGo(1)) \ EXE(SIDE ## ParentDirAction, DirView(os ## SIDE)->ExecuteParentDirectory()) \ EXE(SIDE ## RootDirAction, DirView(os ## SIDE)->ExecuteRootDirectory()) \ EXE(SIDE ## HomeDirAction, ScpExplorer->HomeDirectory(os ## SIDE)) \ EXE(SIDE ## RefreshAction, DirView(os ## SIDE)->ReloadDirectory()) \ EXE(SIDE ## OpenDirAction, ScpExplorer->OpenDirectory(os ## SIDE)) \ EXE(SIDE ## ChangePathAction, ScpExplorer->ChangePath(os ## SIDE)) \ EXE(SIDE ## AddBookmarkAction, ScpExplorer->AddBookmark(os ## SIDE)) \ EXE(SIDE ## PathToClipboardAction, ScpExplorer->PanelExport(os ## SIDE, pePath, pedClipboard)) PANEL_ACTIONS(Local) PANEL_ACTIONS(Remote) #undef PANEL_ACTIONS EXE(LocalExploreDirectoryAction, ScpExplorer->ExploreLocalDirectory()) //HELP EXE(AboutAction, DoAboutDialog(Configuration)) EXE(HomepageAction, OpenBrowser(LoadStr(HOMEPAGE_URL))) EXE(HistoryPageAction, OpenBrowser(LoadStr(HISTORY_URL))) EXE(TableOfContentsAction, Application->HelpSystem->ShowTableOfContents()) EXE(ForumPageAction, OpenBrowser(LoadStr(FORUM_URL))) EXE(CheckForUpdatesAction, CheckForUpdates(false)) EXE(ShowUpdatesAction, CheckForUpdates(true)) EXE(UpdatesPreferencesAction, PreferencesDialog(pmUpdates)) EXE(DonatePageAction, OpenBrowser(LoadStr(DONATE_URL))) EXE(DownloadPageAction, OpenBrowser(LoadStr(DOWNLOAD_URL))) // VIEW EXECOMP(StatusBar) EXECOMP(ToolBar) EXECOMP(LocalStatusBar) EXECOMP(RemoteStatusBar) EXECOMP(ExplorerMenuBand) EXECOMP(ExplorerAddressBand) EXECOMP(ExplorerToolbarBand) EXECOMP(ExplorerSelectionBand) EXECOMP(ExplorerSessionBand) EXECOMP(ExplorerPreferencesBand) EXECOMP(ExplorerSortBand) EXECOMP(ExplorerUpdatesBand) EXECOMP(ExplorerTransferBand) EXECOMP(ExplorerCustomCommandsBand) EXECOMP(CommanderMenuBand) EXECOMP(CommanderSessionBand) EXECOMP(CommanderPreferencesBand) EXECOMP(CommanderSelectionBand) EXECOMP(CommanderToolbarBand) EXECOMP(CommanderSortBand) EXECOMP(CommanderCommandsBand) EXECOMP(CommanderUpdatesBand) EXECOMP(CommanderTransferBand) EXECOMP(CommanderUploadDownloadBand) EXECOMP(CommanderCustomCommandsBand) EXECOMP(CommanderLocalHistoryBand) EXECOMP(CommanderLocalNavigationBand) EXECOMP(CommanderRemoteHistoryBand) EXECOMP(CommanderRemoteNavigationBand) EXECOMP(CommandLinePanel) EXECOMP(RemoteTree) EXECOMP(LocalTree) EXE(GoToCommandLineAction, ScpExplorer->GoToCommandLine()) EXE(GoToTreeAction, ScpExplorer->GoToTree()) EXE(ViewLogAction, WinConfiguration->LogView = (WinConfiguration->LogView == lvNone ? lvWindow : lvNone) ) EXE(ShowHiddenFilesAction, ScpExplorer->ToggleShowHiddenFiles()) EXE(AutoReadDirectoryAfterOpAction, ScpExplorer->ToggleAutoReadDirectoryAfterOp()) EXE(PreferencesAction, PreferencesDialog(pmDefault) ) EXE(PresetsPreferencesAction, PreferencesDialog(pmPresets) ) EXE(LockToolbarsAction, WinConfiguration->LockToolbars = !WinConfiguration->LockToolbars) EXECOMP(CustomCommandsBand) EXE(ColorMenuAction, ); EXE(ColorDefaultAction, ScpExplorer->SessionColor = (TColor)0); EXE(ColorPickAction, ScpExplorer->SessionColorPick()); #define COLVIEWPROPS ((TCustomDirViewColProperties*)(((TCustomDirView*)(((TListColumns*)(ListColumn->Collection))->Owner()))->ColProperties)) // SORT EXESORTA(Local) EXESORT(Local, dv, Name) EXESORT(Local, dv, Ext) EXESORT(Local, dv, Size) EXESORT(Local, dv, Type) EXESORT(Local, dv, Changed) EXESORT(Local, dv, Attr) EXESORTA(Remote) EXESORT(Remote, uv, Name) EXESORT(Remote, uv, Ext) EXESORT(Remote, uv, Size) EXESORT(Remote, uv, Changed) EXESORT(Remote, uv, Rights) EXESORT(Remote, uv, Owner) EXESORT(Remote, uv, Group) EXESORT(Remote, uv, Type) EXESORTA(Current) EXESORTC(Name, dvName, uvName) EXESORTC(Ext, dvExt, uvExt) EXESORTC(Size, dvSize, uvSize) EXESORTC(Type, dvType, uvType) EXESORTC(Changed, dvChanged, uvChanged) EXESORTC(Rights, dvAttr, uvRights) EXESORTC(Owner, dvName, uvOwner) EXESORTC(Group, dvName, uvGroup) EXE(SortColumnAscendingAction, assert(ListColumn); COLVIEWPROPS->SortColumn = ListColumn->Index; COLVIEWPROPS->SortAscending = true; ListColumn = NULL ) EXE(SortColumnDescendingAction, assert(ListColumn); COLVIEWPROPS->SortColumn = ListColumn->Index; COLVIEWPROPS->SortAscending = false; ListColumn = NULL ) // SHOW/HIDE COLUMN EXESHCOL(Local, dv, Name) EXESHCOL(Local, dv, Ext) EXESHCOL(Local, dv, Size) EXESHCOL(Local, dv, Type) EXESHCOL(Local, dv, Changed) EXESHCOL(Local, dv, Attr) EXESHCOL(Remote, uv, Name) EXESHCOL(Remote, uv, Ext) EXESHCOL(Remote, uv, Size) EXESHCOL(Remote, uv, Changed) EXESHCOL(Remote, uv, Rights) EXESHCOL(Remote, uv, Owner) EXESHCOL(Remote, uv, Group) EXESHCOL(Remote, uv, LinkTarget) EXESHCOL(Remote, uv, Type) EXE(HideColumnAction, assert(ListColumn); COLVIEWPROPS->Visible[ListColumn->Index] = false; ListColumn = NULL ) EXE(BestFitColumnAction, assert(ListColumn); ListColumn = NULL ) // TODO #undef COLVIEWPROPS // SESSION EXE(NewSessionAction, ScpExplorer->NewSession()) EXE(DuplicateSessionAction, ScpExplorer->DuplicateSession()) EXE(CloseSessionAction, ScpExplorer->CloseSession()) EXE(SavedSessionsAction, CreateSessionListMenu(SavedSessionsAction)) EXE(OpenedSessionsAction, CreateOpenedSessionListMenu(OpenedSessionsAction)) EXE(SaveCurrentSessionAction, ScpExplorer->SaveCurrentSession()) // COMMAND EXE(CompareDirectoriesAction, ScpExplorer->CompareDirectories()) EXE(SynchronizeAction, ScpExplorer->SynchronizeDirectories()) EXE(FullSynchronizeAction, ScpExplorer->FullSynchronizeDirectories()) EXE(ConsoleAction, ScpExplorer->OpenConsole()) EXE(PuttyAction, TTerminalManager::Instance()->OpenInPutty()) EXE(SynchronizeBrowsingAction, ScpExplorer->SynchronizeBrowsingChanged()) EXE(CloseApplicationAction, ScpExplorer->Close()) EXE(FileSystemInfoAction, ScpExplorer->FileSystemInfo()) EXE(ClearCachesAction, ScpExplorer->Terminal->ClearCaches()) EXE(NewFileAction, ScpExplorer->EditNew(osCurrent)) EXE(EditorListCustomizeAction, PreferencesDialog(pmEditor)) // CUSTOM COMMANDS EXE(CustomCommandsAction, CreateCustomCommandsMenu(CustomCommandsAction)) EXE(CustomCommandsEnterAction, ScpExplorer->AdHocCustomCommand(false)) EXE(CustomCommandsEnterFocusedAction, ScpExplorer->AdHocCustomCommand(true)) EXE(CustomCommandsLastAction, ScpExplorer->LastCustomCommand(false)) EXE(CustomCommandsLastFocusedAction, ScpExplorer->LastCustomCommand(true)) EXE(CustomCommandsCustomizeAction, PreferencesDialog(pmCustomCommands)) // QUEUE #define EXEQUEUE(OPERATION) EXE(Queue ## OPERATION ## Action, \ ScpExplorer->ExecuteQueueOperation(qo ## OPERATION)) EXEQUEUE(GoTo) EXEQUEUE(Preferences) EXEQUEUE(ItemQuery) EXEQUEUE(ItemError) EXEQUEUE(ItemPrompt) EXEQUEUE(ItemDelete) EXEQUEUE(ItemExecute) EXEQUEUE(ItemPause) EXEQUEUE(ItemResume) EXEQUEUE(ItemUp) EXEQUEUE(ItemDown) EXEQUEUE(PauseAll) EXEQUEUE(ResumeAll) #undef EXEQUEUE EXE(QueueToggleShowAction, ScpExplorer->ToggleQueueVisibility()) #define QUEUEACTION(SHOW) EXE(Queue ## SHOW ## Action, \ TQueueViewConfiguration Config = WinConfiguration->QueueView; \ if (Config.Show != qvShow) Config.LastHideShow = Config.Show; \ Config.Show = qv ## SHOW; \ WinConfiguration->QueueView = Config) QUEUEACTION(Show) QUEUEACTION(HideWhenEmpty) QUEUEACTION(Hide) #undef QUEUEACTION EXE(QueueDisconnectOnceEmptyAction, ) EXECOMP(QueueToolbar); EXE(QueueItemSpeedAction, ) ; } __finally { assert(FIdle < 0); FIdle++; } DoIdle(); } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::UpdateNonVisibleActions() { // following actions needs to be updated even when all clients // are invisible, so the queue list toolbar button can be shown NonVisualDataModule->QueueItemQueryAction->Update(); NonVisualDataModule->QueueItemErrorAction->Update(); NonVisualDataModule->QueueItemPromptAction->Update(); } //--------------------------------------------------------------------------- #define CTRL TShiftState() << ssCtrl #define ALT TShiftState() << ssAlt #define SHIFT TShiftState() << ssShift #define CTRLSHIFT TShiftState() << ssCtrl << ssShift #define CTRLALT TShiftState() << ssCtrl << ssAlt #define NONE TShiftState() void __fastcall TNonVisualDataModule::ExplorerShortcuts() { // Directory CurrentCreateDirAction->ShortCut = ShortCut('D', CTRL); NewDirAction->ShortCut = CurrentCreateDirAction->ShortCut; // File operation CurrentRenameAction->ShortCut = ShortCut(VK_F2, NONE); CurrentEditAction->ShortCut = ShortCut('E', CTRL); AddEditLinkAction->ShortCut = ShortCut('L', CTRLALT); AddEditLinkContextAction->ShortCut = AddEditLinkAction->ShortCut; // Focused operation CurrentCopyFocusedAction->ShortCut = ShortCut('C', CTRL); CurrentMoveFocusedAction->ShortCut = ShortCut('M', CTRL); CurrentDeleteFocusedAction->ShortCut = ShortCut(VK_DELETE, NONE); CurrentPropertiesFocusedAction->ShortCut = ShortCut(VK_RETURN, ALT); RemoteMoveToFocusedAction->ShortCut = ShortCut('M', CTRLALT); // remote directory RemoteOpenDirAction->ShortCut = ShortCut('O', CTRL); RemoteRefreshAction->ShortCut = ShortCut(VK_F5, NONE); RemoteHomeDirAction->ShortCut = ShortCut('H', CTRL); RemotePathToClipboardAction->ShortCut = ShortCut('P', CTRLSHIFT); // selected operation CurrentCopyAction->ShortCut = CurrentCopyFocusedAction->ShortCut; CurrentMoveAction->ShortCut = CurrentMoveFocusedAction->ShortCut; CurrentDeleteAction->ShortCut = CurrentDeleteFocusedAction->ShortCut; CurrentDeleteAlternativeAction->ShortCut = ShortCut(VK_DELETE, SHIFT); CurrentPropertiesAction->ShortCut = CurrentPropertiesFocusedAction->ShortCut; RemoteMoveToAction->ShortCut = ShortCut('M', CTRLALT); // selection SelectAction->ShortCut = ShortCut(VK_ADD, NONE); UnselectAction->ShortCut = ShortCut(VK_SUBTRACT, NONE); SelectAllAction->ShortCut = ShortCut('A', CTRL); InvertSelectionAction->ShortCut = ShortCut(VK_MULTIPLY, NONE); ClearSelectionAction->ShortCut = ShortCut('L', CTRL); RestoreSelectionAction->ShortCut = ShortCut('R', CTRLALT); // commands NewFileAction->ShortCut = ShortCut('E', CTRLSHIFT); CloseApplicationAction->ShortCut = ShortCut(VK_F4, ALT); } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::CommanderShortcuts() { // Directory CurrentCreateDirAction->ShortCut = ShortCut(VK_F7, NONE); NewDirAction->ShortCut = CurrentCreateDirAction->ShortCut; // File operation CurrentRenameAction->ShortCut = ShortCut(VK_F2, NONE); CurrentEditAction->ShortCut = ShortCut(VK_F4, NONE); AddEditLinkAction->ShortCut = ShortCut(VK_F6, ALT); AddEditLinkContextAction->ShortCut = AddEditLinkAction->ShortCut; // Focused operation CurrentCopyFocusedAction->ShortCut = ShortCut(VK_F5, NONE); CurrentMoveFocusedAction->ShortCut = ShortCut(VK_F6, NONE); CurrentDeleteFocusedAction->ShortCut = ShortCut(VK_F8, NONE); CurrentPropertiesFocusedAction->ShortCut = ShortCut(VK_F9, NONE); RemoteMoveToFocusedAction->ShortCut = ShortCut(VK_F6, SHIFT); RemoteCopyToFocusedAction->ShortCut = ShortCut(VK_F5, SHIFT); // remote directory RemoteOpenDirAction->ShortCut = ShortCut('O', CTRL); RemoteRefreshAction->ShortCut = ShortCut('R', CTRL); RemoteHomeDirAction->ShortCut = ShortCut('H', CTRL); RemotePathToClipboardAction->ShortCut = ShortCut(VK_OEM_6 /* ] */, CTRL); // local directory LocalOpenDirAction->ShortCut = RemoteOpenDirAction->ShortCut; LocalRefreshAction->ShortCut = RemoteRefreshAction->ShortCut; LocalHomeDirAction->ShortCut = RemoteHomeDirAction->ShortCut; LocalPathToClipboardAction->ShortCut = ShortCut(VK_OEM_4 /* [ */, CTRL); // selected operation CurrentCopyAction->ShortCut = CurrentCopyFocusedAction->ShortCut; CurrentMoveAction->ShortCut = CurrentMoveFocusedAction->ShortCut; CurrentDeleteAction->ShortCut = CurrentDeleteFocusedAction->ShortCut; CurrentDeleteAction->SecondaryShortCuts->Clear(); CurrentDeleteAction->SecondaryShortCuts->Add(ShortCutToText(ShortCut(VK_DELETE, NONE))); CurrentDeleteAlternativeAction->ShortCut = ShortCut(VK_F8, SHIFT); CurrentDeleteAlternativeAction->SecondaryShortCuts->Clear(); CurrentDeleteAlternativeAction->SecondaryShortCuts->Add(ShortCutToText(ShortCut(VK_DELETE, SHIFT))); CurrentPropertiesAction->ShortCut = CurrentPropertiesFocusedAction->ShortCut; RemoteMoveToAction->ShortCut = ShortCut(VK_F6, SHIFT); RemoteCopyToAction->ShortCut = ShortCut(VK_F5, SHIFT); // selection SelectOneAction->ShortCut = VK_INSERT; SelectAction->ShortCut = ShortCut(VK_ADD, NONE); UnselectAction->ShortCut = ShortCut(VK_SUBTRACT, NONE); SelectAllAction->ShortCut = ShortCut('A', CTRL); InvertSelectionAction->ShortCut = ShortCut(VK_MULTIPLY, NONE); ClearSelectionAction->ShortCut = ShortCut('L', CTRL); RestoreSelectionAction->ShortCut = ShortCut('R', CTRLALT); // commands NewFileAction->ShortCut = ShortCut(VK_F4, SHIFT); // legacy shortcut (can be removed when necessary) NewFileAction->SecondaryShortCuts->Add(ShortCutToText(ShortCut(VK_F4, CTRLSHIFT))); CloseApplicationAction->ShortCut = ShortCut(VK_F10, NONE); } #undef CTRL #undef ALT #undef NONE //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::SetScpExplorer(TCustomScpExplorerForm * value) { FScpExplorer = value; SessionIdleTimer->Enabled = (FScpExplorer != NULL); } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::SessionIdleTimerTimer( TObject */*Sender*/) { DoIdle(); } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::DoIdle() { if (!FSessionIdleTimerExecuting) { FSessionIdleTimerExecuting = true; try { assert(ScpExplorer); ScpExplorer->Idle(FIdle >= 0); } __finally { FSessionIdleTimerExecuting = false; } } } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::CreateCustomCommandsMenu( TTBCustomItem * Menu, bool OnFocused, bool Toolbar) { for (int Index = 0; Index < WinConfiguration->CustomCommands->Count; Index++) { AnsiString Description = WinConfiguration->CustomCommands->Names[Index]; int State = ScpExplorer->CustomCommandState(Description, OnFocused); if (State >= 0) { TTBCustomItem * Item = new TTBXItem(Owner); Item->Caption = Description; if (Toolbar) { Item->Caption = StripHotkey(Item->Caption); } Item->Tag = Index; Item->Enabled = (State > 0); if (OnFocused) { Item->Tag = Item->Tag | 0x0100; } Item->Hint = FMTLOAD(CUSTOM_COMMAND_HINT, (StripHotkey(Description))); Item->OnClick = CustomCommandClick; Menu->Add(Item); } } TTBCustomItem * Item; Item = new TTBXItem(Menu); Item->Action = OnFocused ? CustomCommandsEnterFocusedAction : CustomCommandsEnterAction; Menu->Add(Item); Item = new TTBXItem(Menu); Item->Action = OnFocused ? CustomCommandsLastFocusedAction : CustomCommandsLastAction; if (Toolbar) { Item->Caption = StripHotkey(LoadStr(CUSTOM_COMMAND_LAST_SHORT)); } Menu->Add(Item); AddMenuSeparator(Menu); if (!Toolbar) { Item = new TTBXItem(Menu); Item->Action = CustomCommandsBandAction; Menu->Add(Item); } Item = new TTBXItem(Menu); Item->Action = CustomCommandsCustomizeAction; Menu->Add(Item); } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::CreateCustomCommandsMenu(TAction * Action) { assert(Action); TTBCustomItem * Menu = dynamic_cast(Action->ActionComponent); if (Menu) { int PrevCount = Menu->Count; bool OnFocused = (Menu == RemoteDirViewCustomCommandsMenu); CreateCustomCommandsMenu(Menu, OnFocused, false); for (int Index = 0; Index < PrevCount; Index++) { Menu->Delete(0); } } } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::UpdateCustomCommandsToolbar(TTBXToolbar * Toolbar) { // can be called while explorer is being created if (ScpExplorer == NULL) { return; } int AdditionalCommands = 4; TCustomCommands * CustomCommands = WinConfiguration->CustomCommands; bool Changed = (CustomCommands->Count != (Toolbar->Items->Count - AdditionalCommands)); if (!Changed) { int Index = 0; while (!Changed && (Index < CustomCommands->Count)) { Changed = (Toolbar->Items->Items[Index]->Caption != StripHotkey(CustomCommands->Names[Index])); Index++; } } if (Changed) { Toolbar->BeginUpdate(); try { Toolbar->Items->Clear(); CreateCustomCommandsMenu(Toolbar->Items, false, true); assert(CustomCommands->Count == (Toolbar->Items->Count - AdditionalCommands)); } __finally { Toolbar->EndUpdate(); } } else { for (int Index = 0; Index < Toolbar->Items->Count - AdditionalCommands; Index++) { TTBCustomItem * Item = Toolbar->Items->Items[Index]; int CommandIndex = (Item->Tag & 0x00FF); assert(CommandIndex == Index); AnsiString Description = WinConfiguration->CustomCommands->Names[CommandIndex]; int State = ScpExplorer->CustomCommandState(Description, false); assert(State >= 0); Item->Enabled = (State > 0); } } } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::CustomCommandClick(TObject * Sender) { TTBCustomItem * Item = dynamic_cast(Sender); assert(Item); TCustomCommandParam Param; Param.Name = WinConfiguration->CustomCommands->Names[Item->Tag & 0x00FF]; Param.Command = WinConfiguration->CustomCommands->Values[Param.Name]; Param.Params = WinConfiguration->CustomCommands->Params[Param.Name]; ScpExplorer->ExecuteFileOperation(foCustomCommand, osRemote, (Item->Tag & 0xFF00) != 0, false, &Param); } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::CreateSessionListMenu(TAction * Action) { StoredSessions->Load(); if (StoredSessions->Count == 0) { Abort(); } else { CreateSessionListMenuLevel( dynamic_cast(Action->ActionComponent), 0, 0); } } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::CreateSessionListMenuLevel( TTBCustomItem * Menu, int Index, int Level) { assert(Index < StoredSessions->Count); TSessionData * Data = StoredSessions->Sessions[Index]; AnsiString Path = Data->Name; AnsiString Root; for (int ALevel = 0; ALevel < Level; ALevel++) { Root.Insert(::CutToChar(Path, '/', false) + '/', Root.Length() + 1); } Menu->Clear(); int FirstSession = 0; AnsiString PrevName; while (Index < StoredSessions->Count) { TSessionData * Data = StoredSessions->Sessions[Index]; if (!AnsiSameText(Data->Name.SubString(1, Root.Length()), Root)) { break; } else { AnsiString Name = Data->Name.SubString(Root.Length() + 1, Data->Name.Length() - Root.Length()); int P = Name.Pos('/'); if (P > 0) { Name.SetLength(P - 1); } if (Name != PrevName) { if (P > 0) { TTBCustomItem * Item = new TTBXSubmenuItem(Menu); Item->Caption = Name; Item->Tag = ((Level + 1) << 16) | Index; // MAKELONG Item->Hint = FMTLOAD(SAVEDSESSIONFOLDER_HINT, (Root + Name)); Item->ImageIndex = SavedSessionsAction->ImageIndex; Item->OnClick = SessionFolderItemClick; Menu->Insert(FirstSession, Item); FirstSession++; } else { TTBCustomItem * Item = new TTBXItem(Menu); Item->Caption = Name; Item->Tag = Index; Item->Hint = FMTLOAD(SAVEDSESSION_HINT, (Data->Name)); Item->OnClick = SessionItemClick; Menu->Insert(Menu->Count, Item); } PrevName = Name; } } Index++; } } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::SessionFolderItemClick(TObject * Sender) { TTBCustomItem * Item = dynamic_cast(Sender); assert(Item != NULL); CreateSessionListMenuLevel(Item, LOWORD(Item->Tag), HIWORD(Item->Tag)); } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::SessionItemClick(TObject * Sender) { assert(StoredSessions && (((TMenuItem *)Sender)->Tag < StoredSessions->Count)); ScpExplorer->OpenStoredSession(StoredSessions->Sessions[((TMenuItem *)Sender)->Tag]); } //--------------------------------------------------------------------------- TShortCut __fastcall TNonVisualDataModule::OpenSessionShortCut(int Index) { if (Index >= 0 && Index < 10) { return ShortCut((Word)(Index < 9 ? '0' + 1 + Index : '0'), TShiftState() << ssAlt); } else { return scNone; } } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::CreateOpenedSessionListMenu(TAction * Action) { TTBCustomItem * OpenedSessionsMenu = dynamic_cast(Action->ActionComponent); assert(OpenedSessionsMenu != NULL); TTerminalManager * Manager = TTerminalManager::Instance(); TStrings * TerminalList = Manager->TerminalList; int PrevCount = OpenedSessionsMenu->Count; for (int Index = 0; Index < TerminalList->Count; Index++) { TTerminal * Terminal = dynamic_cast(TerminalList->Objects[Index]); assert(Terminal); TTBCustomItem * Item = new TTBXItem(OpenedSessionsMenu); Item->Caption = TerminalList->Strings[Index]; Item->Tag = int(Terminal); Item->Hint = FMTLOAD(OPENEDSESSION_HINT, (Item->Caption)); Item->Checked = (Manager->ActiveTerminal == Terminal); Item->ShortCut = OpenSessionShortCut(Index); Item->OnClick = OpenedSessionItemClick; Item->RadioItem = true; OpenedSessionsMenu->Add(Item); } for (int Index = 0; Index < PrevCount; Index++) { OpenedSessionsMenu->Delete(0); } } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::OpenedSessionItemClick(TObject * Sender) { TTerminalManager::Instance()->ActiveTerminal = (TTerminal*)(((TMenuItem *)Sender)->Tag); } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::CreateEditorListMenu(TAction * Action) { assert(Action != NULL); TTBCustomItem * Menu = dynamic_cast(Action->ActionComponent); if (Menu != NULL) { int PrevCount = Menu->Count; TTBCustomItem * Item = new TTBXItem(Menu); Item->Caption = LoadStr(INTERNAL_EDITOR_NAME); Item->Tag = -1; Item->Hint = LoadStr(INTERNAL_EDITOR_HINT); Item->OnClick = EditorItemClick; Menu->Add(Item); AddMenuSeparator(Menu); TStringList * UsedEditors = new TStringList(); try { UsedEditors->CaseSensitive = false; UsedEditors->Sorted = true; bool AnyExternal = false; const TEditorList * EditorList = WinConfiguration->EditorList; for (int Index = 0; Index < EditorList->Count; Index++) { const TEditorPreferences * Editor = EditorList->Editors[Index]; if ((Editor->Data.Editor == edExternal) && (UsedEditors->IndexOf(Editor->Data.ExternalEditor) < 0)) { UsedEditors->Add(Editor->Data.ExternalEditor); TTBCustomItem * Item = new TTBXItem(Menu); Item->Caption = Editor->Name; Item->Tag = Index; Item->Hint = FMTLOAD(EXTERNAL_EDITOR_HINT, (Editor->Name)); Item->OnClick = EditorItemClick; Menu->Add(Item); AnyExternal = true; } } if (AnyExternal) { AddMenuSeparator(Menu); } Item = new TTBXItem(Menu); Item->Action = EditorListCustomizeAction; Menu->Add(Item); for (int Index = 0; Index < PrevCount; Index++) { Menu->Delete(0); } } __finally { delete UsedEditors; } } } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::EditorItemClick(TObject * Sender) { int Tag = dynamic_cast(Sender)->Tag; if (Tag < 0) { ScpExplorer->ExecuteFile(osCurrent, efInternalEditor, NULL, true, false); } else { const TEditorList * EditorList = WinConfiguration->EditorList; // sanity check if (Tag < EditorList->Count) { ScpExplorer->ExecuteFile(osCurrent, efExternalEditor, EditorList->Editors[Tag], true, false); } } } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::QueuePopupPopup(TObject * /*Sender*/) { TAction * Action = NULL; switch (ScpExplorer->DefaultQueueOperation()) { case qoItemQuery: Action = QueueItemQueryAction; break; case qoItemError: Action = QueueItemErrorAction; break; case qoItemPrompt: Action = QueueItemPromptAction; break; case qoItemExecute: Action = QueueItemExecuteAction; break; case qoItemPause: Action = QueueItemPauseAction; break; case qoItemResume: Action = QueueItemResumeAction; break; } TTBCustomItem * Item; for (int Index = 0; Index < QueuePopup->Items->Count; Index++) { Item = QueuePopup->Items->Items[Index]; TTBItemOptions O = Item->Options; if ((Action != NULL) && (Item->Action == Action)) { O << tboDefault; } else { O >> tboDefault; } Item->Options = O; } QueueSpeedComboBoxItem->Strings = CustomWinConfiguration->History["SpeedLimit"]; } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::ShowUpdatesUpdate() { TUpdatesConfiguration Updates = WinConfiguration->Updates; unsigned short H, M, S, MS; DecodeTime(Now(), H, M, S, MS); int CurrentCompoundVer = CurrentCompoundVersion(); ShowUpdatesAction->ImageIndex = ((Updates.HaveResults && (Updates.Results.ForVersion == CurrentCompoundVer) && !Updates.Results.Disabled && ((Updates.Results.Critical && !Updates.ShownResults && (MS >= 500)) || ((!Updates.Results.Critical || Updates.ShownResults) && ((Updates.Results.Version > CurrentCompoundVer) || !Updates.Results.Message.IsEmpty())))) ? 80 : ((int(Updates.Period) <= 0) ? 81 : 63)); } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::PreferencesDialog(TPreferencesMode APreferencesMode) { if (ScpExplorer != NULL) { ScpExplorer->PreferencesDialog(APreferencesMode); } else { DoPreferencesDialog(APreferencesMode); } } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::CustomCommandsLastUpdate(TAction * Action) { TCustomCommandParam CustomCommand; int State; bool Defined = ScpExplorer->GetLastCustomCommand( (Action == CustomCommandsLastFocusedAction), CustomCommand, State); Action->Visible = Defined; if (Defined) { AnsiString TitleCommand = CustomCommand.Command; int MaxTitleCommandLen = 20; if (TitleCommand.Length() > MaxTitleCommandLen) { TitleCommand = TitleCommand.SubString(1, MaxTitleCommandLen - 3) + "..."; } Action->Caption = FMTLOAD(CUSTOM_COMMAND_LAST, (TitleCommand)); Action->Hint = FMTLOAD(CUSTOM_COMMAND_HINT, (CustomCommand.Command)); Action->Enabled = (State > 0); } } //--------------------------------------------------------------------------- AnsiString __fastcall TNonVisualDataModule::QueueItemSpeed(const AnsiString & Text) { unsigned long Speed = GetSpeedLimit(Text); ScpExplorer->ExecuteQueueOperation(qoItemSpeed, reinterpret_cast(Speed)); AnsiString Result = SetSpeedLimit(Speed); SaveToHistory(QueueSpeedComboBoxItem->Strings, Result); CustomWinConfiguration->History["SpeedLimit"] = QueueSpeedComboBoxItem->Strings; return Result; } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::QueueSpeedComboBoxItemItemClick( TObject * /*Sender*/) { QueueItemSpeedAction->Text = QueueItemSpeed(QueueSpeedComboBoxItem->Text); } //--------------------------------------------------------------------------- void __fastcall TNonVisualDataModule::QueueSpeedComboBoxItemAcceptText( TObject * /*Sender*/, AnsiString & NewText, bool & /*Accept*/) { NewText = QueueItemSpeed(NewText); QueueItemSpeedAction->Text = NewText; } //---------------------------------------------------------------------------