| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187 | //---------------------------------------------------------------------#include <vcl.h>#pragma hdrstop#include <StrUtils.hpp>#include <Common.h>#include <math.h>#include "Preferences.h"#include <CoreMain.h>#include <Terminal.h>#include <Bookmarks.h>#include "VCLCommon.h"#include "GUITools.h"#include "Tools.h"#include "TextsWin.h"#include "HelpWin.h"#include "WinInterface.h"#include "WinConfiguration.h"#include "Setup.h"#include "ProgParams.h"//---------------------------------------------------------------------#pragma link "CopyParams"#pragma link "UpDownEdit"#pragma link "ComboEdit"#ifndef NO_RESOURCES#pragma link "HistoryComboBox"#pragma resource "*.dfm"#endif//---------------------------------------------------------------------bool __fastcall DoPreferencesDialog(TPreferencesMode APreferencesMode,  TPreferencesDialogData * DialogData){  bool Result;  TPreferencesDialog * PreferencesDialog =    new TPreferencesDialog(GetFormOwner(), APreferencesMode);  try  {    Result = PreferencesDialog->Execute(DialogData);    if (Result)    {      Configuration->SaveExplicit();    }  }  __finally  {    delete PreferencesDialog;  }  return Result;}//---------------------------------------------------------------------__fastcall TPreferencesDialog::TPreferencesDialog(  TComponent* AOwner, TPreferencesMode PreferencesMode)  : TForm(AOwner){  SetCorrectFormParent(this);  FNoUpdate = 0;  FPreferencesMode = PreferencesMode;  FEditorFont.reset(new TFont());  FEditorFont->Color = clWindowText;  FPanelFont.reset(new TFont());  FPanelFont->Color = clWindowText;  // currently useless  FAfterFilenameEditDialog = false;  FCustomCommandList = new TCustomCommandList();  FCustomCommandChanging = false;  FListViewDragDest = -1;  FCopyParamList = new TCopyParamList();  FEditorList = new TEditorList();  UseSystemSettings(this);  FCustomCommandsScrollOnDragOver = new TListViewScrollOnDragOver(CustomCommandsView, true);  FCopyParamScrollOnDragOver = new TListViewScrollOnDragOver(CopyParamListView, true);  FEditorScrollOnDragOver = new TListViewScrollOnDragOver(EditorListView3, true);  ComboAutoSwitchInitialize(UpdatesBetaVersionsCombo);  EnableControl(UpdatesBetaVersionsCombo, !WinConfiguration->IsBeta);  EnableControl(UpdatesBetaVersionsLabel, UpdatesBetaVersionsCombo->Enabled);  HintLabel(LogFileNameHintText, LoadStr(LOG_FILE_HINT3));  HintLabel(ActionsLogFileNameHintText, LoadStr(LOG_FILE_HINT3));  HintLabel(ShellIconsText2);  HotTrackLabel(CopyParamLabel);  HintLabel(PuttyPathHintText, LoadStr(PUTTY_PATTERNS_HINT));  EditorEncodingCombo->Items->Add(DefaultEncodingName());  EditorEncodingCombo->Items->Add(LoadStr(UTF8_NAME));  std::unique_ptr<TStrings> Workspaces(StoredSessions->GetWorkspaces());  AutoWorkspaceCombo->Items->AddStrings(Workspaces.get());  AutoSaveWorkspacePasswordsCheck->Caption = LoadStr(SAVE_WORKSPACE_PASSWORDS);  PuttyRegistryStorageKeyEdit->Items->Add(OriginalPuttyRegistryStorageKey);  PuttyRegistryStorageKeyEdit->Items->Add(KittyRegistryStorageKey);  MenuButton(RegisterAsUrlHandlersButton);}//---------------------------------------------------------------------------__fastcall TPreferencesDialog::~TPreferencesDialog(){  SAFE_DESTROY(FEditorScrollOnDragOver);  SAFE_DESTROY(FCopyParamScrollOnDragOver);  SAFE_DESTROY(FCustomCommandsScrollOnDragOver);  delete FCustomCommandList;  FCustomCommandList = NULL;  delete FCopyParamList;  FCopyParamList = NULL;  delete FEditorList;  FEditorList = NULL;}//---------------------------------------------------------------------bool __fastcall TPreferencesDialog::Execute(TPreferencesDialogData * DialogData){  PuttyPathEdit->Items = CustomWinConfiguration->History[L"PuttyPath"];  FDialogData = DialogData;  LoadConfiguration();  bool Result = (ShowModal() == DefaultResult(this));  if (Result)  {    SaveConfiguration();    CustomWinConfiguration->History[L"PuttyPath"] = PuttyPathEdit->Items;  }  return Result;}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::LoadLanguages(){  if (!FLanguagesLoaded)  {    LanguagesView->Items->Clear();    TStrings * Locales = GUIConfiguration->Locales;    for (int Index = 0; Index < Locales->Count; Index++)    {      TListItem * Item = LanguagesView->Items->Add();      Item->Caption = Locales->Strings[Index];      Item->Data = Locales->Objects[Index];      Item->Focused =        (reinterpret_cast<LCID>(Locales->Objects[Index]) == GUIConfiguration->Locale);      Item->Selected = Item->Focused;    }    FLanguagesLoaded = false;  }}//---------------------------------------------------------------------------TTabSheet * __fastcall TPreferencesDialog::FindPageForTreeNode(TTreeNode * Node){  for (int pi = 0; pi < PageControl->PageCount; pi++)  {    TTabSheet * Sheet = PageControl->Pages[pi];    if (Sheet->Tag == Node->SelectedIndex)    {      return Sheet;    }  }  FAIL;  return NULL;}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::PrepareNavigationTree(TTreeView * Tree){  Tree->FullExpand();  int i = 0;  while (i < Tree->Items->Count)  {    TTreeNode * Node = Tree->Items->Item[i];    TTabSheet * Sheet = FindPageForTreeNode(Node);    if (NOT_NULL(Sheet))    {      if (Sheet->Enabled)      {        // gets called multiple times occasionally        // (e.g. when called from upload dialog invoked by /upload)        if (!Sheet->Caption.IsEmpty())        {          Node->Text = Sheet->Caption;          Sheet->Caption = L"";        }      }      else      {        Tree->Items->Delete(Node);        i--;      }    }    i++;  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::LoadConfiguration(){  FNoUpdate++;  try  {    #define BOOLPROP(PROP) PROP ## Check->Checked = WinConfiguration->PROP;    BOOLPROP(DefaultDirIsHome);    BOOLPROP(PreservePanelState);    BOOLPROP(DeleteToRecycleBin);    BOOLPROP(DDTransferConfirmation);    BOOLPROP(DDWarnLackOfTempSpace);    BOOLPROP(ShowHiddenFiles);    BOOLPROP(RenameWholeName);    BOOLPROP(ShowInaccesibleDirectories);    BOOLPROP(CopyOnDoubleClickConfirmation);    BOOLPROP(ConfirmTransferring);    BOOLPROP(ConfirmOverwriting);    BOOLPROP(ConfirmResume);    BOOLPROP(ConfirmDeleting);    BOOLPROP(ConfirmRecycling);    BOOLPROP(ConfirmClosingSession);    BOOLPROP(ConfirmExitOnCompletion);    BOOLPROP(ConfirmCommandSession);    BOOLPROP(ContinueOnError);    BOOLPROP(DDAllowMoveInit);    BOOLPROP(BeepOnFinish);    BOOLPROP(TemporaryDirectoryAppendSession);    BOOLPROP(TemporaryDirectoryAppendPath);    BOOLPROP(TemporaryDirectoryDeterministic);    BOOLPROP(TemporaryDirectoryCleanup);    BOOLPROP(ConfirmTemporaryDirectoryCleanup);    BOOLPROP(FullRowSelect);    if (WinConfiguration->DDTransferConfirmation == asAuto)    {      // allow grayed state only initially,      // once the off state is confirmed, never allow returning      // to the undefined state      DDTransferConfirmationCheck->AllowGrayed = true;    }    CheckBoxAutoSwitchLoad(DDTransferConfirmationCheck, WinConfiguration->DDTransferConfirmation);    BeepOnFinishAfterEdit->AsInteger =      int(static_cast<double>(GUIConfiguration->BeepOnFinishAfter) * SecsPerDay);    BOOLPROP(BalloonNotifications);    DDExtEnabledButton->Checked = WinConfiguration->DDExtEnabled;    DDExtDisabledButton->Checked = !DDExtEnabledButton->Checked;    DDWarnOnMoveCheck->Checked = !WinConfiguration->DDAllowMove;    if (WinConfiguration->DDTemporaryDirectory.IsEmpty())    {      DDSystemTemporaryDirectoryButton->Checked = true;      DDTemporaryDirectoryEdit->Text = SystemTemporaryDirectory();    }    else    {      DDCustomTemporaryDirectoryButton->Checked = true;      DDTemporaryDirectoryEdit->Text = WinConfiguration->DDTemporaryDirectory;    }    // Commander    if (WinConfiguration->ScpCommander.NortonLikeMode == nlOff)    {      NortonLikeModeCombo->ItemIndex = 2;    }    else if (WinConfiguration->ScpCommander.NortonLikeMode == nlKeyboard)    {      NortonLikeModeCombo->ItemIndex = 1;    }    else    {      NortonLikeModeCombo->ItemIndex = 0;    }    SwappedPanelsCheck->Checked =      WinConfiguration->ScpCommander.SwappedPanels;    TreeOnLeftCheck->Checked = WinConfiguration->ScpCommander.TreeOnLeft;    ExplorerKeyboardShortcutsCombo->ItemIndex =      WinConfiguration->ScpCommander.ExplorerKeyboardShortcuts ? 1 : 0;    BOOLPROP(UseLocationProfiles);    CompareByTimeCheck->Checked = WinConfiguration->ScpCommander.CompareByTime;    CompareBySizeCheck->Checked = WinConfiguration->ScpCommander.CompareBySize;    // Local panel    PreserveLocalDirectoryCheck->Checked =      WinConfiguration->ScpCommander.PreserveLocalDirectory;    SystemContextMenuCheck->Checked =      WinConfiguration->ScpCommander.SystemContextMenu;    // Explorer    ShowFullAddressCheck->Checked =      WinConfiguration->ScpExplorer.ShowFullAddress;    // select none when stNul    RegistryStorageButton->Checked = (Configuration->Storage == stRegistry);    IniFileStorageButton2->Checked = (Configuration->Storage == stIniFile);    RandomSeedFileEdit->Text = Configuration->RandomSeedFile;    // editor    EditorWordWrapCheck->Checked = WinConfiguration->Editor.WordWrap;    EditorTabSizeEdit->AsInteger = WinConfiguration->Editor.TabSize;    if (WinConfiguration->Editor.Encoding == CP_UTF8)    {      EditorEncodingCombo->ItemIndex = 1;    }    else    {      EditorEncodingCombo->ItemIndex = 0;    }    TWinConfiguration::RestoreFont(WinConfiguration->Editor.Font, FEditorFont.get());    (*FEditorList) = *WinConfiguration->EditorList;    UpdateEditorListView();    FCopyParams = GUIConfiguration->DefaultCopyParam;    ResumeOnButton->Checked = GUIConfiguration->DefaultCopyParam.ResumeSupport == rsOn;    ResumeSmartButton->Checked = GUIConfiguration->DefaultCopyParam.ResumeSupport == rsSmart;    ResumeOffButton->Checked = GUIConfiguration->DefaultCopyParam.ResumeSupport == rsOff;    ResumeThresholdEdit->Value = GUIConfiguration->DefaultCopyParam.ResumeThreshold / 1024;    SessionReopenAutoCheck->Checked = (Configuration->SessionReopenAuto > 0);    SessionReopenAutoEdit->Value = (Configuration->SessionReopenAuto > 0 ?      (Configuration->SessionReopenAuto / MSecsPerSec) : 5);    SessionReopenAutoIdleCheck->Checked = (GUIConfiguration->SessionReopenAutoIdle > 0);    SessionReopenAutoIdleEdit->Value = (GUIConfiguration->SessionReopenAutoIdle > 0 ?      (GUIConfiguration->SessionReopenAutoIdle / MSecsPerSec) : 5);    SessionReopenAutoStallCheck->Checked = (Configuration->SessionReopenAutoStall > 0);    SessionReopenAutoStallEdit->Value = (Configuration->SessionReopenAutoStall > 0 ?      (Configuration->SessionReopenAutoStall / MSecsPerSec) : SecsPerMin);    SessionReopenTimeoutEdit->Value = (Configuration->SessionReopenTimeout / MSecsPerSec);    GeneralSheet->Enabled = WinConfiguration->ExpertMode;    ExplorerSheet->Enabled = WinConfiguration->ExpertMode;    CommanderSheet->Enabled = WinConfiguration->ExpertMode;    EditorSheet->Enabled = WinConfiguration->ExpertMode && !WinConfiguration->DisableOpenEdit;    StorageGroup->Visible = WinConfiguration->ExpertMode;    RandomSeedFileLabel->Visible = WinConfiguration->ExpertMode;    RandomSeedFileEdit->Visible = WinConfiguration->ExpertMode;    FCustomCommandList->Assign(WinConfiguration->CustomCommandList);    UpdateCustomCommandsView();    PuttyPathEdit->Text = GUIConfiguration->PuttyPath;    PuttyPasswordCheck2->Checked = GUIConfiguration->PuttyPassword;    AutoOpenInPuttyCheck->Checked = WinConfiguration->AutoOpenInPutty;    TelnetForFtpInPuttyCheck->Checked = WinConfiguration->TelnetForFtpInPutty;    SelectPuttyRegistryStorageKey(GUIConfiguration->PuttyRegistryStorageKey);    // Queue    QueueTransferLimitEdit->AsInteger = GUIConfiguration->QueueTransfersLimit;    EnableQueueByDefaultCheck->Checked = WinConfiguration->EnableQueueByDefault;    QueueAutoPopupCheck->Checked = GUIConfiguration->QueueAutoPopup;    QueueCheck->Checked = GUIConfiguration->DefaultCopyParam.Queue;    QueueIndividuallyCheck->Checked = GUIConfiguration->DefaultCopyParam.QueueIndividually;    QueueNoConfirmationCheck->Checked = GUIConfiguration->DefaultCopyParam.QueueNoConfirmation;    if (!GUIConfiguration->QueueKeepDoneItems)    {      QueueKeepDoneItemsForCombo->ItemIndex = 0;    }    else if (GUIConfiguration->QueueKeepDoneItemsFor < 0)    {      QueueKeepDoneItemsForCombo->ItemIndex = 5;    }    else if (GUIConfiguration->QueueKeepDoneItemsFor <= 15)    {      QueueKeepDoneItemsForCombo->ItemIndex = 1;    }    else if (GUIConfiguration->QueueKeepDoneItemsFor <= 60)    {      QueueKeepDoneItemsForCombo->ItemIndex = 2;    }    else if (GUIConfiguration->QueueKeepDoneItemsFor <= 15 * 60)    {      QueueKeepDoneItemsForCombo->ItemIndex = 3;    }    else if (GUIConfiguration->QueueKeepDoneItemsFor <= 60 * 60)    {      QueueKeepDoneItemsForCombo->ItemIndex = 4;    }    if (WinConfiguration->QueueView.Show == qvShow)    {      QueueViewShowButton->Checked = true;    }    else if (WinConfiguration->QueueView.Show == qvHideWhenEmpty)    {      QueueViewHideWhenEmptyButton->Checked = true;    }    else    {      QueueViewHideButton->Checked = true;    }    // window    AutoSaveWorkspaceCheck->Checked = WinConfiguration->AutoSaveWorkspace;    AutoWorkspaceCombo->Text =      DefaultStr(WinConfiguration->AutoWorkspace,        // It will rarely happen that LastWorkspace is set, while AutoWorkspace not.        // It can happen only when user saved workspace before opening the Preferences        // dialog for the first time        DefaultStr(WinConfiguration->LastWorkspace, LoadStr(NEW_WORKSPACE)));    AutoSaveWorkspacePasswordsCheck->Checked = WinConfiguration->AutoSaveWorkspacePasswords;    if (WinConfiguration->PathInCaption == picFull)    {      PathInCaptionFullButton->Checked = true;    }    else if (WinConfiguration->PathInCaption == picShort)    {      PathInCaptionShortButton->Checked = true;    }    else    {      PathInCaptionNoneButton->Checked = true;    }    BOOLPROP(MinimizeToTray);    BOOLPROP(ExternalSessionInExistingInstance);    // panels    DoubleClickActionCombo->ItemIndex = WinConfiguration->DoubleClickAction;    BOOLPROP(AutoReadDirectoryAfterOp);    BOOLPROP(RefreshRemotePanel);    RefreshRemotePanelIntervalEdit->Value =      int(static_cast<double>(WinConfiguration->RefreshRemotePanelInterval) * SecsPerDay);    switch (WinConfiguration->FormatSizeBytes)    {      case fbNone:        FormatSizeBytesCombo->ItemIndex = 0;        break;      case fbKilobytes:        FormatSizeBytesCombo->ItemIndex = 1;        break;      case fbShort:        FormatSizeBytesCombo->ItemIndex = 2;        break;      default:        FAIL;    }    bool CustomPanelFont = !WinConfiguration->PanelFont.FontName.IsEmpty();    PanelFontCheck->Checked = CustomPanelFont;    if (CustomPanelFont)    {      TWinConfiguration::RestoreFont(WinConfiguration->PanelFont, FPanelFont.get());    }    else    {      FPanelFont->Assign(WinConfiguration->SystemIconFont);    }    // updates    TUpdatesConfiguration Updates = WinConfiguration->Updates;    if (int(Updates.Period) <= 0)    {      UpdatesPeriodCombo->ItemIndex = 0;    }    else if (int(Updates.Period) <= 1)    {      UpdatesPeriodCombo->ItemIndex = 1;    }    else if (int(Updates.Period) <= 7)    {      UpdatesPeriodCombo->ItemIndex = 2;    }    else    {      UpdatesPeriodCombo->ItemIndex = 3;    }    UpdatesShowOnStartup->Checked = Updates.ShowOnStartup;    CollectUsageCheck->Checked = Configuration->CollectUsage;    ComboAutoSwitchLoad(UpdatesBetaVersionsCombo, Updates.BetaVersions);    switch (Updates.ConnectionType)    {      case ctDirect:      default:        UpdatesDirectCheck->Checked = true;        break;      case ctAuto:        UpdatesAutoCheck->Checked = true;        break;      case ctProxy:        UpdatesProxyCheck->Checked = true;        break;    }    UpdatesProxyHostEdit->Text = Updates.ProxyHost;    UpdatesProxyPortEdit->AsInteger = Updates.ProxyPort;    // presets    (*FCopyParamList) = *WinConfiguration->CopyParamList;    UpdateCopyParamListView();    CopyParamListView->ItemIndex = 0;    BOOLPROP(CopyParamAutoSelectNotice);    // interface    switch (CustomWinConfiguration->Interface)    {      case ifCommander:        CommanderInterfaceButton2->Checked = true;        break;      case ifExplorer:        ExplorerInterfaceButton2->Checked = true;        break;      default:        FAIL;        break;    }    if (WinConfiguration->Theme == L"OfficeXP")    {      ThemeCombo->ItemIndex = 1;    }    else if (WinConfiguration->Theme == L"Office2003")    {      ThemeCombo->ItemIndex = 2;    }    else    {      ThemeCombo->ItemIndex = 0;    }    // security    UseMasterPasswordCheck->Checked = WinConfiguration->UseMasterPassword;    SessionRememberPasswordCheck->Checked = GUIConfiguration->SessionRememberPassword;    // network    RetrieveExternalIpAddressButton->Checked = Configuration->ExternalIpAddress.IsEmpty();    CustomExternalIpAddressButton->Checked = !RetrieveExternalIpAddressButton->Checked;    CustomExternalIpAddressEdit->Text = Configuration->ExternalIpAddress;    TryFtpWhenSshFailsCheck->Checked = Configuration->TryFtpWhenSshFails;    // logging    EnableLoggingCheck->Checked = Configuration->Logging;    LogProtocolCombo->ItemIndex = Configuration->LogProtocol;    LogToFileCheck->Checked = Configuration->LogToFile;    LogFileNameEdit3->Text =      !Configuration->LogFileName.IsEmpty() ? Configuration->LogFileName : Configuration->DefaultLogFileName;    if (Configuration->LogFileAppend)    {      LogFileAppendButton->Checked = true;    }    else    {      LogFileOverwriteButton->Checked = true;    }    LogShowWindowCheck->Checked = (CustomWinConfiguration->LogView == lvWindow);    if (Configuration->LogWindowComplete)    {      LogWindowCompleteButton->Checked = true;    }    else    {      LogWindowLinesButton->Checked = true;    }    if (!Configuration->LogWindowComplete)    {      LogWindowLinesEdit->AsInteger = Configuration->LogWindowLines;    }    else    {      LogWindowLinesEdit->AsInteger = 500;    }    BOOLPROP(LogSensitive);    EnableActionsLoggingCheck->Checked = Configuration->LogActions;    ActionsLogFileNameEdit->Text = Configuration->ActionsLogFileName;    #undef BOOLPROP  }  __finally  {    FNoUpdate--;  }  UpdateControls();}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::SaveConfiguration(){  Configuration->BeginUpdate();  try  {    TGUICopyParamType CopyParam = GUIConfiguration->DefaultCopyParam;    #define BOOLPROP(PROP) WinConfiguration->PROP = PROP ## Check->Checked    BOOLPROP(DefaultDirIsHome);    BOOLPROP(PreservePanelState);    BOOLPROP(DeleteToRecycleBin);    BOOLPROP(DDWarnLackOfTempSpace);    BOOLPROP(ShowHiddenFiles);    BOOLPROP(RenameWholeName);    BOOLPROP(ShowInaccesibleDirectories);    BOOLPROP(CopyOnDoubleClickConfirmation);    BOOLPROP(ConfirmTransferring);    BOOLPROP(ConfirmOverwriting);    BOOLPROP(ConfirmResume);    BOOLPROP(ConfirmDeleting);    BOOLPROP(ConfirmRecycling);    BOOLPROP(ConfirmClosingSession);    BOOLPROP(ConfirmExitOnCompletion);    BOOLPROP(ConfirmCommandSession);    BOOLPROP(ContinueOnError);    BOOLPROP(DDAllowMoveInit);    BOOLPROP(BeepOnFinish);    BOOLPROP(TemporaryDirectoryAppendSession);    BOOLPROP(TemporaryDirectoryAppendPath);    BOOLPROP(TemporaryDirectoryDeterministic);    BOOLPROP(TemporaryDirectoryCleanup);    BOOLPROP(ConfirmTemporaryDirectoryCleanup);    BOOLPROP(FullRowSelect);    WinConfiguration->DDTransferConfirmation =      CheckBoxAutoSwitchSave(DDTransferConfirmationCheck);    GUIConfiguration->BeepOnFinishAfter =      static_cast<double>(BeepOnFinishAfterEdit->Value / SecsPerDay);    BOOLPROP(BalloonNotifications);    WinConfiguration->DDAllowMove = !DDWarnOnMoveCheck->Checked;    WinConfiguration->DDExtEnabled = DDExtEnabledButton->Checked;    if (DDSystemTemporaryDirectoryButton->Checked)    {      WinConfiguration->DDTemporaryDirectory = L"";    }    else    {      WinConfiguration->DDTemporaryDirectory = DDTemporaryDirectoryEdit->Text;    }    // Commander    TScpCommanderConfiguration ScpCommander = WinConfiguration->ScpCommander;    if (NortonLikeModeCombo->ItemIndex == 2)    {      ScpCommander.NortonLikeMode = nlOff;    }    else if (NortonLikeModeCombo->ItemIndex == 1)    {      ScpCommander.NortonLikeMode = nlKeyboard;    }    else    {      ScpCommander.NortonLikeMode = nlOn;    }    ScpCommander.SwappedPanels = SwappedPanelsCheck->Checked;    ScpCommander.TreeOnLeft = TreeOnLeftCheck->Checked;    ScpCommander.ExplorerKeyboardShortcuts =      (ExplorerKeyboardShortcutsCombo->ItemIndex != 0);    BOOLPROP(UseLocationProfiles);    ScpCommander.CompareByTime = CompareByTimeCheck->Checked;    ScpCommander.CompareBySize = CompareBySizeCheck->Checked;    // Local panel    ScpCommander.PreserveLocalDirectory = PreserveLocalDirectoryCheck->Checked;    ScpCommander.SystemContextMenu = SystemContextMenuCheck->Checked;    WinConfiguration->ScpCommander = ScpCommander;    // Explorer    TScpExplorerConfiguration ScpExplorer = WinConfiguration->ScpExplorer;    ScpExplorer.ShowFullAddress = ShowFullAddressCheck->Checked;    WinConfiguration->ScpExplorer = ScpExplorer;    Configuration->RandomSeedFile = RandomSeedFileEdit->Text;    // editor    WinConfiguration->Editor.WordWrap = EditorWordWrapCheck->Checked;    WinConfiguration->Editor.TabSize = EditorTabSizeEdit->AsInteger;    switch (EditorEncodingCombo->ItemIndex)    {      case 1:        WinConfiguration->Editor.Encoding = CP_UTF8;        break;      default:        WinConfiguration->Editor.Encoding = CP_ACP;        break;    }    TWinConfiguration::StoreFont(FEditorFont.get(), WinConfiguration->Editor.Font);    WinConfiguration->EditorList = FEditorList;    // overwrites only TCopyParamType fields    CopyParam = FCopyParams;    if (ResumeOnButton->Checked) CopyParam.ResumeSupport = rsOn;    if (ResumeSmartButton->Checked) CopyParam.ResumeSupport = rsSmart;    if (ResumeOffButton->Checked) CopyParam.ResumeSupport = rsOff;    CopyParam.ResumeThreshold = ResumeThresholdEdit->AsInteger * 1024;    Configuration->SessionReopenAuto =      (SessionReopenAutoCheck->Checked ? (SessionReopenAutoEdit->AsInteger * MSecsPerSec) : 0);    GUIConfiguration->SessionReopenAutoIdle =      (SessionReopenAutoIdleCheck->Checked ? (SessionReopenAutoIdleEdit->AsInteger * MSecsPerSec) : 0);    Configuration->SessionReopenAutoStall =      (SessionReopenAutoStallCheck->Checked ? (SessionReopenAutoStallEdit->AsInteger * MSecsPerSec) : 0);    Configuration->SessionReopenTimeout = (SessionReopenTimeoutEdit->AsInteger * MSecsPerSec);    WinConfiguration->CustomCommandList = FCustomCommandList;    GUIConfiguration->PuttyPath = PuttyPathEdit->Text;    GUIConfiguration->PuttyPassword = PuttyPasswordCheck2->Checked;    WinConfiguration->AutoOpenInPutty = AutoOpenInPuttyCheck->Checked;    WinConfiguration->TelnetForFtpInPutty = TelnetForFtpInPuttyCheck->Checked;    // do not overwrite custom keys    if (PuttyRegistryStorageKeyEdit->ItemIndex >= 0)    {      GUIConfiguration->PuttyRegistryStorageKey = PuttyRegistryStorageKeyEdit->Text;    }    // Queue    GUIConfiguration->QueueTransfersLimit = QueueTransferLimitEdit->AsInteger;    WinConfiguration->EnableQueueByDefault = EnableQueueByDefaultCheck->Checked;    GUIConfiguration->QueueAutoPopup = QueueAutoPopupCheck->Checked;    CopyParam.Queue = QueueCheck->Checked;    CopyParam.QueueIndividually = QueueIndividuallyCheck->Checked;    CopyParam.QueueNoConfirmation = QueueNoConfirmationCheck->Checked;    GUIConfiguration->QueueKeepDoneItems = (QueueKeepDoneItemsForCombo->ItemIndex != 0);    switch (QueueKeepDoneItemsForCombo->ItemIndex)    {      case 0:        GUIConfiguration->QueueKeepDoneItemsFor = 0;        break;      case 1:        GUIConfiguration->QueueKeepDoneItemsFor = 15;        break;      case 2:        GUIConfiguration->QueueKeepDoneItemsFor = 60;        break;      case 3:        GUIConfiguration->QueueKeepDoneItemsFor = 15 * 60;        break;      case 4:        GUIConfiguration->QueueKeepDoneItemsFor = 60 * 60;        break;      default:        GUIConfiguration->QueueKeepDoneItemsFor = -1;        break;    }    if (QueueViewShowButton->Checked)    {      WinConfiguration->QueueView.Show = qvShow;    }    else if (QueueViewHideWhenEmptyButton->Checked)    {      WinConfiguration->QueueView.Show = qvHideWhenEmpty;    }    else    {      WinConfiguration->QueueView.Show = qvHide;    }    GUIConfiguration->DefaultCopyParam = CopyParam;    // window    WinConfiguration->AutoSaveWorkspace =      !AutoWorkspaceCombo->Text.IsEmpty() &&      AutoSaveWorkspaceCheck->Checked;    if (!AutoWorkspaceCombo->Text.IsEmpty())    {      WinConfiguration->AutoWorkspace = AutoWorkspaceCombo->Text;    }    WinConfiguration->AutoSaveWorkspacePasswords = AutoSaveWorkspacePasswordsCheck->Checked;    if (PathInCaptionFullButton->Checked)    {       WinConfiguration->PathInCaption = picFull;    }    else if (PathInCaptionShortButton->Checked)    {      WinConfiguration->PathInCaption = picShort;    }    else    {      WinConfiguration->PathInCaption = picNone;    }    BOOLPROP(MinimizeToTray);    BOOLPROP(ExternalSessionInExistingInstance);    // panels    WinConfiguration->DoubleClickAction = (TDoubleClickAction)DoubleClickActionCombo->ItemIndex;    BOOLPROP(AutoReadDirectoryAfterOp);    BOOLPROP(RefreshRemotePanel);    WinConfiguration->RefreshRemotePanelInterval =      static_cast<double>(RefreshRemotePanelIntervalEdit->Value / SecsPerDay);    switch (FormatSizeBytesCombo->ItemIndex)    {      case 0:        WinConfiguration->FormatSizeBytes = fbNone;        break;      case 1:        WinConfiguration->FormatSizeBytes = fbKilobytes;        break;      case 2:        WinConfiguration->FormatSizeBytes = fbShort;        break;      default:        FAIL;    }    TFontConfiguration PanelFontConfiguration;    if (PanelFontCheck->Checked)    {      TWinConfiguration::StoreFont(FPanelFont.get(), PanelFontConfiguration);    }    WinConfiguration->PanelFont = PanelFontConfiguration;    // updates    TUpdatesConfiguration Updates = WinConfiguration->Updates;    if (UpdatesPeriodCombo->ItemIndex == 0)    {      Updates.Period = 0;    }    else if (UpdatesPeriodCombo->ItemIndex == 1)    {      Updates.Period = 1;    }    else if (UpdatesPeriodCombo->ItemIndex == 2)    {      Updates.Period = 7;    }    else    {      Updates.Period = 30;    }    Updates.ShowOnStartup = UpdatesShowOnStartup->Checked;    Configuration->CollectUsage = CollectUsageCheck->Checked;    Updates.BetaVersions = ComboAutoSwitchSave(UpdatesBetaVersionsCombo);    if (UpdatesDirectCheck->Checked)    {      Updates.ConnectionType = ctDirect;    }    else if (UpdatesAutoCheck->Checked)    {      Updates.ConnectionType = ctAuto;    }    else if (UpdatesProxyCheck->Checked)    {      if (!UpdatesProxyHostEdit->Text.IsEmpty())      {        Updates.ConnectionType = ctProxy;      }      else      {        Updates.ConnectionType = ctDirect;      }    }    Updates.ProxyHost = UpdatesProxyHostEdit->Text;    Updates.ProxyPort = UpdatesProxyPortEdit->AsInteger;    WinConfiguration->Updates = Updates;    // presets    WinConfiguration->CopyParamList = FCopyParamList;    BOOLPROP(CopyParamAutoSelectNotice);    // interface    if (GetInterface() != CustomWinConfiguration->Interface)    {      Configuration->Usage->Inc(L"InterfaceChanges");    }    CustomWinConfiguration->Interface = GetInterface();    if (ThemeCombo->ItemIndex == 1)    {      WinConfiguration->Theme = L"OfficeXP";    }    else if (ThemeCombo->ItemIndex == 2)    {      WinConfiguration->Theme = L"Office2003";    }    else    {      WinConfiguration->Theme = L"Default";    }    // network    Configuration->ExternalIpAddress =      (CustomExternalIpAddressButton->Checked ? CustomExternalIpAddressEdit->Text : UnicodeString());    Configuration->TryFtpWhenSshFails = TryFtpWhenSshFailsCheck->Checked;    // security    GUIConfiguration->SessionRememberPassword = SessionRememberPasswordCheck->Checked;    // logging    Configuration->Logging = EnableLoggingCheck->Checked;    Configuration->LogProtocol = LogProtocolCombo->ItemIndex;    Configuration->LogFileName = LogToFileCheck->Checked ? LogFileNameEdit3->Text : UnicodeString();    Configuration->LogFileAppend = LogFileAppendButton->Checked;    CustomWinConfiguration->LogView = LogShowWindowCheck->Checked ? lvWindow : lvNone;    Configuration->LogWindowComplete = LogWindowCompleteButton->Checked;    if (!LogWindowCompleteButton->Checked)    {      Configuration->LogWindowLines = LogWindowLinesEdit->AsInteger;    }    BOOLPROP(LogSensitive);    Configuration->LogActions = EnableActionsLoggingCheck->Checked;    Configuration->ActionsLogFileName = ActionsLogFileNameEdit->Text;    // languages    // As this dialog does not explicitly support run-time locale changing,    // make this last, otherwise we lose some settings (or even worse    // we end-up saving default text box values=control names as our configuration)    if (LanguagesView->ItemFocused != NULL)    {      GUIConfiguration->Locale =        reinterpret_cast<LCID>(LanguagesView->ItemFocused->Data);    }    // This possibly fails, make it last, so that the other settings are preserved.    // Do nothing when no option is selected (i.e. storage is stNul).    if (RegistryStorageButton->Checked)    {      Configuration->Storage = stRegistry;    }    else if (IniFileStorageButton2->Checked)    {      Configuration->Storage = stIniFile;    }    #undef BOOLPROP  }  __finally  {    Configuration->EndUpdate();  }}//---------------------------------------------------------------------------TInterface __fastcall TPreferencesDialog::GetInterface(){  return CommanderInterfaceButton2->Checked ? ifCommander : ifExplorer;}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::FormShow(TObject * /*Sender*/){  InstallPathWordBreakProc(RandomSeedFileEdit);  InstallPathWordBreakProc(DDTemporaryDirectoryEdit);  InstallPathWordBreakProc(PuttyPathEdit);  InstallPathWordBreakProc(LogFileNameEdit3);  InstallPathWordBreakProc(ActionsLogFileNameEdit);  PrepareNavigationTree(NavigationTree);  switch (FPreferencesMode) {    case pmEditor: PageControl->ActivePage = EditorSheet; break;    case pmCustomCommands: PageControl->ActivePage = CustomCommandsSheet; break;    case pmQueue: PageControl->ActivePage = QueueSheet; break;    case pmLogging: PageControl->ActivePage = LogSheet; break;    case pmUpdates: PageControl->ActivePage = UpdatesSheet; break;    case pmPresets: PageControl->ActivePage = CopyParamListSheet; break;    case pmEditors: PageControl->ActivePage = EditorSheet; break;    default: PageControl->ActivePage = PreferencesSheet; break;  }  PageControlChange(NULL);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::ControlChange(TObject * /*Sender*/){  UpdateControls();}//---------------------------------------------------------------------------UnicodeString __fastcall TPreferencesDialog::TabSample(UnicodeString Values){  UnicodeString Result;  for (int Index = 1; Index <= Values.Length(); Index++)  {    if (Index > 1)    {      Result += L' ';      if (EditorTabSizeEdit->AsInteger > 2)      {        Result += UnicodeString::StringOfChar(L' ', EditorTabSizeEdit->AsInteger - 2);      }    }    Result += Values[Index];  }  return Result;}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::UpdateControls(){  if (FNoUpdate == 0)  {    EnableControl(BeepOnFinishAfterEdit, BeepOnFinishCheck->Checked);    EnableControl(BeepOnFinishAfterText, BeepOnFinishCheck->Checked);    EnableControl(ResumeThresholdEdit, ResumeSmartButton->Checked);    EnableControl(ResumeThresholdUnitLabel2, ResumeThresholdEdit->Enabled);    EnableControl(SessionReopenAutoEdit, SessionReopenAutoCheck->Checked);    EnableControl(SessionReopenAutoLabel, SessionReopenAutoEdit->Enabled);    EnableControl(SessionReopenAutoSecLabel, SessionReopenAutoEdit->Enabled);    EnableControl(SessionReopenAutoIdleEdit, SessionReopenAutoIdleCheck->Checked);    EnableControl(SessionReopenAutoIdleLabel, SessionReopenAutoIdleEdit->Enabled);    EnableControl(SessionReopenAutoIdleSecLabel, SessionReopenAutoIdleEdit->Enabled);    EnableControl(SessionReopenAutoStallEdit, SessionReopenAutoStallCheck->Checked);    EnableControl(SessionReopenAutoStallLabel, SessionReopenAutoStallEdit->Enabled);    EnableControl(SessionReopenAutoStallSecLabel, SessionReopenAutoStallEdit->Enabled);    EnableControl(SessionReopenTimeoutEdit,      SessionReopenAutoEdit->Enabled || SessionReopenAutoStallCheck->Checked);    EnableControl(SessionReopenTimeoutLabel, SessionReopenTimeoutEdit->Enabled);    EnableControl(SessionReopenTimeoutSecLabel,SessionReopenTimeoutEdit->Enabled);    EnableControl(CopyOnDoubleClickConfirmationCheck,      (DoubleClickActionCombo->ItemIndex == 1) && ConfirmTransferringCheck->Checked);    TFont * ActualPanelFont = PanelFontCheck->Checked ? FPanelFont.get() : WinConfiguration->SystemIconFont;    UnicodeString PanelFontLabelText;    PanelFontLabelText = FMTLOAD(EDITOR_FONT_FMT,      (ActualPanelFont->Name, ActualPanelFont->Size));    PanelFontLabel->Caption = PanelFontLabelText;    if (!SameFont(PanelFontLabel->Font, ActualPanelFont))    {      PanelFontLabel->Font = ActualPanelFont;    }    EnableControl(RefreshRemotePanelIntervalEdit, RefreshRemotePanelCheck->Checked);    EnableControl(RefreshRemoteDirectoryUnitLabel, RefreshRemotePanelCheck->Checked);    UnicodeString EditorFontLabelText;    EditorFontLabelText = FMTLOAD(EDITOR_FONT_FMT,      (FEditorFont->Name, FEditorFont->Size)) + L"\n\n";    EditorFontLabelText += TabSample(L"ABCD") + L"\n";    EditorFontLabelText += TabSample(L"1234");    EditorFontLabel->Caption = EditorFontLabelText;    if (!SameFont(EditorFontLabel->Font, FEditorFont.get()))    {      EditorFontLabel->Font = FEditorFont.get();    }    bool CommandSelected = (CustomCommandsView->Selected != NULL);    EnableControl(EditCommandButton, CommandSelected);    EnableControl(RemoveCommandButton, CommandSelected);    EnableControl(UpCommandButton, CommandSelected &&      CustomCommandsView->ItemIndex > 0);    EnableControl(DownCommandButton, CommandSelected &&      (CustomCommandsView->ItemIndex < CustomCommandsView->Items->Count - 1));    bool CopyParamSelected = (CopyParamListView->Selected != NULL);    EnableControl(EditCopyParamButton, CopyParamSelected);    EnableControl(DuplicateCopyParamButton, CopyParamSelected);    EnableControl(RemoveCopyParamButton,      CopyParamSelected && (CopyParamListView->ItemIndex >= 1));    EnableControl(UpCopyParamButton,      CopyParamSelected && (CopyParamListView->ItemIndex > 1));    EnableControl(DownCopyParamButton,      CopyParamSelected &&      (CopyParamListView->ItemIndex >= 1) &&      (CopyParamListView->ItemIndex < CopyParamListView->Items->Count - 1));    EnableControl(CopyParamAutoSelectNoticeCheck, FCopyParamList->AnyRule);    UnicodeString InfoStr;    if (CopyParamSelected)    {      const TCopyParamType * SelectedCopyParam = GetCopyParam(CopyParamListView->ItemIndex);      InfoStr = SelectedCopyParam->GetInfoStr(L"; ", 0);      if (CopyParamListView->ItemIndex >= 1)      {        const TCopyParamRule * Rule = FCopyParamList->Rules[CopyParamListView->ItemIndex - 1];        if (Rule != NULL)        {          InfoStr += L"\n" + FORMAT(ReplaceStr(LoadStr(COPY_PARAM_RULE), L"\n", L" "), (Rule->GetInfoStr(L"; ")));        }      }    }    CopyParamLabel->Caption = InfoStr;    CopyParamLabel->Hint = InfoStr;    CopyParamLabel->ShowHint =      (CopyParamLabel->Canvas->TextWidth(InfoStr) > (CopyParamLabel->Width * 3 / 2));    EnableControl(DDExtEnabledButton, WinConfiguration->DDExtInstalled);    EnableControl(DDExtEnabledLabel, WinConfiguration->DDExtInstalled);    EnableControl(DDExtDisabledPanel, DDExtDisabledButton->Checked);    EnableControl(DDTemporaryDirectoryEdit, DDCustomTemporaryDirectoryButton->Enabled &&      DDCustomTemporaryDirectoryButton->Checked);    EnableControl(DDWarnOnMoveCheck, DDExtDisabledButton->Checked &&      DDAllowMoveInitCheck->Checked);    EnableControl(ConfirmTemporaryDirectoryCleanupCheck,      TemporaryDirectoryCleanupCheck->Checked);    // allow only when some of the known storages is selected,    // and particularly do not allow switching storage, when we start with stNul,    // as that would destroy the stored configuration    EnableControl(StorageGroup, RegistryStorageButton->Checked || IniFileStorageButton2->Checked);    IniFileStorageButton2->Caption =      AnsiReplaceStr(IniFileStorageButton2->Caption, L"(winscp.ini)",        FORMAT(L"(%s)", (ExpandEnvironmentVariables(Configuration->IniFileStorageName))));    EditorFontLabel->WordWrap = EditorWordWrapCheck->Checked;    bool EditorSelected = (EditorListView3->Selected != NULL);    EnableControl(EditEditorButton, EditorSelected);    EnableControl(RemoveEditorButton, EditorSelected);    EnableControl(UpEditorButton, EditorSelected &&      (EditorListView3->ItemIndex > 0));    EnableControl(DownEditorButton, EditorSelected &&      (EditorListView3->ItemIndex < EditorListView3->Items->Count - 1));    EnableControl(UsageViewButton, CollectUsageCheck->Checked);    EnableControl(UpdatesProxyHostEdit, UpdatesProxyCheck->Checked);    EnableControl(UpdatesProxyHostLabel, UpdatesProxyHostEdit->Enabled);    EnableControl(UpdatesProxyPortEdit, UpdatesProxyCheck->Checked);    EnableControl(UpdatesProxyPortLabel, UpdatesProxyPortEdit->Enabled);    bool IsSiteCommand = false;    try    {      TRemoteCustomCommand RemoteCustomCommand;      TInteractiveCustomCommand InteractiveCustomCommand(&RemoteCustomCommand);      UnicodeString PuttyPath = PuttyPathEdit->Text;      PuttyPath = InteractiveCustomCommand.Complete(PuttyPath, false);      IsSiteCommand = RemoteCustomCommand.IsSiteCommand(PuttyPath);    }    catch (...)    {      // noop    }    EnableControl(PuttyPasswordCheck2, !PuttyPathEdit->Text.IsEmpty());    EnableControl(AutoOpenInPuttyCheck, PuttyPasswordCheck2->Enabled);    EnableControl(TelnetForFtpInPuttyCheck,      PuttyPasswordCheck2->Enabled && !IsSiteCommand);    EnableControl(PuttyRegistryStorageKeyEdit,      PuttyPasswordCheck2->Enabled && !IsSiteCommand);    EnableControl(PuttyRegistryStorageKeyLabel, PuttyRegistryStorageKeyEdit->Enabled);    EnableControl(SetMasterPasswordButton, WinConfiguration->UseMasterPassword);    // network    EnableControl(CustomExternalIpAddressEdit, CustomExternalIpAddressButton->Checked);    // window    EnableControl(AutoWorkspaceCombo, AutoSaveWorkspaceCheck->Checked);    EnableControl(AutoWorkspaceLabel, AutoWorkspaceCombo->Enabled);    EnableControl(AutoSaveWorkspacePasswordsCheck,      !Configuration->DisablePasswordStoring &&      AutoWorkspaceCombo->Enabled);    // integration    // There's no quick launch in Windows 7    EnableControl(QuickLaunchIconButton, !::IsWin7());    MakeDefaultHandlerItem->Visible = IsWinVista();    // languages    LanguageChangeLabel->Visible =      !GUIConfiguration->CanApplyLocaleImmediately &&      (LanguagesView->ItemFocused != NULL) &&      (reinterpret_cast<LCID>(LanguagesView->ItemFocused->Data) != GUIConfiguration->AppliedLocale);    // logging    EnableControl(LogProtocolCombo, EnableLoggingCheck->Checked);    EnableControl(LogToFileCheck, LogProtocolCombo->Enabled);    EnableControl(LogFileNameEdit3, LogToFileCheck->Enabled && LogToFileCheck->Checked);    EnableControl(LogFileNameHintText, LogFileNameEdit3->Enabled);    EnableControl(LogFileAppendButton, LogFileNameEdit3->Enabled);    EnableControl(LogFileOverwriteButton, LogFileNameEdit3->Enabled);    EnableControl(LogShowWindowCheck, LogProtocolCombo->Enabled);    EnableControl(LogWindowCompleteButton, LogShowWindowCheck->Enabled && LogShowWindowCheck->Checked);    EnableControl(LogWindowLinesButton, LogWindowCompleteButton->Enabled);    EnableControl(LogWindowLinesEdit, LogWindowLinesButton->Enabled && LogWindowLinesButton->Checked);    EnableControl(LogWindowLinesText, LogWindowLinesEdit->Enabled);    EnableControl(LogSensitiveCheck, LogProtocolCombo->Enabled);    EnableControl(ActionsLogFileNameEdit, EnableActionsLoggingCheck->Checked);    EnableControl(ActionsLogFileNameHintText, ActionsLogFileNameEdit->Enabled);    // interface    InterfaceChangeLabel->Visible =      !CustomWinConfiguration->CanApplyInterfaceImmediately &&      (GetInterface() != CustomWinConfiguration->AppliedInterface);  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::EditorFontButtonClick(TObject * /*Sender*/){  if (FontDialog(FEditorFont.get()))  {    UpdateControls();  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::PanelFontButtonClick(TObject * /*Sender*/){  if (FontDialog(FPanelFont.get()))  {    PanelFontCheck->Checked = true;    UpdateControls();  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::FormCloseQuery(TObject * /*Sender*/,  bool & /*CanClose*/){  if (ModalResult == DefaultResult(this))  {    ExitActiveControl(this);  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::IconButtonClick(TObject *Sender){  UnicodeString IconName, Params;  int SpecialFolder;  if (Sender == DesktopIconButton)  {    IconName = AppName;    int Result =      MessageDialog(LoadStr(CREATE_DESKTOP_ICON2), qtConfirmation,        qaYes | qaNo | qaCancel, HELP_CREATE_ICON);    switch (Result)    {      case qaYes:        SpecialFolder = CSIDL_COMMON_DESKTOPDIRECTORY;        break;      case qaNo:        SpecialFolder = CSIDL_DESKTOPDIRECTORY;        break;      default:        Abort();        break;    }  }  else  {    if (MessageDialog(MainInstructions(LoadStr(CONFIRM_CREATE_ICON)),          qtConfirmation, qaYes | qaNo, HELP_CREATE_ICON) == qaYes)    {      if (Sender == SendToHookButton)      {        IconName = FMTLOAD(SENDTO_HOOK_NAME, (AppName));        SpecialFolder = CSIDL_SENDTO;        Params = TProgramParams::FormatSwitch(UPLOAD_SWITCH);      }      else if (Sender == QuickLaunchIconButton)      {        IconName = L"Microsoft\\Internet Explorer\\Quick Launch\\" +          AppName;        SpecialFolder = CSIDL_APPDATA;      }    }    else    {      Abort();    }  }  TInstantOperationVisualizer Visualizer;  CreateDesktopShortCut(IconName,    Application->ExeName, Params, L"", SpecialFolder);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::CustomCommandsViewData(TObject * /*Sender*/,      TListItem * Item){  // WORKAROUND We get here on Wine after destructor is called  if (FCustomCommandList != NULL)  {    int Index = Item->Index;    assert(Index >= 0 && Index <= FCustomCommandList->Count);    const TCustomCommandType * Command = FCustomCommandList->Commands[Index];    UnicodeString Caption = StripHotkey(Command->Name);    if (Command->ShortCut != 0)    {      Caption = FORMAT(L"%s (%s)", (Caption, ShortCutToText(Command->ShortCut)));    }    Item->Caption = Caption;    assert(!Item->SubItems->Count);    Item->SubItems->Add(Command->Command);    int Params = Command->Params;    Item->SubItems->Add(LoadStr(      FLAGSET(Params, ccLocal) ? CUSTOM_COMMAND_LOCAL : CUSTOM_COMMAND_REMOTE));    UnicodeString ParamsStr;    #define ADDPARAM(PARAM, STR) \      if (FLAGSET(Params, PARAM)) \        ParamsStr += (ParamsStr.IsEmpty() ? L"" : L"/") + LoadStr(STR);    ADDPARAM(ccApplyToDirectories, CUSTOM_COMMAND_DIRECTORIES);    ADDPARAM(ccRecursive, CUSTOM_COMMAND_RECURSE);    #undef ADDPARAM    Item->SubItems->Add(ParamsStr);  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::ListViewSelectItem(  TObject * /*Sender*/, TListItem * /*Item*/, bool /*Selected*/){  UpdateControls();}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::UpdateCustomCommandsView(){  CustomCommandsView->Items->Count = FCustomCommandList->Count;  AdjustListColumnsWidth(CustomCommandsView);  CustomCommandsView->Invalidate();}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::CustomCommandsViewKeyDown(      TObject * /*Sender*/, WORD & Key, TShiftState /*Shift*/){  if (RemoveCommandButton->Enabled && (Key == VK_DELETE))  {    RemoveCommandButtonClick(NULL);  }  if (AddCommandButton->Enabled && (Key == VK_INSERT))  {    AddEditCommandButtonClick(AddCommandButton);  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::CustomCommandsViewDblClick(  TObject * /*Sender*/){  if (EditCommandButton->Enabled)  {    AddEditCommandButtonClick(EditCommandButton);  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::AddEditCommandButtonClick(TObject * Sender){  bool Edit = (Sender == EditCommandButton);  TCustomCommandType Command;  if (Edit)  {    int Index = CustomCommandsView->ItemIndex;    assert(Index >= 0 && Index <= FCustomCommandList->Count);    Command = *FCustomCommandList->Commands[Index];  }  TShortCuts ShortCuts;  if (WinConfiguration->SharedBookmarks != NULL)  {    WinConfiguration->SharedBookmarks->ShortCuts(ShortCuts);  }  FCustomCommandList->ShortCuts(ShortCuts);  if (DoCustomCommandDialog(Command, FCustomCommandList,        (Edit ? ccmEdit : ccmAdd), 0, NULL, &ShortCuts))  {    int Index = CustomCommandsView->ItemIndex;    TCustomCommandType * ACommand = new TCustomCommandType(Command);    if (Edit)    {      FCustomCommandList->Change(Index, ACommand);    }    else    {      if (Index >= 0)      {        FCustomCommandList->Insert(Index, ACommand);      }      else      {        FCustomCommandList->Add(ACommand);        Index = FCustomCommandList->Count - 1;      }    }    UpdateCustomCommandsView();    CustomCommandsView->ItemIndex = Index;    UpdateControls();  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::RemoveCommandButtonClick(      TObject * /*Sender*/){  assert(CustomCommandsView->ItemIndex >= 0 &&    CustomCommandsView->ItemIndex < FCustomCommandList->Count);  FCustomCommandList->Delete(CustomCommandsView->ItemIndex);  UpdateCustomCommandsView();  UpdateControls();}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::CustomCommandMove(int Source, int Dest){  if (Source >= 0 && Source < FCustomCommandList->Count &&      Dest >= 0 && Dest < FCustomCommandList->Count)  {    FCustomCommandList->Move(Source, Dest);    // workaround for bug in VCL    CustomCommandsView->ItemIndex = -1;    CustomCommandsView->ItemFocused = CustomCommandsView->Selected;    CustomCommandsView->ItemIndex = Dest;    UpdateCustomCommandsView();    UpdateControls();  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::UpDownCommandButtonClick(TObject * Sender){  CustomCommandMove(CustomCommandsView->ItemIndex,    CustomCommandsView->ItemIndex + (Sender == UpCommandButton ? -1 : 1));}//---------------------------------------------------------------------------TListViewScrollOnDragOver * __fastcall TPreferencesDialog::ScrollOnDragOver(TObject * ListView){  if (ListView == CopyParamListView)  {    return FCopyParamScrollOnDragOver;  }  else if (ListView == CustomCommandsView)  {    return FCustomCommandsScrollOnDragOver;  }  else if (ListView == EditorListView3)  {    return FEditorScrollOnDragOver;  }  else  {    FAIL;    return NULL;  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::ListViewStartDrag(      TObject * Sender, TDragObject *& /*DragObject*/){  FListViewDragSource = dynamic_cast<TListView*>(Sender)->ItemIndex;  FListViewDragDest = -1;  ScrollOnDragOver(Sender)->StartDrag();}//---------------------------------------------------------------------------bool __fastcall TPreferencesDialog::AllowListViewDrag(TObject * Sender, int X, int Y){  TListItem * Item = dynamic_cast<TListView*>(Sender)->GetItemAt(X, Y);  FListViewDragDest = Item ? Item->Index : -1;  return (FListViewDragDest >= 0) && (FListViewDragDest != FListViewDragSource);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::CustomCommandsViewDragDrop(      TObject * Sender, TObject * Source, int X, int Y){  if (Source == CustomCommandsView)  {    if (AllowListViewDrag(Sender, X, Y))    {      CustomCommandMove(FListViewDragSource, FListViewDragDest);    }  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::ListViewDragOver(  TObject * Sender, TObject * Source, int X, int Y,  TDragState /*State*/, bool & Accept){  if (Source == Sender)  {    // cannot use AllowListViewDrag(X, Y) because of bug in VCL    // (when dropped on item itself, when it was dragged over another item before,    // that another item remains highlighted forever)    Accept = true;    ScrollOnDragOver(Source)->DragOver(TPoint(X, Y));  }}//---------------------------------------------------------------------------const TCopyParamType * TPreferencesDialog::GetCopyParam(int Index){  if (Index == 0)  {    return &FCopyParams;  }  else  {    return FCopyParamList->CopyParams[Index - 1];  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::CopyParamMove(int Source, int Dest){  if (Source >= 1 && Source < (1 + FCopyParamList->Count) &&      Dest >= 0 && Dest < (1 + FCopyParamList->Count))  {    if (Dest == 0)    {      Dest = 1;    }    FCopyParamList->Move(Source - 1, Dest - 1);    // workaround for bug in VCL    CopyParamListView->ItemIndex = -1;    CopyParamListView->ItemFocused = CopyParamListView->Selected;    CopyParamListView->ItemIndex = Dest;    UpdateCopyParamListView();    UpdateControls();  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::CopyParamListViewDragDrop(  TObject * Sender, TObject * Source, int X, int Y){  if (Source == CopyParamListView)  {    if (AllowListViewDrag(Sender, X, Y))    {      CopyParamMove(FListViewDragSource, FListViewDragDest);    }  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::UpDownCopyParamButtonClick(TObject * Sender){  CopyParamMove(CopyParamListView->ItemIndex,    CopyParamListView->ItemIndex + (Sender == UpCopyParamButton ? -1 : 1));}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::RemoveCopyParamButtonClick(  TObject * /*Sender*/){  assert(CopyParamListView->ItemIndex >= 1 &&    CopyParamListView->ItemIndex < (1 + FCopyParamList->Count));  FCopyParamList->Delete(CopyParamListView->ItemIndex - 1);  UpdateCopyParamListView();  UpdateControls();}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::AddEditCopyParam(TCopyParamPresetMode Mode){  int Index = CopyParamListView->ItemIndex;  bool Result;  if ((Index == 0) && (Mode == cpmEdit))  {    Result = DoCopyParamCustomDialog(FCopyParams, 0);  }  else  {    TCopyParamRuleData * CopyParamRuleData =      (FDialogData != NULL ? FDialogData->CopyParamRuleData : NULL);    // negative (when default is selected) means add to the end    Index--;    Result = DoCopyParamPresetDialog(FCopyParamList, Index, Mode, CopyParamRuleData, FCopyParams);    if (Result)    {      UpdateCopyParamListView();      CopyParamListView->ItemIndex = Index + 1;      // when using duplicate button, focus remains on original item      CopyParamListView->ItemFocused = CopyParamListView->Selected;    }  }  if (Result)  {    UpdateControls();  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::AddCopyParamButtonClick(TObject * /*Sender*/){  AddEditCopyParam(cpmAdd);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::EditCopyParamButtonClick(TObject * /*Sender*/){  AddEditCopyParam(cpmEdit);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::DuplicateCopyParamButtonClick(TObject * /*Sender*/){  AddEditCopyParam(cpmDuplicate);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::CopyParamListViewDblClick(  TObject * /*Sender*/){  if (EditCopyParamButton->Enabled)  {    AddEditCopyParam(cpmEdit);  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::CopyParamListViewKeyDown(  TObject * /*Sender*/, WORD & Key, TShiftState /*Shift*/){  if (RemoveCopyParamButton->Enabled && (Key == VK_DELETE))  {    RemoveCopyParamButtonClick(NULL);  }  if (AddCopyParamButton->Enabled && (Key == VK_INSERT))  {    AddEditCopyParam(cpmAdd);  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::EditorMove(int Source, int Dest){  if (Source >= 0 && Source < FEditorList->Count &&      Dest >= 0 && Dest < FEditorList->Count)  {    FEditorList->Move(Source, Dest);    // workaround for bug in VCL    EditorListView3->ItemIndex = -1;    EditorListView3->ItemFocused = EditorListView3->Selected;    EditorListView3->ItemIndex = Dest;    UpdateEditorListView();    UpdateControls();  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::EditorListView3DragDrop(TObject * Sender,  TObject * Source, int X, int Y){  if (Source == EditorListView3)  {    if (AllowListViewDrag(Sender, X, Y))    {      EditorMove(FListViewDragSource, FListViewDragDest);    }  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::UpDownEditorButtonClick(TObject *Sender){  EditorMove(EditorListView3->ItemIndex,    EditorListView3->ItemIndex + (Sender == UpEditorButton ? -1 : 1));}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::RemoveEditorButtonClick(  TObject * /*Sender*/){  assert(EditorListView3->ItemIndex >= 0 &&    EditorListView3->ItemIndex < FEditorList->Count);  FEditorList->Delete(EditorListView3->ItemIndex);  UpdateEditorListView();  UpdateControls();}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::AddEditEditorButtonClick(TObject * Sender){  TEditorPreferencesMode Mode = (Sender == EditEditorButton ? epmEdit : epmAdd);  int Index = EditorListView3->ItemIndex;  TEditorPreferences * Editor;  if (Mode == epmEdit)  {    Editor = new TEditorPreferences(*FEditorList->Editors[Index]);  }  else  {    Editor = new TEditorPreferences();  }  try  {    bool DummyRemember = false;    if (DoEditorPreferencesDialog(Editor->GetData(), DummyRemember, Mode, true))    {      if (Mode == epmEdit)      {        FEditorList->Change(Index, Editor);      }      else      {        if (Index < 0)        {          Index = FEditorList->Count;          FEditorList->Add(Editor);        }        else        {          FEditorList->Insert(Index, Editor);        }      }      // ownership of the object lost      Editor = NULL;      UpdateEditorListView();      EditorListView3->ItemIndex = Index;      UpdateControls();    }  }  __finally  {    delete Editor;  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::EditorListView3DblClick(TObject * /*Sender*/){  if (EditEditorButton->Enabled)  {    AddEditEditorButtonClick(EditEditorButton);  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::EditorListView3KeyDown(TObject * /*Sender*/,  WORD & Key, TShiftState /*Shift*/){  if (RemoveEditorButton->Enabled && (Key == VK_DELETE))  {    RemoveEditorButtonClick(NULL);  }  if (AddEditorButton->Enabled && (Key == VK_INSERT))  {    AddEditEditorButtonClick(AddEditorButton);  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::UpdateEditorListView(){  EditorListView3->Items->Count = FEditorList->Count;  AdjustListColumnsWidth(EditorListView3);  EditorListView3->Invalidate();}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::EditorListView3Data(TObject * /*Sender*/,  TListItem * Item){  // WORKAROUND We get here on Wine after destructor is called  if (FEditorList != NULL)  {    int Index = Item->Index;    assert(Index >= 0 && Index <= FEditorList->Count);    const TEditorPreferences * Editor = FEditorList->Editors[Index];    Item->Caption = Editor->Name;    Item->SubItems->Add(Editor->Data->FileMask.Masks);    if (Editor->Data->Editor == edExternal)    {      Item->SubItems->Add(BooleanToStr(Editor->Data->ExternalEditorText));    }  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::NavigationTreeChange(TObject * /*Sender*/,  TTreeNode * Node){  if (ALWAYS_TRUE(Node->SelectedIndex > 0))  {    PageControl->ActivePage = NOT_NULL(FindPageForTreeNode(Node));    // reshow the accelerators, etc    ResetSystemSettings(this);    // This is particularly here to enable EditCopyParamButton,    // as to some reason CopyParamListView->Selected is NULL until    // its page is shown for the first time    UpdateControls();  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::PageControlChange(TObject * /*Sender*/){  // this is probably only ever called from FormShow (explicitly)  bool Found = false;  if (ALWAYS_TRUE(PageControl->ActivePage->Tag > 0))  {    for (int Index = 0; Index < NavigationTree->Items->Count; Index++)    {      if (NavigationTree->Items->Item[Index]->SelectedIndex ==            PageControl->ActivePage->Tag)      {        NavigationTree->Items->Item[Index]->Selected = true;        Found = true;      }    }  }  if (ALWAYS_TRUE(Found))  {    UpdateControls();  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::CMDialogKey(TWMKeyDown & Message){  if (Message.CharCode == VK_TAB)  {    TShiftState Shift = KeyDataToShiftState(Message.KeyData);    if (Shift.Contains(ssCtrl))    {      TTreeNode * Node = NavigationTree->Selected;      if (!Shift.Contains(ssShift))      {        Node = Node->GetNext();        if (!Node) Node = NavigationTree->Items->GetFirstNode();      }      else      {        if (Node->GetPrev()) Node = Node->GetPrev();          else        while (Node->GetNext()) Node = Node->GetNext();      }      Node->Selected = True;      Message.Result = 1;      return;    }  }  TForm::Dispatch(&Message);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::WMHelp(TWMHelp & Message){  assert(Message.HelpInfo != NULL);  if (Message.HelpInfo->iContextType == HELPINFO_WINDOW)  {    // invoke help for active page (not for whole form), regardless of focus    // (e.g. even if focus is on control outside pagecontrol)    Message.HelpInfo->hItemHandle = PageControl->ActivePage->Handle;  }  TForm::Dispatch(&Message);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::Dispatch(void *Message){  TMessage * M = reinterpret_cast<TMessage*>(Message);  assert(M);  if (M->Msg == CM_DIALOGKEY)  {    CMDialogKey(*((TWMKeyDown *)Message));  }  else if (M->Msg == WM_HELP)  {    WMHelp(*((TWMHelp *)Message));  }  else  {    TForm::Dispatch(Message);  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::RegisterAsUrlHandlersButtonClick(  TObject * /*Sender*/){  MenuPopup(RegisterAsUrlHandlerMenu, RegisterAsUrlHandlersButton);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::RegisterAsUrlHandlerItemClick(TObject * /*Sender*/){  unsigned int Result =    MessageDialog(MainInstructions(LoadStr(CONFIRM_REGISTER_URL2)),      qtConfirmation, qaYes | qaNo, HELP_REGISTER_URL);  if (Result == qaYes)  {    TInstantOperationVisualizer Visualizer;    RegisterForDefaultProtocols();  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::UnregisterForDefaultProtocolsItemClick(TObject * /*Sender*/){  unsigned int Result =    MessageDialog(MainInstructions(LoadStr(CONFIRM_UNREGISTER_URL)),      qtConfirmation, qaYes | qaNo, HELP_REGISTER_URL);  if (Result == qaYes)  {    TInstantOperationVisualizer Visualizer;    UnregisterForProtocols();  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::MakeDefaultHandlerItemClick(TObject * /*Sender*/){  TOperationVisualizer Visualizer;  LaunchAdvancedAssociationUI();}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::DDExtLabelClick(TObject * Sender){  ((Sender == DDExtEnabledLabel) ? DDExtEnabledButton : DDExtDisabledButton)->    SetFocus();}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::AddSearchPathButtonClick(  TObject * /*Sender*/){  UnicodeString AppPath = ExtractFilePath(Application->ExeName);  if (MessageDialog(MainInstructions(FMTLOAD(CONFIRM_ADD_SEARCH_PATH, (AppPath))),        qtConfirmation, qaYes | qaNo, HELP_ADD_SEARCH_PATH) == qaYes)  {    TInstantOperationVisualizer Visualizer;    AddSearchPath(AppPath);  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::EditorFontLabelDblClick(  TObject * Sender){  EditorFontButtonClick(Sender);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::UpdateCopyParamListView(){  CopyParamListView->Items->Count = 1 + FCopyParamList->Count;  AdjustListColumnsWidth(CopyParamListView);  CopyParamListView->Invalidate();}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::CopyParamListViewData(TObject * /*Sender*/,  TListItem * Item){  // WORKAROUND We get here on Wine after destructor is called  if (FCopyParamList != NULL)  {    UnicodeString Name;    UnicodeString Rule;    int Index = Item->Index;    if (Index == 0)    {      Name = StripHotkey(LoadStr(COPY_PARAM_DEFAULT));    }    else    {      assert(Index >= 1 && Index <= 1 + FCopyParamList->Count);      Name = StripHotkey(FCopyParamList->Names[Index - 1]);      Rule = BooleanToStr(FCopyParamList->Rules[Index - 1] != NULL);    }    Item->Caption = Name;    Item->SubItems->Add(Rule);  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::HelpButtonClick(TObject * /*Sender*/){  FormHelp(this);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::PuttyPathBrowseButtonClick(  TObject * /*Sender*/){  UnicodeString Executables = FORMAT("%s;%s", (OriginalPuttyExecutable, KittyExecutable));  BrowseForExecutable(PuttyPathEdit, LoadStr(PREFERENCES_SELECT_PUTTY2),    FMTLOAD(PREFERENCES_PUTTY_FILTER2, (Executables)), false, false);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::PathEditBeforeDialog(  TObject * /*Sender*/, UnicodeString & Name, bool & /*Action*/){  FBeforeDialogPath = Name;  Name = ExpandEnvironmentVariables(Name);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::PathEditAfterDialog(  TObject * /*Sender*/, UnicodeString & Name, bool & /*Action*/){  if (CompareFileName(Name, ExpandEnvironmentVariables(FBeforeDialogPath)))  {    Name = FBeforeDialogPath;  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::NavigationTreeCollapsing(  TObject * /*Sender*/, TTreeNode * /*Node*/, bool & AllowCollapse){  AllowCollapse = false;}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::ListViewEndDrag(  TObject * Sender, TObject * /*Target*/, int /*X*/, int /*Y*/){  ScrollOnDragOver(Sender)->EndDrag();}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::PathEditCreateEditDialog(  TObject * Sender, TFileDialogKind DialogKind, TOpenDialog *& Dialog){  USEDPARAM(DialogKind);  assert(DialogKind == dkOpen);  Dialog = new TOpenDialog(dynamic_cast<TComponent *>(Sender));}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::SessionReopenTimeoutEditSetValue(  TObject * /*Sender*/, Extended Value, UnicodeString & Text, bool & Handled){  if (Value == 0)  {    Text = LoadStr(PREFERENCES_RECONNECT_TIMEOUT_UNLIMITED);    Handled = true;  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::SessionReopenTimeoutEditGetValue(  TObject * /*Sender*/, UnicodeString Text, Extended & Value, bool & Handled){  if (AnsiSameText(Text, LoadStr(PREFERENCES_RECONNECT_TIMEOUT_UNLIMITED)))  {    Value = 0;    Handled = true;  }}//---------------------------------------------------------------------------bool __fastcall TPreferencesDialog::CanSetMasterPassword(){  bool Result;  bool Retry;  do  {    Retry = false;    Result = !AnyOtherInstanceOfSelf();    if (!Result)    {      unsigned int Answer =        MessageDialog(          LoadStr(MASTER_PASSWORD_OTHER_INSTANCE),          qtConfirmation, qaRetry | qaIgnore | qaCancel,          HELP_MASTER_PASSWORD);      switch (Answer)      {        case qaRetry:          Retry = true;          break;        case qaIgnore:          Result = true;          break;        case qaCancel:        default:          // noop          break;      }    }  }  while (Retry && !Result);  return Result;}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::MasterPasswordChanged(  UnicodeString Message, TStrings * RecryptPasswordErrors){  // Save master password.  // This is unlikely to fail, as storage is written explicitly already  // when writing the recrypted passwords  Configuration->SaveExplicit();  TQueryType QueryType = qtInformation;  if (RecryptPasswordErrors->Count > 0)  {    Message = FMTLOAD(MASTER_PASSWORD_RECRYPT_ERRORS, (Message));    QueryType = qtWarning;  }  MoreMessageDialog(    Message, RecryptPasswordErrors, QueryType, qaOK, HELP_MASTER_PASSWORD);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::ChangeMasterPassword(UnicodeString Message){  UnicodeString NewPassword;  if (DoChangeMasterPasswordDialog(NewPassword))  {    std::unique_ptr<TStrings> RecryptPasswordErrors(new TStringList());    WinConfiguration->ChangeMasterPassword(NewPassword, RecryptPasswordErrors.get());    MasterPasswordChanged(Message, RecryptPasswordErrors.get());  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::UseMasterPasswordCheckClick(  TObject * /*Sender*/){  if (UseMasterPasswordCheck->Checked != WinConfiguration->UseMasterPassword)  {    try    {      if (CanSetMasterPassword())      {        if (UseMasterPasswordCheck->Checked)        {          ChangeMasterPassword(LoadStr(MASTER_PASSWORD_SET2));        }        else        {          if (DoMasterPasswordDialog())          {            std::unique_ptr<TStrings> RecryptPasswordErrors(new TStringList());            WinConfiguration->ClearMasterPassword(RecryptPasswordErrors.get());            MasterPasswordChanged(LoadStr(MASTER_PASSWORD_CLEARED2), RecryptPasswordErrors.get());          }        }      }    }    __finally    {      UseMasterPasswordCheck->Checked = WinConfiguration->UseMasterPassword;      UpdateControls();    }  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::SetMasterPasswordButtonClick(  TObject * /*Sender*/){  if (CanSetMasterPassword())  {    ChangeMasterPassword(MainInstructions(LoadStr(MASTER_PASSWORD_CHANGED)));  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::UsageViewButtonClick(TObject * /*Sender*/){  std::unique_ptr<TStrings> Data(TextToStringList(GetUsageData()));  UnicodeString Message =    Data->Text.IsEmpty() ? MainInstructions(LoadStr(USAGE_DATA_NONE)) : LoadStr(USAGE_DATA2);  MoreMessageDialog(Message, Data.get(), qtInformation, qaOK, HELP_USAGE);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::CopyParamLabelClick(TObject * /*Sender*/){  if (EditCopyParamButton->Enabled)  {    AddEditCopyParam(cpmEdit);  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::CopyParamListViewCustomDrawItem(  TCustomListView * Sender, TListItem * Item,  TCustomDrawState /*State*/, bool & /*DefaultDraw*/){  if (Item->Index == 0)  {    Sender->Canvas->Font->Style = Sender->Canvas->Font->Style << fsBold;  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::SelectPuttyRegistryStorageKey(const UnicodeString & Key){  PuttyRegistryStorageKeyEdit->ItemIndex =    PuttyRegistryStorageKeyEdit->Items->IndexOf(Key);}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::PuttyPathEditChange(TObject * /*Sender*/){  UnicodeString PuttyPath = PuttyPathEdit->Text;  if (ContainsText(PuttyPath, OriginalPuttyExecutable))  {    SelectPuttyRegistryStorageKey(OriginalPuttyRegistryStorageKey);  }  else if (ContainsText(PuttyPath, KittyExecutable))  {    SelectPuttyRegistryStorageKey(KittyRegistryStorageKey);  }  UpdateControls();}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::NavigationTreeChanging(TObject * /*Sender*/,  TTreeNode * Node, bool & /*AllowChange*/){  TTabSheet * Sheet = FindPageForTreeNode(Node);  // delay load as this can be time consuming  if (Sheet == LanguagesSheet)  {    LoadLanguages();  }}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::LanguagesGetMoreButtonClick(TObject * /*Sender*/){  OpenBrowser(LoadStr(LOCALES_URL));}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::CommanderClick(TObject * /*Sender*/){  CommanderInterfaceButton2->SetFocus();}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::ExplorerClick(TObject * /*Sender*/){  ExplorerInterfaceButton2->SetFocus();}//---------------------------------------------------------------------------void __fastcall TPreferencesDialog::PanelFontLabelDblClick(TObject * Sender){  PanelFontButtonClick(Sender);}//---------------------------------------------------------------------------
 |