123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482 |
- //---------------------------------------------------------------------------
- #include <FormsPCH.h>
- #pragma hdrstop
- #include "FullSynchronize.h"
- #include "CopyParams.h"
- #include <Terminal.h>
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma link "HistoryComboBox"
- #pragma resource "*.dfm"
- //---------------------------------------------------------------------------
- bool __fastcall DoFullSynchronizeDialog(TSynchronizeMode & Mode, int & Params,
- UnicodeString & LocalDirectory, UnicodeString & RemoteDirectory,
- TCopyParamType * CopyParams, bool & SaveSettings, bool & SaveMode, int Options,
- const TUsableCopyParamAttrs & CopyParamAttrs, TFullSynchronizeInNewWindow OnFullSynchronizeInNewWindow,
- int AutoSubmit)
- {
- bool Result;
- TFullSynchronizeDialog * Dialog = SafeFormCreate<TFullSynchronizeDialog>();
- try
- {
- Dialog->Init(Options, CopyParamAttrs, OnFullSynchronizeInNewWindow);
- Dialog->Mode = Mode;
- Dialog->Params = Params;
- Dialog->LocalDirectory = LocalDirectory;
- Dialog->RemoteDirectory = RemoteDirectory;
- Dialog->CopyParams = *CopyParams;
- Dialog->SaveSettings = SaveSettings;
- Dialog->SaveMode = SaveMode;
- if (AutoSubmit > 0)
- {
- InitiateDialogTimeout(Dialog, AutoSubmit * MSecsPerSec, Dialog->OkButton);
- }
- Result = Dialog->Execute();
- if (Result)
- {
- Mode = Dialog->Mode;
- Params = Dialog->Params;
- LocalDirectory = Dialog->LocalDirectory;
- RemoteDirectory = Dialog->RemoteDirectory;
- *CopyParams = Dialog->CopyParams;
- SaveSettings = Dialog->SaveSettings;
- SaveMode = Dialog->SaveMode;
- }
- }
- __finally
- {
- delete Dialog;
- }
- return Result;
- }
- //---------------------------------------------------------------------------
- __fastcall TFullSynchronizeDialog::TFullSynchronizeDialog(TComponent* Owner)
- : TForm(Owner)
- {
- UseSystemSettings(this);
- FParams = 0;
- FSaveMode = false;
- FOptions = 0;
- FOnFullSynchronizeInNewWindow = NULL;
- FPresetsMenu = new TPopupMenu(this);
- FSynchronizeBySizeCaption = SynchronizeBySizeCheck->Caption;
- HotTrackLabel(CopyParamLabel);
- LoadDialogImage(Image, L"Synchronize directories");
- }
- //---------------------------------------------------------------------------
- __fastcall TFullSynchronizeDialog::~TFullSynchronizeDialog()
- {
- delete FPresetsMenu;
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::Init(
- int Options, const TUsableCopyParamAttrs & CopyParamAttrs, TFullSynchronizeInNewWindow OnFullSynchronizeInNewWindow)
- {
- FOptions = Options;
- if (FLAGSET(Options, fsoDisableTimestamp) &&
- SynchronizeTimestampsButton->Checked)
- {
- SynchronizeFilesButton->Checked = true;
- }
- FCopyParamAttrs = CopyParamAttrs;
- FOnFullSynchronizeInNewWindow = OnFullSynchronizeInNewWindow;
- DebugAssert(FOnFullSynchronizeInNewWindow != NULL);
- UpdateControls();
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::UpdateControls()
- {
- EnableControl(SynchronizeTimestampsButton, FLAGCLEAR(FOptions, fsoDisableTimestamp));
- if (SynchronizeTimestampsButton->Checked)
- {
- SynchronizeExistingOnlyCheck->Checked = true;
- SynchronizeDeleteCheck->Checked = false;
- SynchronizeByTimeCheck->Checked = true;
- SynchronizeByChecksumCheck->Checked = false;
- }
- if (SynchronizeBothButton->Checked)
- {
- SynchronizeByTimeCheck->Checked = true;
- SynchronizeBySizeCheck->Checked = false;
- SynchronizeByChecksumCheck->Checked = false;
- if (MirrorFilesButton->Checked)
- {
- SynchronizeFilesButton->Checked = true;
- }
- }
- EnableControl(MirrorFilesButton, !SynchronizeBothButton->Checked);
- EnableControl(SynchronizeDeleteCheck, !SynchronizeBothButton->Checked &&
- !SynchronizeTimestampsButton->Checked);
- EnableControl(SynchronizeExistingOnlyCheck, !SynchronizeTimestampsButton->Checked);
- EnableControl(SynchronizeByTimeCheck, !SynchronizeBothButton->Checked &&
- !SynchronizeTimestampsButton->Checked);
- EnableControl(SynchronizeBySizeCheck, !SynchronizeBothButton->Checked);
- EnableControl(SynchronizeByChecksumCheck,
- FLAGCLEAR(FOptions, fsoDisableByChecksum) && !SynchronizeBothButton->Checked && !SynchronizeTimestampsButton->Checked);
- EnableControl(SynchronizeSelectedOnlyCheck, FLAGSET(FOptions, fsoAllowSelectedOnly));
- EnableControl(OkButton, !LocalDirectoryEdit->Text.IsEmpty() &&
- !RemoteDirectoryEdit->Text.IsEmpty());
- UnicodeString InfoStr = FCopyParams.GetInfoStr(L"; ", ActualCopyParamAttrs());
- SetLabelHintPopup(CopyParamLabel, InfoStr);
- SynchronizeBySizeCheck->Caption = SynchronizeTimestampsButton->Checked ?
- LoadStr(SYNCHRONIZE_SAME_SIZE) : UnicodeString(FSynchronizeBySizeCaption);
- TransferSettingsButton->Style =
- FLAGCLEAR(FOptions, fsoDoNotUsePresets) ?
- TCustomButton::bsSplitButton : TCustomButton::bsPushButton;
- OkButton->Style = AllowStartInNewWindow() ? TCustomButton::bsSplitButton : TCustomButton::bsPushButton;
- StartInNewWindowItem->Enabled = CanStartInNewWindow();
- }
- //---------------------------------------------------------------------------
- int __fastcall TFullSynchronizeDialog::ActualCopyParamAttrs()
- {
- int Result;
- if (SynchronizeTimestampsButton->Checked)
- {
- Result = cpaIncludeMaskOnly;
- }
- else
- {
- switch (Mode)
- {
- case smRemote:
- Result = FCopyParamAttrs.Upload;
- break;
- case smLocal:
- Result = FCopyParamAttrs.Download;
- break;
- default:
- DebugFail();
- //fallthru
- case smBoth:
- Result = FCopyParamAttrs.General;
- break;
- }
- }
- return
- Result |
- FLAGMASK(SynchronizeByTimeCheck->Checked, cpaNoPreserveTime) |
- cpaNoNewerOnly;
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::ControlChange(TObject * /*Sender*/)
- {
- UpdateControls();
- }
- //---------------------------------------------------------------------------
- bool __fastcall TFullSynchronizeDialog::Execute()
- {
- // at start assume that copy param is current preset
- FPreset = GUIConfiguration->CopyParamCurrent;
- LocalDirectoryEdit->Items = CustomWinConfiguration->History[L"LocalDirectory"];
- RemoteDirectoryEdit->Items = CustomWinConfiguration->History[L"RemoteDirectory"];
- bool Result = (ShowModal() == DefaultResult(this));
- if (Result)
- {
- Submitted();
- }
- return Result;
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::Submitted()
- {
- LocalDirectoryEdit->SaveToHistory();
- CustomWinConfiguration->History[L"LocalDirectory"] = LocalDirectoryEdit->Items;
- RemoteDirectoryEdit->SaveToHistory();
- CustomWinConfiguration->History[L"RemoteDirectory"] = RemoteDirectoryEdit->Items;
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::SetRemoteDirectory(const UnicodeString value)
- {
- RemoteDirectoryEdit->Text = value;
- }
- //---------------------------------------------------------------------------
- UnicodeString __fastcall TFullSynchronizeDialog::GetRemoteDirectory()
- {
- return RemoteDirectoryEdit->Text;
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::SetLocalDirectory(const UnicodeString value)
- {
- LocalDirectoryEdit->Text = value;
- }
- //---------------------------------------------------------------------------
- UnicodeString __fastcall TFullSynchronizeDialog::GetLocalDirectory()
- {
- return LocalDirectoryEdit->Text;
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::SetMode(TSynchronizeMode value)
- {
- FOrigMode = value;
- switch (value)
- {
- case smRemote:
- SynchronizeRemoteButton->Checked = true;
- break;
- case smLocal:
- SynchronizeLocalButton->Checked = true;
- break;
- case smBoth:
- SynchronizeBothButton->Checked = true;
- break;
- default:
- DebugFail();
- }
- }
- //---------------------------------------------------------------------------
- TSynchronizeMode __fastcall TFullSynchronizeDialog::GetMode()
- {
- if (SynchronizeRemoteButton->Checked)
- {
- return smRemote;
- }
- else if (SynchronizeLocalButton->Checked)
- {
- return smLocal;
- }
- else
- {
- DebugAssert(SynchronizeBothButton->Checked);
- return smBoth;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::SetParams(int value)
- {
- FParams = value &
- ~(TTerminal::spDelete | TTerminal::spExistingOnly | TTerminal::spPreviewChanges | TTerminal::spTimestamp |
- TTerminal::spNotByTime | TTerminal::spBySize | TTerminal::spSelectedOnly | TTerminal::spMirror |
- TTerminal::spCaseSensitive | TTerminal::spByChecksum);
- SynchronizeDeleteCheck->Checked = FLAGSET(value, TTerminal::spDelete);
- SynchronizeExistingOnlyCheck->Checked = FLAGSET(value, TTerminal::spExistingOnly);
- SynchronizePreviewChangesCheck->Checked = FLAGSET(value, TTerminal::spPreviewChanges);
- SynchronizeSelectedOnlyCheck->Checked = FLAGSET(value, TTerminal::spSelectedOnly);
- if (FLAGSET(value, TTerminal::spTimestamp) && FLAGCLEAR(FOptions, fsoDisableTimestamp))
- {
- SynchronizeTimestampsButton->Checked = true;
- }
- else if (FLAGSET(value, TTerminal::spMirror))
- {
- MirrorFilesButton->Checked = true;
- }
- else
- {
- SynchronizeFilesButton->Checked = true;
- }
- SynchronizeByTimeCheck->Checked = FLAGCLEAR(value, TTerminal::spNotByTime);
- SynchronizeBySizeCheck->Checked = FLAGSET(value, TTerminal::spBySize);
- SynchronizeByChecksumCheck->Checked = FLAGSET(value, TTerminal::spByChecksum);
- SynchronizeCaseSensitiveCheck->Checked = FLAGSET(value, TTerminal::spCaseSensitive);
- UpdateControls();
- }
- //---------------------------------------------------------------------------
- int __fastcall TFullSynchronizeDialog::GetParams()
- {
- return FParams |
- FLAGMASK(SynchronizeDeleteCheck->Checked, TTerminal::spDelete) |
- FLAGMASK(SynchronizeExistingOnlyCheck->Checked, TTerminal::spExistingOnly) |
- FLAGMASK(SynchronizePreviewChangesCheck->Checked, TTerminal::spPreviewChanges) |
- FLAGMASK(SynchronizeSelectedOnlyCheck->Checked, TTerminal::spSelectedOnly) |
- FLAGMASK(SynchronizeTimestampsButton->Checked && FLAGCLEAR(FOptions, fsoDisableTimestamp),
- TTerminal::spTimestamp) |
- FLAGMASK(MirrorFilesButton->Checked, TTerminal::spMirror) |
- FLAGMASK(!SynchronizeByTimeCheck->Checked, TTerminal::spNotByTime) |
- FLAGMASK(SynchronizeBySizeCheck->Checked, TTerminal::spBySize) |
- FLAGMASK(SynchronizeByChecksumCheck->Enabled && SynchronizeByChecksumCheck->Checked, TTerminal::spByChecksum) |
- FLAGMASK(SynchronizeCaseSensitiveCheck->Checked, TTerminal::spCaseSensitive);
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::LocalDirectoryBrowseButtonClick(
- TObject * /*Sender*/)
- {
- UnicodeString Directory = LocalDirectoryEdit->Text;
- if (SelectDirectory(Directory, LoadStr(SELECT_LOCAL_DIRECTORY)))
- {
- LocalDirectoryEdit->Text = Directory;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::SetSaveSettings(bool value)
- {
- SaveSettingsCheck->Checked = value;
- }
- //---------------------------------------------------------------------------
- bool __fastcall TFullSynchronizeDialog::GetSaveSettings()
- {
- return SaveSettingsCheck->Checked;
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::CopyParamListPopup(TRect R, int AdditionalOptions)
- {
- // We pass in FCopyParams, although it may not be the exact copy param
- // that will be used (because of Preservetime). The reason is to
- // display checkbox next to user-selected preset
- ::CopyParamListPopup(
- R, FPresetsMenu, FCopyParams, FPreset, CopyParamClick,
- AdditionalOptions,
- ActualCopyParamAttrs());
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::TransferSettingsButtonClick(
- TObject * /*Sender*/)
- {
- CopyParamGroupClick(NULL);
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::CopyParamClick(TObject * Sender)
- {
- DebugAssert(FLAGCLEAR(FOptions, fsoDoNotUsePresets));
- // PreserveTime is forced for some settings, but avoid hard-setting it until
- // user really confirms it on custom dialog
- TCopyParamType ACopyParams = CopyParams;
- if (CopyParamListPopupClick(Sender, ACopyParams, FPreset,
- ActualCopyParamAttrs()) > 0)
- {
- FCopyParams = ACopyParams;
- UpdateControls();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::FormShow(TObject * /*Sender*/)
- {
- InstallPathWordBreakProc(LocalDirectoryEdit);
- InstallPathWordBreakProc(RemoteDirectoryEdit);
- UpdateControls();
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::FormCloseQuery(TObject * /*Sender*/,
- bool & CanClose)
- {
- if ((ModalResult == DefaultResult(this)) &&
- SaveSettings && (FOrigMode != Mode) && !FSaveMode)
- {
- switch (MessageDialog(LoadStr(SAVE_SYNCHRONIZE_MODE2),
- qtConfirmation, qaYes | qaNo | qaCancel, HELP_SYNCHRONIZE_SAVE_MODE))
- {
- case qaYes:
- FSaveMode = true;
- break;
- case qaCancel:
- CanClose = false;
- break;
- }
- }
- }
- //---------------------------------------------------------------------------
- TCopyParamType __fastcall TFullSynchronizeDialog::GetCopyParams()
- {
- TCopyParamType Result = FCopyParams;
- // when synchronizing by time, we force preserving time,
- // otherwise it does not make any sense
- if (FLAGCLEAR(Params, TTerminal::spNotByTime))
- {
- Result.PreserveTime = true;
- }
- Result.NewerOnly = false;
- return Result;
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::SetCopyParams(const TCopyParamType & value)
- {
- FCopyParams = value;
- UpdateControls();
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::CopyParamGroupContextPopup(
- TObject * /*Sender*/, TPoint & MousePos, bool & Handled)
- {
- if (FLAGCLEAR(FOptions, fsoDoNotUsePresets))
- {
- CopyParamListPopup(CalculatePopupRect(CopyParamGroup, MousePos), cplCustomizeDefault);
- Handled = true;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::CopyParamGroupClick(
- TObject * /*Sender*/)
- {
- // PreserveTime is forced for some settings, but avoid hard-setting it until
- // user really confirms it on custom dialog
- TCopyParamType ACopyParams = CopyParams;
- if (DoCopyParamCustomDialog(ACopyParams, ActualCopyParamAttrs()))
- {
- FCopyParams = ACopyParams;
- UpdateControls();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::HelpButtonClick(TObject * /*Sender*/)
- {
- FormHelp(this);
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::TransferSettingsButtonDropDownClick(TObject * /*Sender*/)
- {
- CopyParamListPopup(CalculatePopupRect(TransferSettingsButton), cplCustomizeDefault);
- }
- //---------------------------------------------------------------------------
- bool __fastcall TFullSynchronizeDialog::AllowStartInNewWindow()
- {
- return !IsMainFormLike(this);
- }
- //---------------------------------------------------------------------------
- bool __fastcall TFullSynchronizeDialog::CanStartInNewWindow()
- {
- return
- AllowStartInNewWindow() &&
- (!SynchronizeSelectedOnlyCheck->Enabled || !SynchronizeSelectedOnlyCheck->Checked);
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::Start1Click(TObject *)
- {
- OkButton->Click();
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::OkButtonDropDownClick(TObject *)
- {
- MenuPopup(OkMenu, OkButton);
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::OkButtonClick(TObject *)
- {
- if (OpenInNewWindow())
- {
- if (CanStartInNewWindow())
- {
- StartInNewWindow();
- ModalResult = mrCancel;
- }
- else
- {
- Beep();
- ModalResult = mrNone;
- }
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::StartInNewWindow()
- {
- Submitted();
- TCopyParamType ACopyParams = CopyParams;
- FOnFullSynchronizeInNewWindow(Mode, Params, LocalDirectory, RemoteDirectory, &ACopyParams);
- Close();
- }
- //---------------------------------------------------------------------------
- void __fastcall TFullSynchronizeDialog::StartInNewWindowItemClick(TObject *)
- {
- StartInNewWindow();
- }
- //---------------------------------------------------------------------------
|