1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056 |
- //---------------------------------------------------------------------------
- #include <vcl.h>
- #pragma hdrstop
- #include "ScpCommander.h"
- #include <Common.h>
- #include <CoreMain.h>
- #include <Interface.h>
- #include <TextsCore.h>
- #include <TextsWin.h>
- #include <HelpWin.h>
- #include <VCLCommon.h>
- #include <GUITools.h>
- #include <DragDrop.hpp>
- #include <StrUtils.hpp>
- #include "Glyphs.h"
- #include "NonVisual.h"
- #include "Tools.h"
- #include "WinConfiguration.h"
- #include "TerminalManager.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma link "CustomDirView"
- #pragma link "CustomScpExplorer"
- #pragma link "CustomUnixDirView"
- #pragma link "IEListView"
- #pragma link "NortonLikeListView"
- #pragma link "UnixDirView"
- #pragma link "DirView"
- #pragma link "PathLabel"
- #pragma link "HistoryComboBox"
- #pragma link "CustomDriveView"
- #pragma link "DriveView"
- #pragma link "UnixDriveView"
- #pragma link "TB2Dock"
- #pragma link "TB2Item"
- #pragma link "TB2Toolbar"
- #pragma link "TBX"
- #pragma link "TB2ExtItems"
- #pragma link "TBXExtItems"
- #pragma link "TBXLists"
- #pragma link "TBXStatusBars"
- #pragma link "TBXToolPals"
- #pragma link "ThemePageControl"
- #ifndef NO_RESOURCES
- #pragma resource "*.dfm"
- #endif
- //---------------------------------------------------------------------------
- class TSynchronizedBrowsingGuard
- {
- public:
- TSynchronizedBrowsingGuard()
- {
- FWasSynchronisingBrowsing = NonVisualDataModule->SynchronizeBrowsingAction->Checked;
- NonVisualDataModule->SynchronizeBrowsingAction->Checked = false;
- }
- ~TSynchronizedBrowsingGuard()
- {
- NonVisualDataModule->SynchronizeBrowsingAction->Checked = FWasSynchronisingBrowsing;
- }
- private:
- bool FWasSynchronisingBrowsing;
- };
- //---------------------------------------------------------------------------
- __fastcall TScpCommanderForm::TScpCommanderForm(TComponent* Owner)
- : TCustomScpExplorerForm(Owner)
- {
- FConstructed = true;
- FCurrentSide = osLocal;
- FLastLeftPanelWidth = LeftPanelWidth;
- FNormalPanelsWidth = -1;
- FSynchronisingBrowse = false;
- FFirstTerminal = true;
- FInternalDDDownloadList = new TStringList();
- FLocalPathComboBoxPaths = new TStringList();
- RemotePathComboBox->Images = FSystemImageList;
- RemotePathComboBox->SubMenuImages = FSystemImageList;
- LocalPathComboBox->Images = FSystemImageList;
- LocalPathComboBox->SubMenuImages = FSystemImageList;
- LocalPathComboUpdateDrives();
- LocalBackButton->LinkSubitems = HistoryMenu(osLocal, true)->Items;
- LocalForwardButton->LinkSubitems = HistoryMenu(osLocal, false)->Items;
- RemoteBackButton->LinkSubitems = HistoryMenu(osRemote, true)->Items;
- RemoteForwardButton->LinkSubitems = HistoryMenu(osRemote, false)->Items;
- TopDock->PopupMenu = NonVisualDataModule->CommanderBarPopup;
- StatusBar->PopupMenu = TopDock->PopupMenu;
- QueueDock->PopupMenu = TopDock->PopupMenu;
- QueueLabel->PopupMenu = TopDock->PopupMenu;
- BottomDock->PopupMenu = TopDock->PopupMenu;
- QueueSeparatorPanel->PopupMenu = TopDock->PopupMenu;
- LocalTopDock->PopupMenu = NonVisualDataModule->LocalPanelPopup;
- LocalPathLabel->PopupMenu = LocalTopDock->PopupMenu;
- LocalStatusBar->PopupMenu = LocalTopDock->PopupMenu;
- LocalDriveView->PopupMenu = LocalTopDock->PopupMenu;
- LocalBottomDock->PopupMenu = LocalTopDock->PopupMenu;
- RemoteTopDock->PopupMenu = NonVisualDataModule->RemotePanelPopup;
- RemotePathLabel->PopupMenu = RemoteTopDock->PopupMenu;
- RemoteStatusBar->PopupMenu = RemoteTopDock->PopupMenu;
- RemoteDriveView->PopupMenu = RemoteTopDock->PopupMenu;
- RemoteBottomDock->PopupMenu = RemoteTopDock->PopupMenu;
- SetShortcuts();
- Splitter->ShowHint = True;
- reinterpret_cast<TLabel*>(Splitter)->OnDblClick = SplitterDblClick;
- reinterpret_cast<TLabel*>(LocalPanelSplitter)->OnDblClick = PanelSplitterDblClick;
- reinterpret_cast<TLabel*>(RemotePanelSplitter)->OnDblClick = PanelSplitterDblClick;
- CommandLineCombo->Text = L"";
- FCommandLineComboPopulated = false;
- for (int i = 0; i < Toolbar2Toolbar->Items->Count; i++)
- {
- UpdateToolbar2ItemCaption(Toolbar2Toolbar->Items->Items[i]);
- }
- UseDesktopFont(LocalDirView);
- UseDesktopFont(LocalDriveView);
- UseDesktopFont(LocalPathLabel);
- UseDesktopFont(RemotePathLabel);
- UseDesktopFont(LocalStatusBar);
- UseDesktopFont(StatusBar);
- NonVisualDataModule->QueueSpeedComboBoxItem(QueueSpeedComboBoxItem);
- }
- //---------------------------------------------------------------------------
- __fastcall TScpCommanderForm::~TScpCommanderForm()
- {
- delete FInternalDDDownloadList;
- SAFE_DESTROY(FLocalPathComboBoxPaths);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::UpdateToolbar2ItemCaption(TTBCustomItem * Item)
- {
- Item->Caption =
- ShortCutToText(Item->ShortCut) + L" " +
- Trim(ReplaceStr(StripHotkey(Item->Caption), L"...", L""));
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::RestoreFormParams()
- {
- assert(WinConfiguration);
- TCustomScpExplorerForm::RestoreFormParams();
- RestoreForm(WinConfiguration->ScpCommander.WindowParams, this);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::RestoreParams()
- {
- assert(Configuration);
- TCustomScpExplorerForm::RestoreParams();
- LeftPanelWidth = WinConfiguration->ScpCommander.LocalPanelWidth;
- LoadToolbarsLayoutStr(WinConfiguration->ScpCommander.ToolbarsLayout);
- SessionsPageControl->Visible = WinConfiguration->ScpCommander.SessionsTabs;
- StatusBar->Visible = WinConfiguration->ScpCommander.StatusBar;
- #define RESTORE_PANEL_PARAMS(PANEL) \
- PANEL ## DirView->ColProperties->ParamsStr = WinConfiguration->ScpCommander.PANEL ## Panel.DirViewParams; \
- PANEL ## StatusBar->Visible = WinConfiguration->ScpCommander.PANEL ## Panel.StatusBar; \
- PANEL ## DriveView->Visible = WinConfiguration->ScpCommander.PANEL ## Panel.DriveView; \
- if (PANEL ## DriveView->Align == alTop) \
- PANEL ## DriveView->Height = LoadDimension(WinConfiguration->ScpCommander.PANEL ## Panel.DriveViewHeight, WinConfiguration->ScpCommander.PANEL ## Panel.DriveViewHeightPixelsPerInch); \
- else \
- PANEL ## DriveView->Width = LoadDimension(WinConfiguration->ScpCommander.PANEL ## Panel.DriveViewWidth, WinConfiguration->ScpCommander.PANEL ## Panel.DriveViewWidthPixelsPerInch)
- RESTORE_PANEL_PARAMS(Local);
- RESTORE_PANEL_PARAMS(Remote);
- #undef RESTORE_PANEL_PARAMS
- FPanelsRestored = true;
- // just to make sure
- LocalDirView->DirColProperties->ExtVisible = false;
- RemoteDirView->UnixColProperties->ExtVisible = false;
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::StoreParams()
- {
- assert(WinConfiguration);
- WinConfiguration->BeginUpdate();
- try
- {
- WinConfiguration->ScpCommander.ToolbarsLayout = GetToolbarsLayoutStr();
- WinConfiguration->ScpCommander.LocalPanelWidth = LeftPanelWidth;
- WinConfiguration->ScpCommander.SessionsTabs = SessionsPageControl->Visible;
- WinConfiguration->ScpCommander.StatusBar = StatusBar->Visible;
- SaveCommandLine();
- WinConfiguration->ScpCommander.CurrentPanel = FCurrentSide;
- #define STORE_PANEL_PARAMS(PANEL) \
- WinConfiguration->ScpCommander.PANEL ## Panel.DirViewParams = PANEL ## DirView->ColProperties->ParamsStr; \
- WinConfiguration->ScpCommander.PANEL ## Panel.StatusBar = PANEL ## StatusBar->Visible; \
- WinConfiguration->ScpCommander.PANEL ## Panel.DriveView = PANEL ## DriveView->Visible; \
- if (PANEL ## DriveView->Align == alTop) \
- { \
- WinConfiguration->ScpCommander.PANEL ## Panel.DriveViewHeight = PANEL ## DriveView->Height; \
- WinConfiguration->ScpCommander.PANEL ## Panel.DriveViewHeightPixelsPerInch = Screen->PixelsPerInch; \
- } \
- else \
- { \
- WinConfiguration->ScpCommander.PANEL ## Panel.DriveViewWidth = PANEL ## DriveView->Width; \
- WinConfiguration->ScpCommander.PANEL ## Panel.DriveViewWidthPixelsPerInch = Screen->PixelsPerInch; \
- }
- STORE_PANEL_PARAMS(Local);
- STORE_PANEL_PARAMS(Remote);
- #undef RESTORE_PANEL_PARAMS
- WinConfiguration->ScpCommander.WindowParams = StoreForm(this);
- TCustomScpExplorerForm::StoreParams();
- }
- __finally
- {
- WinConfiguration->EndUpdate();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::UpdateTerminal(TTerminal * Terminal)
- {
- TCustomScpExplorerForm::UpdateTerminal(Terminal);
- TManagedTerminal * ManagedTerminal = dynamic_cast<TManagedTerminal *>(Terminal);
- assert(ManagedTerminal != NULL);
- assert(LocalDirView != NULL);
- SAFE_DESTROY(ManagedTerminal->LocalExplorerState);
- if (WinConfiguration->PreservePanelState)
- {
- ManagedTerminal->LocalExplorerState = LocalDirView->SaveState();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::UpdateSessionData(TSessionData * Data)
- {
- // Keep in sync with TSessionData::CopyStateData
- TCustomScpExplorerForm::UpdateSessionData(Data);
- assert(LocalDirView);
- Data->LocalDirectory = LocalDirView->PathName;
- Data->SynchronizeBrowsing = NonVisualDataModule->SynchronizeBrowsingAction->Checked;
- }
- //---------------------------------------------------------------------------
- bool __fastcall TScpCommanderForm::InternalDDDownload(UnicodeString & TargetDirectory)
- {
- assert(IsFileControl(FDDTargetControl, osLocal));
- bool Result = false;
- if (FDDTargetControl == LocalDirView)
- {
- if (LocalDirView->DropTarget)
- {
- // when drop target is not directory, it is probably file type, which have
- // associated drop handler (such as ZIP file in WinXP). in this case we
- // must leave drop handling to destination application.
- // ! this check is duplicated in LocalDirViewDDTargetHasDropHandler()
- // for shellex downloads
- if (LocalDirView->ItemIsDirectory(LocalDirView->DropTarget))
- {
- TargetDirectory = LocalDirView->ItemFullFileName(LocalDirView->DropTarget);
- Result = true;
- }
- }
- else
- {
- TargetDirectory = IncludeTrailingBackslash(LocalDirView->Path);
- Result = true;
- }
- }
- else if (FDDTargetControl == LocalDriveView)
- {
- assert(LocalDriveView->DropTarget != NULL);
- TargetDirectory = LocalDriveView->NodePathName(LocalDriveView->DropTarget);
- Result = true;
- }
- else
- {
- FAIL;
- Abort();
- }
- return Result;
- }
- //---------------------------------------------------------------------------
- bool __fastcall TScpCommanderForm::CopyParamDialog(TTransferDirection Direction,
- TTransferType Type, bool Temp, TStrings * FileList, UnicodeString & TargetDirectory,
- TGUICopyParamType & CopyParam, bool Confirm, bool DragDrop, int Options)
- {
- bool Result = false;
- // Temp means d&d here so far, may change in future!
- if (Temp && (Direction == tdToLocal) &&
- IsFileControl(FDDTargetControl, osLocal))
- {
- Result = InternalDDDownload(TargetDirectory);
- if (Result)
- {
- assert(FileList->Count > 0);
- FInternalDDDownloadList->Assign(FileList);
- }
- }
- else if (!Temp && TargetDirectory.IsEmpty())
- {
- if (Direction == tdToLocal)
- {
- TargetDirectory = IncludeTrailingBackslash(LocalDirView->Path);
- }
- else
- {
- TargetDirectory = UnixIncludeTrailingBackslash(RemoteDirView->Path);
- }
- }
- if (!Result)
- {
- Result = TCustomScpExplorerForm::CopyParamDialog(Direction, Type, Temp,
- FileList, TargetDirectory, CopyParam, Confirm, DragDrop, Options);
- }
- return Result;
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::DoShow()
- {
- ActiveControl = (WinConfiguration->ScpCommander.CurrentPanel == osLocal ?
- (TCustomDirView *)LocalDirView : (TCustomDirView *)RemoteDirView);
- TCustomScpExplorerForm::DoShow();
- UpdateControls();
- }
- //---------------------------------------------------------------------------
- Boolean __fastcall TScpCommanderForm::AllowedAction(TAction * Action, TActionAllowed Allowed)
- {
- #define FLAG ((TActionFlag)(Action->Tag))
- return
- TCustomScpExplorerForm::AllowedAction(Action, Allowed) &&
- // always require Commander flag
- (FLAG & afCommander) &&
- // if action is execution or update, we don't require any other flag
- // if we check for shortcut, we require proper dirview to be selected
- ((Allowed != aaShortCut) ||
- ((FLAG & afLocal) && (FCurrentSide == osLocal)) ||
- ((FLAG & afRemote) && (FCurrentSide == osRemote))
- );
- #undef FLAG
- }
- //---------------------------------------------------------------------------
- TCustomDirView * __fastcall TScpCommanderForm::DirView(TOperationSide Side)
- {
- Side = GetSide(Side);
- if (Side == osLocal)
- {
- return LocalDirView;
- }
- else
- {
- return TCustomScpExplorerForm::DirView(Side);
- }
- }
- //---------------------------------------------------------------------------
- bool __fastcall TScpCommanderForm::IsFileControl(TObject * Control,
- TOperationSide Side)
- {
- return
- ((Side == osLocal) &&
- ((Control == LocalDirView) || (Control == LocalDriveView))) ||
- TCustomScpExplorerForm::IsFileControl(Control, Side);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::ReloadLocalDirectory(const UnicodeString Directory)
- {
- if (Directory.IsEmpty() || ComparePaths(Directory, LocalDirView->Path))
- {
- LocalDirView->ReloadDirectory();
- LocalDriveView->ValidateDirectory(LocalDriveView->Selected);
- }
- TCustomScpExplorerForm::ReloadLocalDirectory();
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::BatchStart(void *& Storage)
- {
- Storage = new bool;
- *static_cast<bool*>(Storage) = LocalDirView->WatchForChanges;
- LocalDirView->WatchForChanges = false;
- LocalDriveView->WatchDirectory = false;
- TCustomScpExplorerForm::BatchStart(Storage);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::BatchEnd(void * Storage)
- {
- TCustomScpExplorerForm::BatchEnd(Storage);
- assert(Storage != NULL);
- LocalDirView->WatchForChanges = *static_cast<bool*>(Storage);
- LocalDriveView->WatchDirectory = LocalDirView->WatchForChanges;
- delete Storage;
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::TerminalChanged()
- {
- if (Terminal)
- {
- NonVisualDataModule->SynchronizeBrowsingAction->Checked = false;
- TCustomScpExplorerForm::TerminalChanged();
- // we will load completelly different directory, so particularly
- // do not attempt to select previously selected directory
- LocalDirView->ContinueSession(false);
- TManagedTerminal * ManagedTerminal = dynamic_cast<TManagedTerminal *>(Terminal);
- assert(ManagedTerminal != NULL);
- // reset home directory
- LocalDirView->HomeDirectory = L"";
- if (FFirstTerminal || !WinConfiguration->ScpCommander.PreserveLocalDirectory)
- {
- UnicodeString LocalDirectory = ManagedTerminal->StateData->LocalDirectory;
- bool DocumentsDir = LocalDirectory.IsEmpty();
- if (!DocumentsDir)
- {
- try
- {
- LocalDirView->Path = LocalDirectory;
- }
- catch(Exception & E)
- {
- DocumentsDir = true;
- Terminal->ShowExtendedException(&E);
- }
- }
- if (DocumentsDir)
- {
- try
- {
- LocalDirView->HomeDirectory = L"";
- LocalDirView->ExecuteHomeDirectory();
- }
- catch(Exception & E)
- {
- Terminal->ShowExtendedException(&E);
- LocalDirView->Path = ExtractFilePath(Application->ExeName);
- }
- }
- }
- FFirstTerminal = false;
- if (WinConfiguration->DefaultDirIsHome &&
- !Terminal->SessionData->UpdateDirectories)
- {
- LocalDirView->HomeDirectory = ExpandFileName(Terminal->SessionData->LocalDirectory);
- }
- if (WinConfiguration->PreservePanelState &&
- !WinConfiguration->ScpCommander.PreserveLocalDirectory)
- {
- if (ManagedTerminal->LocalExplorerState != NULL)
- {
- LocalDirView->RestoreState(ManagedTerminal->LocalExplorerState);
- }
- else
- {
- LocalDirView->ClearState();
- }
- NonVisualDataModule->SynchronizeBrowsingAction->Checked = ManagedTerminal->StateData->SynchronizeBrowsing;
- }
- }
- else
- {
- TCustomScpExplorerForm::TerminalChanged();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::ConfigurationChanged()
- {
- TCustomScpExplorerForm::ConfigurationChanged();
- if (WinConfiguration->DefaultDirIsHome && Terminal &&
- !Terminal->SessionData->UpdateDirectories)
- {
- LocalDirView->HomeDirectory = ExpandFileName(Terminal->SessionData->LocalDirectory);
- }
- else
- {
- LocalDirView->HomeDirectory = L"";
- }
- LocalDirView->DimmHiddenFiles = WinConfiguration->DimmHiddenFiles;
- LocalDriveView->DimmHiddenDirs = WinConfiguration->DimmHiddenFiles;
- LocalDirView->ShowHiddenFiles = WinConfiguration->ShowHiddenFiles;
- LocalDirView->FormatSizeBytes = WinConfiguration->FormatSizeBytes;
- LocalDriveView->ShowHiddenDirs = WinConfiguration->ShowHiddenFiles;
- LocalDirView->ConfirmOverwrite = WinConfiguration->ConfirmOverwriting;
- LocalDriveView->ConfirmOverwrite = WinConfiguration->ConfirmOverwriting;
- LocalDirView->NortonLike = WinConfiguration->ScpCommander.NortonLikeMode;
- RemoteDirView->NortonLike = WinConfiguration->ScpCommander.NortonLikeMode;
- if (LocalDirView->RowSelect != WinConfiguration->FullRowSelect)
- {
- LocalDirView->RowSelect = WinConfiguration->FullRowSelect;
- // selection is not redrawn automatically when RowSelect changes
- LocalDirView->Invalidate();
- }
- LocalDirView->DragDropFilesEx->ShellExtensions->DropHandler =
- !WinConfiguration->DDExtEnabled;
- LocalDriveView->DragDropFilesEx->ShellExtensions->DropHandler =
- !WinConfiguration->DDExtEnabled;
- if ((LocalPanel->Left > RemotePanel->Left) != WinConfiguration->ScpCommander.SwappedPanels)
- {
- int AWidth = ClientWidth;
- Panel(false)->Align = alClient;
- Panel(true)->Align = alLeft;
- TControl * ControlsOrder[] =
- { Panel(true), Splitter, Panel(false) };
- SetHorizontalControlsOrder(ControlsOrder, LENOF(ControlsOrder));
- Panel(true)->TabOrder = 0;
- Panel(false)->TabOrder = 1;
- ClientWidth = AWidth;
- LeftPanelWidth = FLastLeftPanelWidth;
- int LocalIndex = MenuToolbar->Items->IndexOf(LocalMenuButton);
- int RemoteIndex = MenuToolbar->Items->IndexOf(RemoteMenuButton);
- MenuToolbar->Items->Move(LocalIndex, RemoteIndex);
- RemoteIndex = MenuToolbar->Items->IndexOf(RemoteMenuButton);
- MenuToolbar->Items->Move(RemoteIndex, LocalIndex);
- SWAP(TShortCut, NonVisualDataModule->LocalChangePathAction->ShortCut,
- NonVisualDataModule->RemoteChangePathAction->ShortCut);
- }
- if ((RemoteDriveView->Align == alLeft) != WinConfiguration->ScpCommander.TreeOnLeft)
- {
- TScpCommanderPanelConfiguration LocalPanel = WinConfiguration->ScpCommander.LocalPanel;
- TScpCommanderPanelConfiguration RemotePanel = WinConfiguration->ScpCommander.RemotePanel;
- bool TreeOnLeft = WinConfiguration->ScpCommander.TreeOnLeft;
- // save value only is it was set yet
- if (FPanelsRestored)
- {
- if (TreeOnLeft)
- {
- // want to be on left, so it is on top, saving height
- LocalPanel.DriveViewHeight = LocalDriveView->Height;
- RemotePanel.DriveViewHeight = RemoteDriveView->Height;
- }
- else
- {
- LocalPanel.DriveViewWidth = LocalDriveView->Width;
- RemotePanel.DriveViewWidth = RemoteDriveView->Width;
- }
- }
- TAlign NonClientAlign = (TreeOnLeft ? alLeft : alTop);
- // VCL adjusts cursors only between crVSplit and crHSplit,
- // See TSplitter.RequestAlign
- TCursor SplitterCursor = (TreeOnLeft ? crSizeWE : crSizeNS);
- LocalDriveView->Align = NonClientAlign;
- LocalPanelSplitter->Align = NonClientAlign;
- LocalPanelSplitter->Cursor = SplitterCursor;
- RemoteDriveView->Align = NonClientAlign;
- RemotePanelSplitter->Align = NonClientAlign;
- RemotePanelSplitter->Cursor = SplitterCursor;
- FixControlsPlacement();
- if (TreeOnLeft)
- {
- LocalDriveView->Width = LocalPanel.DriveViewWidth;
- RemoteDriveView->Width = RemotePanel.DriveViewWidth;
- }
- else
- {
- LocalDriveView->Height = LocalPanel.DriveViewHeight;
- RemoteDriveView->Height = RemotePanel.DriveViewHeight;
- }
- // in case it trigges config-changed event (does not),
- // make sure it does only after we apply the TreeOnLeft change to avoid endless recursion
- WinConfiguration->ScpCommander.LocalPanel = LocalPanel;
- WinConfiguration->ScpCommander.RemotePanel = RemotePanel;
- }
- if (FExplorerKeyboardShortcuts != WinConfiguration->ScpCommander.ExplorerKeyboardShortcuts)
- {
- SetShortcuts();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::SetShortcuts()
- {
- // set common norton shorcuts to our actions
- NonVisualDataModule->CommanderShortcuts();
- FExplorerKeyboardShortcuts = WinConfiguration->ScpCommander.ExplorerKeyboardShortcuts;
- }
- //---------------------------------------------------------------------------
- TPanel * __fastcall TScpCommanderForm::Panel(bool Left)
- {
- return (WinConfiguration->ScpCommander.SwappedPanels == Left ?
- RemotePanel : LocalPanel);
- }
- //---------------------------------------------------------------------------
- TPanel * __fastcall TScpCommanderForm::CurrentPanel()
- {
- return (FCurrentSide == osLocal ? LocalPanel : RemotePanel);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::SetLeftPanelWidth(double value)
- {
- double Total = LocalPanel->Width + RemotePanel->Width;
- FLeftPanelWidth = value;
- if (value * Total != Panel(true)->Width)
- {
- Panel(true)->Width = static_cast<int>(value * Total);
- UpdateControls();
- }
- }
- //---------------------------------------------------------------------------
- double __fastcall TScpCommanderForm::GetLeftPanelWidth()
- {
- return FLeftPanelWidth;
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::SplitterMoved(TObject * /*Sender*/)
- {
- double Left = Panel(true)->Width;
- double Total = LocalPanel->Width + RemotePanel->Width;
- FLeftPanelWidth = Left / Total;
- FLastLeftPanelWidth = LeftPanelWidth;
- UpdateControls();
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::SplitterCanResize(TObject * /*Sender*/,
- int &NewSize, bool & /*Accept*/)
- {
- // When splitter is drag so far to right, that width contraint of remote panel would
- // be violated, it doesn't stop, but extend form width.
- // Following prevents this behavior.
- if (ClientWidth - NewSize - Splitter->Width < Panel(false)->Constraints->MinWidth)
- NewSize = (ClientWidth - Panel(false)->Constraints->MinWidth - Splitter->Width);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::SplitterDblClick(TObject * /*Sender*/)
- {
- LeftPanelWidth = 0.5;
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::PanelSplitterDblClick(TObject * Sender)
- {
- TSplitter * Splitter = dynamic_cast<TSplitter *>(Sender);
- assert(Splitter != NULL);
- TCustomDriveView * DriveView;
- TCustomDriveView * OtherDriveView;
- if (Splitter == LocalPanelSplitter)
- {
- DriveView = LocalDriveView;
- OtherDriveView = RemoteDriveView;
- }
- else
- {
- DriveView = RemoteDriveView;
- OtherDriveView = LocalDriveView;
- }
- bool TreeOnLeft = WinConfiguration->ScpCommander.TreeOnLeft;
- assert(DriveView->Visible);
- if (OtherDriveView->Visible)
- {
- if (TreeOnLeft)
- {
- DriveView->Width = OtherDriveView->Width;
- }
- else
- {
- DriveView->Height = OtherDriveView->Height;
- }
- }
- else
- {
- if (TreeOnLeft)
- {
- OtherDriveView->Width = DriveView->Width;
- }
- else
- {
- OtherDriveView->Height = DriveView->Height;
- }
- OtherDriveView->Visible = true;
- }
- FixControlsPlacement();
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::UpdateControls()
- {
- TCustomScpExplorerForm::UpdateControls();
- UnicodeString SplitterLongHint = Splitter->Hint;
- SplitterLongHint.Delete(1, SplitterLongHint.Pos(L"|"));
- Splitter->Hint = FORMAT(L"%0.0f%%|%s", (LeftPanelWidth*100, SplitterLongHint));
- UnicodeString ACommandLinePromptLabel = LoadStr(COMMAND_LINE_LABEL) + " " +
- ((FCurrentSide == osRemote) ? L"$" : L">");
- if (CommandLinePromptLabel->Caption != ACommandLinePromptLabel)
- {
- CommandLinePromptLabel->Caption = ACommandLinePromptLabel;
- // command line combo width needs to be updated as caption width has probably changed
- ToolBarResize(CommandLineToolbar);
- }
- LocalDirView->Color = (SessionColor != 0 ? SessionColor : clWindow);
- LocalDriveView->Color = LocalDirView->Color;
- TAction * CurrentCopyAction = (FCurrentSide == osLocal) ? NonVisualDataModule->LocalCopyAction : NonVisualDataModule->RemoteCopyAction;
- if (CurrentCopyItem->Action != CurrentCopyAction)
- {
- CurrentCopyItem->Action = CurrentCopyAction;
- CurrentCopyToolbar2Item->Action = CurrentCopyAction;
- UpdateToolbar2ItemCaption(CurrentCopyToolbar2Item);
- }
- TAction * CurrentMoveAction = (FCurrentSide == osLocal) ? NonVisualDataModule->LocalMoveAction : NonVisualDataModule->RemoteMoveAction;
- if (CurrentMoveItem->Action != CurrentMoveAction)
- {
- CurrentMoveItem->Action = CurrentMoveAction;
- CurrentMoveToolbar2Item->Action = CurrentMoveAction;
- UpdateToolbar2ItemCaption(CurrentMoveToolbar2Item);
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::ChangePath(TOperationSide Side)
- {
- assert((Side == osLocal) || (Side == osRemote));
- TTBXComboBoxItem * PathComboBox;
- if (Side == osLocal)
- {
- PathComboBox = LocalPathComboBox;
- }
- else
- {
- PathComboBox = RemotePathComboBox;
- }
- ClickToolbarItem(PathComboBox, false);
- }
- //---------------------------------------------------------------------------
- TControl * __fastcall TScpCommanderForm::GetComponent(Byte Component)
- {
- switch (Component) {
- case fcToolBar2: return Toolbar2Toolbar; // name changed to enforce change of default visibility
- case fcStatusBar: return StatusBar;
- case fcLocalStatusBar: return LocalStatusBar;
- case fcRemoteStatusBar: return RemoteStatusBar;
- case fcCommandLinePanel: return CommandLineToolbar;
- case fcLocalTree: return LocalDriveView;
- case fcSessionToolbar: return SessionToolbar;
- case fcCustomCommandsBand: return CustomCommandsToolbar;
- case fcColorMenu: return reinterpret_cast<TControl*>(ColorMenuItem);
- case fcTransferDropDown: return reinterpret_cast<TControl*>(TransferDropDown);
- case fcTransferList: return reinterpret_cast<TControl*>(TransferList);
- case fcTransferLabel: return reinterpret_cast<TControl*>(TransferLabel);
- case fcLocalPopup: return reinterpret_cast<TControl *>(NonVisualDataModule->LocalFilePopup);
- case fcCommanderMenuBand: return MenuToolbar;
- case fcCommanderSessionBand: return SessionToolbar;
- case fcCommanderPreferencesBand: return PreferencesToolbar;
- case fcCommanderSortBand: return SortToolbar;
- case fcCommanderCommandsBand: return CommandsToolbar;
- case fcCommanderUpdatesBand: return UpdatesToolbar;
- case fcCommanderTransferBand: return TransferToolbar;
- case fcCommanderCustomCommandsBand: return CustomCommandsToolbar;
- case fcCommanderLocalHistoryBand: return LocalHistoryToolbar;
- case fcCommanderLocalNavigationBand: return LocalNavigationToolbar;
- case fcCommanderLocalFileBand: return LocalFileToolbar;
- case fcCommanderLocalSelectionBand: return LocalSelectionToolbar;
- case fcCommanderRemoteHistoryBand: return RemoteHistoryToolbar;
- case fcCommanderRemoteNavigationBand: return RemoteNavigationToolbar;
- case fcCommanderRemoteFileBand: return RemoteFileToolbar;
- case fcCommanderRemoteSelectionBand: return RemoteSelectionToolbar;
- default: return TCustomScpExplorerForm::GetComponent(Component);
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::FixControlsPlacement()
- {
- TCustomScpExplorerForm::FixControlsPlacement();
- QueueSeparatorPanel->Visible = QueuePanel->Visible;
- LocalPanelSplitter->Visible = LocalDriveView->Visible;
- TControl * ControlsOrder[] =
- { BottomDock, QueueSeparatorPanel, QueueSplitter, QueuePanel, StatusBar };
- SetVerticalControlsOrder(ControlsOrder, LENOF(ControlsOrder));
- TControl * LocalControlsOrder[] =
- { LocalTopDock, LocalPathLabel, LocalDriveView, LocalPanelSplitter,
- LocalDirView, LocalBottomDock, LocalStatusBar };
- SetVerticalControlsOrder(LocalControlsOrder, LENOF(LocalControlsOrder));
- SetHorizontalControlsOrder(LocalControlsOrder, LENOF(LocalControlsOrder));
- TControl * RemoteControlsOrder[] =
- { RemoteTopDock, RemotePathLabel, RemoteDriveView, RemotePanelSplitter,
- RemoteDirView, RemoteBottomDock, RemoteStatusBar };
- SetVerticalControlsOrder(RemoteControlsOrder, LENOF(RemoteControlsOrder));
- SetHorizontalControlsOrder(RemoteControlsOrder, LENOF(RemoteControlsOrder));
- if (LocalDirView->ItemFocused != NULL)
- {
- LocalDirView->ItemFocused->MakeVisible(false);
- }
- }
- //---------------------------------------------------------------------------
- bool __fastcall TScpCommanderForm::GetHasDirView(TOperationSide Side)
- {
- return TCustomScpExplorerForm::GetHasDirView(Side) || (Side == osLocal);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::CompareDirectories()
- {
- LocalDirView->CompareFiles(RemoteDirView, false,
- WinConfiguration->ScpCommander.CompareCriterias());
- RemoteDirView->CompareFiles(LocalDirView, false,
- WinConfiguration->ScpCommander.CompareCriterias());
- if (LocalDirView->SelCount + RemoteDirView->SelCount == 0)
- {
- MessageDialog(LoadStr(COMPARE_NO_DIFFERENCES), qtInformation, qaOK,
- HELP_COMPARE_NO_DIFFERENCES);
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::SynchronizeDirectories()
- {
- UnicodeString LocalDirectory = LocalDirView->PathName;
- UnicodeString RemoteDirectory = RemoteDirView->PathName;
- DoSynchronizeDirectories(LocalDirectory, RemoteDirectory, false);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::FullSynchronizeDirectories()
- {
- UnicodeString LocalDirectory = LocalDirView->PathName;
- UnicodeString RemoteDirectory = RemoteDirView->PathName;
- bool SaveMode = !(GUIConfiguration->SynchronizeModeAuto < 0);
- TSynchronizeMode Mode =
- (SaveMode ? (TSynchronizeMode)GUIConfiguration->SynchronizeModeAuto :
- ((FCurrentSide == osLocal) ? smRemote : smLocal));
- if (DoFullSynchronizeDirectories(LocalDirectory, RemoteDirectory, Mode,
- SaveMode, false))
- {
- if (SaveMode)
- {
- GUIConfiguration->SynchronizeModeAuto = Mode;
- }
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::ExploreLocalDirectory()
- {
- if ((int)ShellExecute(Application->Handle, L"explore",
- (wchar_t*)LocalDirView->Path.data(), NULL, NULL, SW_SHOWNORMAL) <= 32)
- {
- throw Exception(FORMAT(EXPLORE_LOCAL_DIR_ERROR, (LocalDirView->Path)));
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalDirViewExecFile(TObject *Sender,
- TListItem *Item, bool &AllowExec)
- {
- assert(Item);
- if ((UpperCase(PFileRec(Item->Data)->FileExt) == L"LNK") &&
- DirectoryExists(::ApiPath(ResolveFileShortCut(LocalDirView->ItemFullFileName(Item), true))))
- {
- AllowExec = true;
- }
- else
- {
- DoDirViewExecFile(Sender, Item, AllowExec);
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalFileControlDDDragEnter(TObject *Sender,
- IDataObject *DataObj, int grfKeyState, TPoint &Point, int &dwEffect,
- bool &Accept)
- {
- // LocalDirViewDDDragEnter is duplication of
- // TCustomScpExplorerForm::DirViewDDDragEnter, but it differs in
- // literal type of 'DataObj' parameter.Actual type is however same
- FileControlDDDragEnter(Sender, DataObj, grfKeyState, Point, dwEffect, Accept);
- }
- //---------------------------------------------------------------------------
- bool __fastcall TScpCommanderForm::PanelOperation(TOperationSide Side,
- bool DragDrop)
- {
- return TCustomScpExplorerForm::PanelOperation(Side, DragDrop) ||
- (DropSourceControl == LocalDirView);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::FileOperationProgress(
- TFileOperationProgressType & ProgressData)
- {
- // Heuristic: When operation finishes and DD targed is local dir view,
- // we suppose that drag&drop download finished, so local dir view should be
- // reloaded
- if (!ProgressData.InProgress && FProgressForm &&
- IsFileControl(FDDTargetControl, osLocal) &&
- ((ProgressData.Operation == ::foCopy) || (ProgressData.Operation == ::foMove)))
- {
- ReloadLocalDirectory();
- }
- TCustomScpExplorerForm::FileOperationProgress(ProgressData);
- }
- //---------------------------------------------------------------------------
- UnicodeString __fastcall TScpCommanderForm::ChangeFilePath(UnicodeString Path, TOperationSide Side)
- {
- TGUICopyParamType CopyParams = GUIConfiguration->CurrentCopyParam;
- UnicodeString Result;
- while (!Path.IsEmpty())
- {
- int P = Path.Pos(Side == osLocal ? L'\\' : L'/');
- if (P > 0)
- {
- Result += CopyParams.ChangeFileName(Path.SubString(1, P - 1), Side, false) +
- (Side == osLocal ? L'/' : L'\\');
- Path.Delete(1, P);
- }
- else
- {
- Result += CopyParams.ChangeFileName(Path, osLocal, false);
- Path = L"";
- }
- }
- return Result;
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::SynchronizeBrowsingLocal(
- UnicodeString PrevPath, UnicodeString & NewPath, bool Create)
- {
- Terminal->ExceptionOnFail = true;
- TStrings * Paths = new TStringList();
- try
- {
- Paths->Add(IncludeTrailingBackslash(PrevPath));
- Paths->Add(IncludeTrailingBackslash(LocalDirView->Path));
- UnicodeString CommonPath;
- if (ExtractCommonPath(Paths, CommonPath))
- {
- PrevPath = IncludeTrailingBackslash(PrevPath);
- CommonPath = IncludeTrailingBackslash(CommonPath);
- NewPath = RemoteDirView->Path;
- while (!ComparePaths(PrevPath, CommonPath))
- {
- if (NewPath == UnixExcludeTrailingBackslash(NewPath))
- {
- Abort();
- }
- NewPath = UnixExtractFilePath(UnixExcludeTrailingBackslash(NewPath));
- PrevPath = ExtractFilePath(ExcludeTrailingBackslash(PrevPath));
- }
- NewPath = UnixIncludeTrailingBackslash(NewPath) +
- ToUnixPath(LocalDirView->Path.SubString(PrevPath.Length() + 1,
- LocalDirView->Path.Length() - PrevPath.Length()));
- }
- else
- {
- Abort();
- }
- if (Create)
- {
- TRemoteProperties Properties = GUIConfiguration->NewDirectoryProperties;
- RemoteDirView->CreateDirectoryEx(NewPath, &Properties);
- }
- RemoteDirView->Path = NewPath;
- }
- __finally
- {
- Terminal->ExceptionOnFail = false;
- delete Paths;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::SynchronizeBrowsingRemote(
- UnicodeString PrevPath, UnicodeString & NewPath, bool Create)
- {
- TStrings * Paths = new TStringList();
- try
- {
- Paths->Add(UnixIncludeTrailingBackslash(PrevPath));
- Paths->Add(UnixIncludeTrailingBackslash(RemoteDirView->Path));
- UnicodeString CommonPath;
- if (UnixExtractCommonPath(Paths, CommonPath))
- {
- PrevPath = UnixIncludeTrailingBackslash(PrevPath);
- CommonPath = UnixIncludeTrailingBackslash(CommonPath);
- UnicodeString NewLocalPath;
- NewPath = ExcludeTrailingBackslash(LocalDirView->Path);
- while (!UnixSamePath(PrevPath, CommonPath))
- {
- NewLocalPath = ExcludeTrailingBackslash(ExtractFileDir(NewPath));
- if (NewLocalPath == NewPath)
- {
- Abort();
- }
- NewPath = NewLocalPath;
- PrevPath = UnixExtractFilePath(UnixExcludeTrailingBackslash(PrevPath));
- }
- NewPath = IncludeTrailingBackslash(NewPath) +
- ChangeFilePath(
- RemoteDirView->Path.SubString(PrevPath.Length() + 1,
- RemoteDirView->Path.Length() - PrevPath.Length()),
- osRemote);
- }
- else
- {
- Abort();
- }
- }
- __finally
- {
- delete Paths;
- }
- if (Create)
- {
- LocalDirView->CreateDirectory(NewPath);
- }
- LocalDirView->Path = NewPath;
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::SynchronizeBrowsing(TCustomDirView * ADirView,
- UnicodeString PrevPath, UnicodeString & NewPath, bool Create)
- {
- if (ADirView == LocalDirView)
- {
- SynchronizeBrowsingLocal(PrevPath, NewPath, Create);
- }
- else
- {
- SynchronizeBrowsingRemote(PrevPath, NewPath, Create);
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::SynchronizeBrowsing(TCustomDirView * ADirView)
- {
- UnicodeString PrevPath;
- // cannot assign to UnicodeString before the class is constructed,
- // if we do, the value get lost when UnicodeString constructor gets finally called,
- // what results in memory leak in the best case
- if (FConstructed)
- {
- PrevPath = FPrevPath[ADirView == LocalDirView];
- FPrevPath[ADirView == LocalDirView] = ADirView->Path;
- }
- if (!FSynchronisingBrowse && NonVisualDataModule->SynchronizeBrowsingAction->Checked &&
- !PrevPath.IsEmpty() && PrevPath != ADirView->Path)
- {
- TValueRestorer<bool> AllowTransferPresetAutoSelectRestorer(FAllowTransferPresetAutoSelect);
- FAllowTransferPresetAutoSelect = false;
- TValueRestorer<bool> SynchronisingBrowseRestorer(FSynchronisingBrowse);
- FSynchronisingBrowse = true;
- try
- {
- UnicodeString NewPath;
- bool Error = false;
- std::unique_ptr<TStrings> ErrorMoreMessages;
- UnicodeString ErrorHelpKeyword;
- try
- {
- SynchronizeBrowsing(ADirView, PrevPath, NewPath, false);
- }
- // EAbort means that we do not know how to synchronize browsing
- // there's no fallback scenario for that
- catch(EAbort &)
- {
- throw;
- }
- catch(Exception & E)
- {
- // what does this say?
- if (Application->Terminated)
- {
- throw;
- }
- else
- {
- Error = true;
- ErrorMoreMessages.reset(ExceptionToMoreMessages(&E));
- ErrorHelpKeyword =
- MergeHelpKeyword(HELP_SYNC_DIR_BROWSE_ERROR, GetExceptionHelpKeyword(&E));
- }
- }
- // this was moved here out of the above catch clause,
- // to avoid deep nesting, what seems to cause some stray access violations
- if (Error)
- {
- if (MoreMessageDialog(FMTLOAD(SYNC_DIR_BROWSE_CREATE2, (NewPath)),
- ErrorMoreMessages.get(), qtConfirmation, qaYes | qaNo,
- ErrorHelpKeyword) == qaYes)
- {
- try
- {
- SynchronizeBrowsing(ADirView, PrevPath, NewPath, true);
- }
- catch(Exception & E)
- {
- if (!Application->Terminated)
- {
- Terminal->ShowExtendedException(&E);
- }
- throw;
- }
- }
- else
- {
- NonVisualDataModule->SynchronizeBrowsingAction->Checked = false;
- }
- }
- }
- catch(Exception & E)
- {
- NonVisualDataModule->SynchronizeBrowsingAction->Checked = false;
- // what does this say?
- if (Application->Terminated)
- {
- throw;
- }
- else
- {
- MessageDialog(LoadStr(SYNC_DIR_BROWSE_ERROR), qtInformation, qaOK,
- HELP_SYNC_DIR_BROWSE_ERROR);
- }
- }
- // note the value restorers at the beginning of this block
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::DoDirViewLoaded(TCustomDirView * ADirView)
- {
- TCustomScpExplorerForm::DoDirViewLoaded(ADirView);
- UpdateControls();
- SynchronizeBrowsing(ADirView);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::AddEditLink(TOperationSide Side, bool Add)
- {
- if (GetSide(Side) == osLocal)
- {
- bool Edit = false;
- UnicodeString FileName;
- UnicodeString PointTo;
- bool SymbolicLink = true;
- if (LocalDirView->ItemFocused)
- {
- assert(LocalDirView->ItemFocused->Data);
- PFileRec FileRec = (PFileRec)LocalDirView->ItemFocused->Data;
- Edit = !Add && (UpperCase(FileRec->FileExt) == L"LNK");
- if (Edit)
- {
- UnicodeString FullName = LocalDirView->ItemFullFileName(LocalDirView->ItemFocused);
- FileName = FullName;
- PointTo = ResolveFileShortCut(FullName, false);
- if (PointTo.IsEmpty())
- {
- throw Exception(FMTLOAD(RESOLVE_SHORTCUT_ERROR, (FullName)));
- }
- }
- else
- {
- PointTo = FileRec->FileName;
- }
- }
- if (DoSymlinkDialog(FileName, PointTo, osLocal, SymbolicLink, Edit, false))
- {
- Configuration->Usage->Inc(L"LocalShortcutsCreated");
- assert(SymbolicLink);
- assert(!FileName.IsEmpty());
- assert(!PointTo.IsEmpty());
- if (ExtractFileDrive(FileName) == L"" && FileName[1] != L'\\')
- {
- FileName = IncludeTrailingBackslash(LocalDirView->PathName) + FileName;
- }
- if (ExtractFileDrive(PointTo) == L"" && PointTo[1] != L'\\')
- {
- PointTo = IncludeTrailingBackslash(LocalDirView->PathName) + PointTo;
- }
- if (ExtractFileExt(FileName) == L"")
- {
- FileName = FileName + L".lnk";
- }
- if (Edit)
- {
- DeleteFileChecked(FileName);
- }
- if (!CreateFileShortCut(PointTo, FileName, L""))
- {
- throw Exception(CREATE_SHORTCUT_ERROR);
- }
- }
- }
- else
- {
- TCustomScpExplorerForm::AddEditLink(Side, Add);
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::DoOpenDirectoryDialog(TOpenDirectoryMode Mode,
- TOperationSide Side)
- {
- bool UseLocationProfiles;
- do
- {
- UseLocationProfiles = WinConfiguration->UseLocationProfiles;
- if (UseLocationProfiles)
- {
- TStrings * LocalDirectories = NULL;
- TStrings * RemoteDirectories = NULL;
- try
- {
- LocalDirectories = CreateVisitedDirectories(osLocal);
- RemoteDirectories = CreateVisitedDirectories(osRemote);
- UnicodeString Local = LocalDirView->PathName;
- UnicodeString Remote = RemoteDirView->PathName;
- if (LocationProfilesDialog(Mode, Side, Local, Remote, LocalDirectories,
- RemoteDirectories, Terminal))
- {
- DoOpenBookmark(Local, Remote);
- }
- }
- __finally
- {
- delete LocalDirectories;
- delete RemoteDirectories;
- }
- }
- else
- {
- TSynchronizedBrowsingGuard SynchronizedBrowsingGuard;
- TCustomScpExplorerForm::DoOpenDirectoryDialog(Mode, Side);
- }
- // for second and further rounds, always do browse only
- Mode = odBrowse;
- }
- while (UseLocationProfiles != WinConfiguration->UseLocationProfiles);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::DoOpenBookmark(UnicodeString Local, UnicodeString Remote)
- {
- TSynchronizedBrowsingGuard SynchronizedBrowsingGuard;
- // make sure that whatever path is valid it is opened first and only
- // after that an eventual error is reported
- try
- {
- if (!Local.IsEmpty())
- {
- LocalDirView->Path = Local;
- }
- }
- __finally
- {
- if (!Remote.IsEmpty())
- {
- RemoteDirView->Path = Remote;
- }
- }
- }
- //---------------------------------------------------------------------------
- bool __fastcall TScpCommanderForm::OpenBookmark(UnicodeString Local, UnicodeString Remote)
- {
- bool Result;
- if (WinConfiguration->UseLocationProfiles)
- {
- DoOpenBookmark(Local, Remote);
- Result = true;
- }
- else
- {
- Result = TCustomScpExplorerForm::OpenBookmark(Local, Remote);
- }
- return Result;
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalDirViewDDTargetHasDropHandler(
- TObject * /*Sender*/, TListItem * Item, int & /*Effect*/, bool & DropHandler)
- {
- // when drop target is not directory, it is probably file type, which have
- // associated drop handler (such as ZIP file in WinXP). in this case we
- // cannot allow downloading when using shellex.
- // ! this check is duplicated in InternalDDDownload() for non-shellex downloads
- if ((FDDExtMapFile != NULL) &&
- !LocalDirView->ItemIsDirectory(Item))
- {
- DropHandler = false;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalFileControlDDDragOver(TObject * /*Sender*/,
- int grfKeyState, TPoint & /*Point*/, int & dwEffect)
- {
- if (IsFileControl(DropSourceControl, osRemote))
- {
- if (((grfKeyState & (MK_CONTROL | MK_SHIFT)) == 0) ||
- (((grfKeyState & (MK_CONTROL | MK_SHIFT)) == MK_SHIFT) &&
- !WinConfiguration->DDAllowMoveInit))
- {
- dwEffect = DROPEFFECT_Copy;
- }
- }
- }
- //---------------------------------------------------------------------------
- bool __fastcall TScpCommanderForm::DDGetTarget(UnicodeString & Directory, bool & Internal)
- {
- bool Result;
- if (!FDDExtTarget.IsEmpty())
- {
- Directory = FDDExtTarget;
- FDDExtTarget = L"";
- Result = true;
- Internal = true;
- }
- else
- {
- Result = TCustomScpExplorerForm::DDGetTarget(Directory, Internal);
- }
- return Result;
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::DDExtInitDrag(TFileList * FileList,
- bool & Created)
- {
- FDDExtTarget = L"";
- TCustomScpExplorerForm::DDExtInitDrag(FileList, Created);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalFileControlDDFileOperation(
- TObject * /*Sender*/, int dwEffect, UnicodeString SourcePath,
- UnicodeString TargetPath, bool & DoOperation)
- {
- if (IsFileControl(DropSourceControl, osRemote))
- {
- UnicodeString TargetDirectory;
- if (InternalDDDownload(TargetDirectory))
- {
- if (FDDExtMapFile != NULL)
- {
- FDDExtTarget = TargetDirectory;
- }
- else
- {
- assert(FInternalDDDownloadList->Count > 0);
- assert(dwEffect == DROPEFFECT_Copy || dwEffect == DROPEFFECT_Move);
- TGUICopyParamType CopyParams = GUIConfiguration->CurrentCopyParam;
- TTransferType TransferType = dwEffect == DROPEFFECT_Copy ? ttCopy : ttMove;
- if (FDDMoveSlipped)
- {
- TransferType = ttMove;
- }
- int Options = 0;
- if (CopyParamDialog(tdToLocal, TransferType,
- false, FInternalDDDownloadList, TargetDirectory, CopyParams,
- (WinConfiguration->DDTransferConfirmation != asOff), true, Options))
- {
- int Params =
- (TransferType == ttMove ? cpDelete : 0);
- DDDownload(FInternalDDDownloadList, TargetDirectory,
- &CopyParams, Params);
- Configuration->Usage->Inc(L"DownloadsDragDropInternal");
- FInternalDDDownloadList->Clear();
- }
- }
- DoOperation = false;
- }
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::RemoteFileControlDDFileOperationExecuted(
- TObject * /*Sender*/, int dwEffect, UnicodeString /*SourcePath*/,
- UnicodeString /*TargetPath*/)
- {
- if ((dwEffect == DROPEFFECT_Move) &&
- IsFileControl(DropSourceControl, osLocal))
- {
- ReloadLocalDirectory();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalDirViewEnter(TObject * /*Sender*/)
- {
- SideEnter(osLocal);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalDriveViewEnter(TObject * /*Sender*/)
- {
- MakeNextInTabOrder(LocalDirView, LocalDriveView);
- SideEnter(osLocal);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::SideEnter(TOperationSide Side)
- {
- if (Visible && (FCurrentSide != Side))
- {
- // this may get called yet before controls are initialized
- CommandLineCombo->Strings->Clear();
- FCommandLineComboPopulated = false;
- }
- TCustomScpExplorerForm::SideEnter(Side);
- if (Visible)
- {
- UpdateControls();
- UpdatePanelsPathLabelsStatus();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::UpdatePanelsPathLabelsStatus()
- {
- LocalPathLabel->UpdateStatus();
- RemotePathLabel->UpdateStatus();
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::OpenConsole(UnicodeString Command)
- {
- SaveCommandLine();
- try
- {
- TCustomScpExplorerForm::OpenConsole(Command);
- }
- __finally
- {
- FCommandLineComboPopulated = false;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::SaveCommandLine()
- {
- if (FCommandLineComboPopulated)
- {
- CustomWinConfiguration->History[
- FCurrentSide == osRemote ? L"Commands" : L"LocalCommands"] =
- CommandLineCombo->Strings;
- }
- }
- //---------------------------------------------------------------------------
- bool __fastcall TScpCommanderForm::ExecuteCommandLine()
- {
- UnicodeString Command = CommandLineCombo->Text;
- bool Result =
- !Command.IsEmpty() &&
- ((FCurrentSide != osRemote) ||
- (Terminal->AllowedAnyCommand(Command) &&
- EnsureCommandSessionFallback(fcAnyCommand)));
- if (Result)
- {
- CommandLinePopulate();
- SaveToHistory(CommandLineCombo->Strings, Command);
- CommandLineCombo->Text = L"";
- if (FCurrentSide == osRemote)
- {
- OpenConsole(Command);
- }
- else
- {
- UnicodeString Program, Params, Dir;
- SplitCommand(Command, Program, Params, Dir);
- if (!ExecuteShell(Program, Params))
- {
- throw Exception(FMTLOAD(EXECUTE_APP_ERROR, (Program)));
- }
- }
- }
- return Result;
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::CommandLinePopulate()
- {
- if (!FCommandLineComboPopulated)
- {
- TStrings * CommandsHistory;
- CommandsHistory = CustomWinConfiguration->History[
- FCurrentSide == osRemote ? L"Commands" : L"LocalCommands"];
- if ((CommandsHistory != NULL) && (CommandsHistory->Count > 0))
- {
- CommandLineCombo->Strings = CommandsHistory;
- }
- else
- {
- CommandLineCombo->Strings->Clear();
- }
- FCommandLineComboPopulated = true;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::GoToCommandLine()
- {
- ComponentVisible[fcCommandLinePanel] = true;
- if (CommandLineCombo->Enabled)
- {
- ClickToolbarItem(CommandLineCombo, true);
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::GoToTree()
- {
- if (FCurrentSide == osLocal)
- {
- ComponentVisible[fcLocalTree] = true;
- LocalDriveView->SetFocus();
- }
- else
- {
- TCustomScpExplorerForm::GoToTree();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::PanelExportStore(TOperationSide Side,
- TPanelExport Export, TPanelExportDestination Destination,
- TStrings * ExportData)
- {
- if (Destination == pedCommandLine)
- {
- ComponentVisible[fcCommandLinePanel] = true;
- UnicodeString Buf;
- for (int Index = 0; Index < ExportData->Count; Index++)
- {
- Buf += ExportData->Strings[Index] + L" ";
- }
- CommandLineCombo->Text = CommandLineCombo->Text + Buf;
- }
- else
- {
- TCustomScpExplorerForm::PanelExportStore(Side, Export, Destination, ExportData);
- }
- }
- //---------------------------------------------------------------------------
- int __fastcall TScpCommanderForm::GetStaticComponentsHeight()
- {
- return TCustomScpExplorerForm::GetStaticComponentsHeight() +
- (BottomDock->Visible ? BottomDock->Height : 0) +
- (QueueSeparatorPanel->Visible ? QueueSeparatorPanel->Height : 0) +
- (StatusBar->Visible ? StatusBar->Height : 0);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::SysResizing(unsigned int Cmd)
- {
- TCustomScpExplorerForm::SysResizing(Cmd);
- if ((Cmd == SC_MAXIMIZE) ||
- ((Cmd == SC_DEFAULT) && (WindowState != wsMaximized)))
- {
- FNormalPanelsWidth = LocalPanel->Width + RemotePanel->Width;
- }
- else if ((Cmd == SC_RESTORE) ||
- ((Cmd == SC_DEFAULT) && (WindowState == wsMaximized)))
- {
- if (FNormalPanelsWidth >= 0)
- {
- Panel(true)->Width = static_cast<int>(FLeftPanelWidth * FNormalPanelsWidth);
- FNormalPanelsWidth = -1;
- }
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::Resize()
- {
- TCustomScpExplorerForm::Resize();
- LeftPanelWidth = FLastLeftPanelWidth;
- UpdateControls();
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalFileControlDDMenuPopup(TObject * /*Sender*/,
- HMENU AMenu, IDataObject * /*DataObj*/, int /*AMinCustCmd*/, int /*grfKeyState*/,
- TPoint & /*pt*/)
- {
- if (IsFileControl(DropSourceControl, osRemote) &&
- !WinConfiguration->DDAllowMoveInit)
- {
- // index of copy item
- int Index = GetMenuDefaultItem(AMenu, TRUE, 0);
- assert(Index >= 0);
- UnicodeString Caption = Dragdrop_MIMoveStr;
- MENUITEMINFO MI;
- memset(&MI, 0, sizeof(MI));
- MI.cbSize = sizeof(MI);
- MI.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
- MI.fType = MFT_STRING;
- MI.wID = 1 /*DragDrop::CmdMove*/;
- MI.dwTypeData = Caption.c_str();
- MI.cch = Caption.Length();
- MI.fState = MFS_ENABLED;
- InsertMenuItem(AMenu, Index, TRUE, &MI);
- if (FDDMoveSlipped)
- {
- SetMenuDefaultItem(AMenu, Index, TRUE);
- }
- FDDMoveSlipped = false;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::PathLabelDblClick(TObject * Sender)
- {
- OpenDirectory(Sender == LocalPathLabel ? osLocal : osRemote);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalPathLabelGetStatus(
- TCustomPathLabel * /*Sender*/, bool & Active)
- {
- // this strange form is here to make borland compiler work :-)
- Active = Active || LocalDriveView->Focused();
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::RemotePathLabelGetStatus(
- TCustomPathLabel * /*Sender*/, bool & Active)
- {
- // this strange form is here to make borland compiler work :-)
- Active = Active || RemoteDriveView->Focused();
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalPathLabelPathClick(
- TCustomPathLabel * /*Sender*/, UnicodeString Path)
- {
- if (ComparePaths(Path, LocalDirView->Path))
- {
- OpenDirectory(osLocal);
- }
- else
- {
- LocalDirView->Path = Path;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::RemotePathLabelPathClick(
- TCustomPathLabel * /*Sender*/, UnicodeString Path)
- {
- if (UnixSamePath(Path, RemoteDirView->Path))
- {
- OpenDirectory(osRemote);
- }
- else
- {
- RemoteDirView->Path = Path;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalDirViewFileIconForName(
- TObject * /*Sender*/, TListItem * /*Item*/, UnicodeString & FileName)
- {
- UnicodeString PartialExt = Configuration->PartialExt;
- if (AnsiSameText(ExtractFileExt(FileName), PartialExt))
- {
- FileName.SetLength(FileName.Length() - PartialExt.Length());
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalDirViewUpdateStatusBar(
- TObject * /*Sender*/, const TStatusFileInfo & FileInfo)
- {
- UpdateFileStatusBar(LocalStatusBar, FileInfo);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::RemoteDirViewUpdateStatusBar(
- TObject * /*Sender*/, const TStatusFileInfo & FileInfo)
- {
- UpdateFileStatusBar(RemoteStatusBar, FileInfo);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalStatusBarClick(TObject * /*Sender*/)
- {
- LocalDirView->SetFocus();
- }
- //---------------------------------------------------------------------------
- UnicodeString __fastcall TScpCommanderForm::PathForCaption()
- {
- UnicodeString Result;
- if (FCurrentSide == osLocal)
- {
- // for consistency do not show even local path when there is no terminal
- if (Terminal != NULL)
- {
- switch (WinConfiguration->PathInCaption)
- {
- case picShort:
- {
- Result = ExtractFileName(LocalDirView->PathName);
- if (Result.IsEmpty())
- {
- Result = LocalDirView->PathName;
- }
- }
- break;
- case picFull:
- Result = LocalDirView->PathName;
- break;
- }
- }
- }
- else
- {
- Result = TCustomScpExplorerForm::PathForCaption();
- }
- return Result;
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::GetTransferPresetAutoSelectData(
- TCopyParamRuleData & Data)
- {
- TCustomScpExplorerForm::GetTransferPresetAutoSelectData(Data);
- Data.LocalDirectory = LocalDirView->PathName;
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::BeforeAction()
- {
- TCustomScpExplorerForm::BeforeAction();
- if (LocalDirView->ItemFocused != NULL)
- {
- LocalDirView->ItemFocused->CancelEdit();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::RemoteDirViewPathChange(TCustomDirView * /*Sender*/)
- {
- UpdateRemotePathComboBox(RemotePathComboBox, false);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalPathComboUpdateDrives()
- {
- TStrings* Strings = LocalPathComboBox->Strings;
- Strings->BeginUpdate();
- try
- {
- Strings->Clear();
- FLocalPathComboBoxPaths->Clear();
- Strings->Add(LoadStr(SPECIAL_FOLDER_MY_DOCUMENTS));
- FLocalPathComboBoxPaths->AddObject(GetPersonalFolder(),
- (TObject *)DriveInfo->SpecialFolder[CSIDL_PERSONAL]->ImageIndex);
- Strings->Add(LoadStr(SPECIAL_FOLDER_DESKTOP));
- FLocalPathComboBoxPaths->AddObject(GetDesktopFolder(),
- (TObject *)DriveInfo->SpecialFolder[CSIDL_DESKTOP]->ImageIndex);
- for (TDrive Drive = FirstDrive; Drive <= LastDrive; Drive++)
- {
- if (DriveInfo->Data[Drive]->Valid)
- {
- Strings->Add(UnicodeString(L"&") + DriveInfo->GetPrettyName(Drive));
- FLocalPathComboBoxPaths->AddObject(UnicodeString(Drive) + L":\\",
- (TObject *)DriveInfo->GetImageIndex(Drive));
- }
- }
- }
- __finally
- {
- Strings->EndUpdate();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalPathComboUpdate()
- {
- // this may get called even after destructor finishes
- // (e.g. from SetDockAllowDrag invoked [indirectly] from StoreParams)
- if (FLocalPathComboBoxPaths != NULL)
- {
- assert(FLocalPathComboBoxPaths->Count == LocalPathComboBox->Strings->Count);
- int Index = 0;
- while ((Index < FLocalPathComboBoxPaths->Count) &&
- !ComparePaths(FLocalPathComboBoxPaths->Strings[Index],
- LocalDirView->Path.SubString(1, FLocalPathComboBoxPaths->Strings[Index].Length())))
- {
- Index++;
- }
- // what to do if not?
- if (Index < FLocalPathComboBoxPaths->Count)
- {
- LocalPathComboBox->ItemIndex = Index;
- }
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalDirViewPathChange(TCustomDirView * /*Sender*/)
- {
- LocalPathComboUpdate();
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalPathComboBoxCancel(TObject * /*Sender*/)
- {
- LocalPathComboUpdate();
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalPathComboBoxAdjustImageIndex(
- TTBXComboBoxItem * /*Sender*/, const UnicodeString AText, int AIndex,
- int & ImageIndex)
- {
- // this may get called even before constructor starts
- // (e.g. from FixControlsPlacement)
- if (FLocalPathComboBoxPaths != NULL)
- {
- assert(FLocalPathComboBoxPaths->Count == LocalPathComboBox->Strings->Count);
- assert(AIndex < FLocalPathComboBoxPaths->Count);
- if (AIndex < 0)
- {
- AIndex = LocalPathComboBox->ItemIndex;
- }
- if (AIndex >= 0)
- {
- ImageIndex = int(FLocalPathComboBoxPaths->Objects[AIndex]);
- }
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalPathComboBoxItemClick(TObject * /*Sender*/)
- {
- assert(FLocalPathComboBoxPaths->Count == LocalPathComboBox->Strings->Count);
- assert((LocalPathComboBox->ItemIndex >= 0) && (LocalPathComboBox->ItemIndex < FLocalPathComboBoxPaths->Count));
- UnicodeString Path = FLocalPathComboBoxPaths->Strings[LocalPathComboBox->ItemIndex];
- if (Path.Length() == 3)
- {
- LocalDirView->ExecuteDrive(Path[1]);
- }
- else
- {
- LocalDirView->Path = FLocalPathComboBoxPaths->Strings[LocalPathComboBox->ItemIndex];
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::ToolbarItemResize(TTBXCustomDropDownItem * Item, int Width)
- {
- TCustomScpExplorerForm::ToolbarItemResize(Item, Width);
- if ((Item == LocalPathComboBox) ||
- (Item == RemotePathComboBox) ||
- (Item == CommandLineCombo))
- {
- dynamic_cast<TTBXComboBoxItem *>(Item)->MinListWidth = Width - 4;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::CommandLineComboPopup(
- TTBCustomItem * /*Sender*/, bool /*FromLink*/)
- {
- CommandLinePopulate();
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::CommandLineComboBeginEdit(
- TTBEditItem * /*Sender*/, TTBEditItemViewer * /*Viewer*/, TEdit *EditControl)
- {
- InstallPathWordBreakProc(EditControl);
- FCommandLineComboEdit = EditControl;
- FToolbarEditOldWndProc = EditControl->WindowProc;
- EditControl->WindowProc = CommandLineComboEditWndProc;
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::ExitToolbar()
- {
- CurrentPanel()->SetFocus();
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::CommandLineComboEditWndProc(TMessage & Message)
- {
- bool Handled = false;
- if (Message.Msg == WM_CHAR)
- {
- switch (reinterpret_cast<TWMChar &>(Message).CharCode)
- {
- case VK_ESCAPE:
- CommandLineCombo->Text = L"";
- ExitToolbar();
- Handled = true;
- break;
- case VK_TAB:
- CommandLineCombo->Text = FCommandLineComboEdit->Text;
- ExitToolbar();
- Handled = true;
- break;
- case VK_RETURN:
- CommandLineCombo->Text = FCommandLineComboEdit->Text;
- ExitToolbar();
- if (!ExecuteCommandLine())
- {
- // re-enter command line
- // (most probably exited by now as message dialog was shown)
- GoToCommandLine();
- }
- Handled = true;
- break;
- }
- }
- if (!Handled)
- {
- FToolbarEditOldWndProc(Message);
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalDriveViewRefreshDrives(TObject * /*Sender*/)
- {
- LocalPathComboUpdateDrives();
- LocalPathComboUpdate();
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::HomeDirectory(TOperationSide Side)
- {
- TSynchronizedBrowsingGuard SynchronizedBrowsingGuard;
- TCustomScpExplorerForm::HomeDirectory(Side);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::QueueSubmenuItemPopup(
- TTBCustomItem * /*Sender*/, bool /*FromLink*/)
- {
- NonVisualDataModule->QueueSpeedComboBoxItemUpdate(QueueSpeedComboBoxItem);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::DoFocusRemotePath(UnicodeString Path)
- {
- TSynchronizedBrowsingGuard SynchronizedBrowsingGuard;
- TCustomScpExplorerForm::DoFocusRemotePath(Path);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::HistoryGo(TOperationSide Side, int Index)
- {
- TOperationSide OtherSide = ((Side == osLocal) ? osRemote : osLocal);
- if (NonVisualDataModule->SynchronizeBrowsingAction->Checked &&
- ((Index < 0) ? (-Index < DirView(OtherSide)->BackCount) : (Index < DirView(OtherSide)->ForwardCount)))
- {
- TSynchronizedBrowsingGuard SynchronizedBrowsingGuard;
- TCustomScpExplorerForm::HistoryGo(Side, Index);
- TCustomScpExplorerForm::HistoryGo(OtherSide, Index);
- }
- else
- {
- TCustomScpExplorerForm::HistoryGo(Side, Index);
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::DirViewHistoryGo(
- TCustomDirView * Sender, int Index, bool & Cancel)
- {
- TOperationSide Side = (Sender == DirView(osRemote) ? osRemote : osLocal);
- HistoryGo(Side, Index);
- Cancel = true;
- }
- //---------------------------------------------------------------------------
- bool __fastcall TScpCommanderForm::EligibleForImageDisplayMode(TTBCustomItem * Item)
- {
- return
- TCustomScpExplorerForm::EligibleForImageDisplayMode(Item) &&
- ((Item->Parent == NULL) || (Item->Parent->ParentComponent != Toolbar2Toolbar));
- }
- //---------------------------------------------------------------------------
- bool __fastcall TScpCommanderForm::UpdateToolbarDisplayMode()
- {
- bool Result = TCustomScpExplorerForm::UpdateToolbarDisplayMode();
- if (Result)
- {
- // command line combo width needs to be updated as caption visibility has changed
- ToolBarResize(CommandLineToolbar);
- }
- return Result;
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::QueueLabelUpdateStatus()
- {
- TCustomScpExplorerForm::QueueLabelUpdateStatus();
- // this is here to deactivate panels path labels when moving focus from
- // directory tree to queue
- UpdatePanelsPathLabelsStatus();
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalDirViewContextPopup(TObject * /*Sender*/,
- TPoint & MousePos, bool & Handled)
- {
- if (!WinConfiguration->ScpCommander.SystemContextMenu && !FForceSystemContextMenu)
- {
- DirViewContextPopupDefaultItem(osLocal, NonVisualDataModule->LocalOpenMenuItem, dcaOpen);
- DirViewContextPopupDefaultItem(osLocal, NonVisualDataModule->LocalEditMenuItem, dcaEdit);
- DirViewContextPopupDefaultItem(osLocal, NonVisualDataModule->LocalCopyMenuItem, dcaCopy);
- DirViewContextPopup(osLocal, fcLocalPopup, MousePos);
- Handled = true;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::DisplaySystemContextMenu()
- {
- TAutoFlag Flag(FForceSystemContextMenu);
- if ((FLastContextPopupScreenPoint.x >= 0) && (FLastContextPopupScreenPoint.Y >= 0))
- {
- LocalDirView->DisplayContextMenu(FLastContextPopupScreenPoint);
- }
- else
- {
- LocalDirView->DisplayContextMenuInSitu();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::LocalStatusBarPanelClick(TTBXCustomStatusBar * /*Sender*/,
- TTBXStatusPanel * Panel)
- {
- FileStatusBarPanelClick(Panel, osLocal);
- }
- //---------------------------------------------------------------------------
- void __fastcall TScpCommanderForm::RemoteStatusBarPanelClick(TTBXCustomStatusBar * /*Sender*/,
- TTBXStatusPanel *Panel)
- {
- FileStatusBarPanelClick(Panel, osRemote);
- }
- //---------------------------------------------------------------------------
|