/// <summary> /// Constructor. /// </summary> public Setup() { Logger.Debug("Entering constructor."); // Defines how to show the setup window. Controller.ShowWindowEvent += delegate { Dispatcher.BeginInvoke((Action)delegate { Logger.Debug("Entering ShowWindowEvent."); Show(); Activate(); BringIntoView(); Logger.Debug("Exiting ShowWindowEvent."); }); }; // Defines how to hide the setup windows. Controller.HideWindowEvent += delegate { Dispatcher.BeginInvoke((Action)delegate { Hide(); }); }; // Defines what to do when changing page. // The remote folder addition wizard has several steps. Controller.ChangePageEvent += delegate(PageType type) { Dispatcher.BeginInvoke((Action)delegate { Logger.Debug("Entering ChangePageEvent."); Reset(); //Remove window activated event handler if one exists... if (windowActivatedEventHandler != null) { Logger.Debug("Removing window activated event handler"); Activated -= windowActivatedEventHandler; windowActivatedEventHandler = null; } // Show appropriate setup page. switch (type) { // Welcome page that shows up at first run. #region Page Setup case PageType.Setup: { // GUI elements. Header = Properties_Resources.Welcome; Description = Properties_Resources.Intro; Button cancel_button = new Button() { Content = Properties_Resources.Cancel }; Button continue_button = new Button() { Content = Properties_Resources.Continue, IsEnabled = false }; Buttons.Add(continue_button); Buttons.Add(cancel_button); continue_button.Focus(); // Actions. Controller.UpdateSetupContinueButtonEvent += delegate(bool enabled) { Dispatcher.BeginInvoke((Action)delegate { continue_button.IsEnabled = enabled; }); }; cancel_button.Click += delegate { Dispatcher.BeginInvoke((Action)delegate { Program.UI.StatusIcon.Dispose(); Controller.SetupPageCancelled(); }); }; continue_button.Click += delegate { Controller.SetupPageCompleted(); }; Controller.CheckSetupPage(); break; } #endregion #region Page Tutorial case PageType.Tutorial: { switch (Controller.TutorialCurrentPage) { // First page of the tutorial. case 1: { // GUI elements. Header = Properties_Resources.WhatsNext; Description = Properties_Resources.CmisSyncCreates; WPF.Image slide_image = new WPF.Image() { Width = 350, Height = 200 }; slide_image.Source = UIHelpers.GetImageSource("tutorial-slide-1"); Button skip_tutorial_button = new Button() { Content = Properties_Resources.SkipTutorial }; Button continue_button = new Button() { Content = Properties_Resources.Continue }; ContentCanvas.Children.Add(slide_image); Canvas.SetLeft(slide_image, 215); Canvas.SetTop(slide_image, 130); Buttons.Add(continue_button); Buttons.Add(skip_tutorial_button); // Actions. skip_tutorial_button.Click += delegate { Controller.TutorialSkipped(); }; continue_button.Click += delegate { Controller.TutorialPageCompleted(); }; break; } // Second page of the tutorial. case 2: { // GUI elements. Header = Properties_Resources.Synchronization; Description = Properties_Resources.DocumentsAre; Button continue_button = new Button() { Content = Properties_Resources.Continue }; WPF.Image slide_image = new WPF.Image() { Width = 350, Height = 200 }; slide_image.Source = UIHelpers.GetImageSource("tutorial-slide-2"); ContentCanvas.Children.Add(slide_image); Canvas.SetLeft(slide_image, 215); Canvas.SetTop(slide_image, 130); Buttons.Add(continue_button); // Actions. continue_button.Click += delegate { Controller.TutorialPageCompleted(); }; break; } // Third page of the tutorial. case 3: { // GUI elements. Header = Properties_Resources.StatusIcon; Description = Properties_Resources.StatusIconShows; Button continue_button = new Button() { Content = Properties_Resources.Continue }; WPF.Image slide_image = new WPF.Image() { Width = 350, Height = 200 }; slide_image.Source = UIHelpers.GetImageSource("tutorial-slide-3"); ContentCanvas.Children.Add(slide_image); Canvas.SetLeft(slide_image, 215); Canvas.SetTop(slide_image, 130); Buttons.Add(continue_button); // Actions. continue_button.Click += delegate { Controller.TutorialPageCompleted(); }; break; } // Fourth page of the tutorial. case 4: { // GUI elements. Header = Properties_Resources.AddFolders; Description = Properties_Resources.YouCan; Button finish_button = new Button() { Content = Properties_Resources.Finish }; WPF.Image slide_image = new WPF.Image() { Width = 350, Height = 200 }; slide_image.Source = UIHelpers.GetImageSource("tutorial-slide-4"); CheckBox check_box = new CheckBox() { Content = Properties_Resources.Startup, IsChecked = true }; ContentCanvas.Children.Add(slide_image); Canvas.SetLeft(slide_image, 215); Canvas.SetTop(slide_image, 130); ContentCanvas.Children.Add(check_box); Canvas.SetLeft(check_box, 185); Canvas.SetBottom(check_box, 12); Buttons.Add(finish_button); // Actions. check_box.Click += delegate { Controller.StartupItemChanged(check_box.IsChecked.Value); }; finish_button.Click += delegate { Controller.TutorialPageCompleted(); }; break; } } break; } #endregion // First step of the remote folder addition dialog: Specifying the server. #region Page Add1 case PageType.Add1: { // GUI elements. Header = Properties_Resources.Where; // Address input GUI. TextBlock address_label = new TextBlock() { Text = Properties_Resources.EnterWebAddress, FontWeight = FontWeights.Bold }; TextBox address_box = new TextBox() { Width = 420, Text = (Controller.PreviousAddress != null) ? Controller.PreviousAddress.ToString() : "" }; TextBlock address_help_label = new TextBlock() { Text = Properties_Resources.Help + ": ", FontSize = 11, Foreground = new SolidColorBrush(Color.FromRgb(128, 128, 128)) }; Run run = new Run(Properties_Resources.WhereToFind); Hyperlink link = new Hyperlink(run); link.NavigateUri = new Uri("https://github.com/aegif/CmisSync/wiki/What-address"); address_help_label.Inlines.Add(link); link.RequestNavigate += (sender, e) => { System.Diagnostics.Process.Start(e.Uri.ToString()); }; // Rather than a TextBlock, we use a textBox so that users can copy/paste the error message and Google it. TextBox address_error_label = new TextBox() { FontSize = 11, Foreground = new SolidColorBrush(Color.FromRgb(255, 128, 128)), TextWrapping = TextWrapping.Wrap, Visibility = Visibility.Hidden, BorderThickness = new Thickness(0), IsReadOnly = true, Background = Brushes.Transparent, MaxWidth = 420 }; // User input GUI. TextBlock user_label = new TextBlock() { Text = Properties_Resources.User + ":", FontWeight = FontWeights.Bold, Width = 200 }; TextBox user_box = new TextBox() { Width = 200 }; if (Controller.saved_user == String.Empty || Controller.saved_user == null) { user_box.Text = Environment.UserName; } else { user_box.Text = Controller.saved_user; } TextBlock user_help_label = new TextBlock() { FontSize = 11, Width = 200, Foreground = new SolidColorBrush(Color.FromRgb(128, 128, 128)) }; // Password input GUI. TextBlock password_label = new TextBlock() { Text = Properties_Resources.Password + ":", FontWeight = FontWeights.Bold, Width = 200 }; PasswordBox password_box = new PasswordBox() { Width = 200 }; TextBlock password_help_label = new TextBlock() { FontSize = 11, Width = 200, Foreground = new SolidColorBrush(Color.FromRgb(128, 128, 128)) }; // Buttons. Button cancel_button = new Button() { Content = Properties_Resources.Cancel }; Button continue_button = new Button() { Content = Properties_Resources.Continue }; Buttons.Add(continue_button); Buttons.Add(cancel_button); // Address ContentCanvas.Children.Add(address_label); Canvas.SetTop(address_label, 100); Canvas.SetLeft(address_label, 185); ContentCanvas.Children.Add(address_box); Canvas.SetTop(address_box, 120); Canvas.SetLeft(address_box, 185); ContentCanvas.Children.Add(address_help_label); Canvas.SetTop(address_help_label, 145); Canvas.SetLeft(address_help_label, 185); // User ContentCanvas.Children.Add(user_label); Canvas.SetTop(user_label, 160); Canvas.SetLeft(user_label, 185); ContentCanvas.Children.Add(user_box); Canvas.SetTop(user_box, 180); Canvas.SetLeft(user_box, 185); ContentCanvas.Children.Add(user_help_label); Canvas.SetTop(user_help_label, 215); Canvas.SetLeft(user_help_label, 185); // Password ContentCanvas.Children.Add(password_label); Canvas.SetTop(password_label, 160); Canvas.SetRight(password_label, 30); ContentCanvas.Children.Add(password_box); Canvas.SetTop(password_box, 180); Canvas.SetRight(password_box, 30); ContentCanvas.Children.Add(password_help_label); Canvas.SetTop(password_help_label, 215); Canvas.SetRight(password_help_label, 30); ContentCanvas.Children.Add(address_error_label); Canvas.SetTop(address_error_label, 220); Canvas.SetLeft(address_error_label, 185); TaskbarItemInfo.ProgressValue = 0.0; TaskbarItemInfo.ProgressState = TaskbarItemProgressState.None; if (Controller.PreviousAddress == null || Controller.PreviousAddress.ToString() == String.Empty) address_box.Text = "https://"; else address_box.Text = Controller.PreviousAddress.ToString(); address_box.Focus(); address_box.Select(address_box.Text.Length, 0); // Actions. Controller.ChangeAddressFieldEvent += delegate(string text, string example_text) { Dispatcher.BeginInvoke((Action)delegate { address_box.Text = text; address_help_label.Text = example_text; }); }; Controller.ChangeUserFieldEvent += delegate(string text, string example_text) { Dispatcher.BeginInvoke((Action)delegate { user_box.Text = text; user_help_label.Text = example_text; }); }; Controller.ChangePasswordFieldEvent += delegate(string text, string example_text) { Dispatcher.BeginInvoke((Action)delegate { password_box.Password = text; password_help_label.Text = example_text; }); }; Controller.UpdateAddProjectButtonEvent += delegate(bool button_enabled) { Dispatcher.BeginInvoke((Action)delegate { continue_button.IsEnabled = button_enabled; }); }; Controller.CheckAddPage(address_box.Text); address_box.TextChanged += delegate { string error = Controller.CheckAddPage(address_box.Text); if (!String.IsNullOrEmpty(error)) { address_error_label.Text = Properties_Resources.ResourceManager.GetString(error, CultureInfo.CurrentCulture); address_error_label.Visibility = Visibility.Visible; } else address_error_label.Visibility = Visibility.Hidden; }; cancel_button.Click += delegate { Controller.PageCancelled(); }; continue_button.Click += delegate { // Show wait cursor System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor; // Try to find the CMIS server (asynchronously) GetRepositoriesFuzzyDelegate dlgt = new GetRepositoriesFuzzyDelegate(CmisUtils.GetRepositoriesFuzzy); ServerCredentials credentials = new ServerCredentials() { UserName = user_box.Text, Password = password_box.Password, Address = new Uri(address_box.Text) }; IAsyncResult ar = dlgt.BeginInvoke(credentials, null, null); while (!ar.AsyncWaitHandle.WaitOne(100)) { System.Windows.Forms.Application.DoEvents(); } Tuple<CmisServer, Exception> result = dlgt.EndInvoke(ar); CmisServer cmisServer = result.Item1; Controller.repositories = cmisServer != null ? cmisServer.Repositories : null; address_box.Text = cmisServer.Url.ToString(); // Hide wait cursor System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default; if (Controller.repositories == null) { // Could not retrieve repositories list from server, show warning. string warning = ""; string message = result.Item2.Message; Exception e = result.Item2; if (e is PermissionDeniedException) { warning = Properties_Resources.LoginFailedForbidden; } else if (e is ServerNotFoundException) { warning = Properties_Resources.ConnectFailure; } else if (e.Message == "SendFailure" && cmisServer.Url.Scheme.StartsWith("https")) { warning = Properties_Resources.SendFailureHttps; } else if (e.Message == "TrustFailure") { warning = Properties_Resources.TrustFailure; } else { warning = message + Environment.NewLine + Properties_Resources.Sorry; } address_error_label.Text = warning; address_error_label.Visibility = Visibility.Visible; } else { // Continue to next step, which is choosing a particular folder. Controller.Add1PageCompleted( new Uri(address_box.Text), user_box.Text, password_box.Password); } }; break; } #endregion // Second step of the remote folder addition dialog: choosing the folder. #region Page Add2 case PageType.Add2: { // GUI elements. Header = Properties_Resources.Which; // A tree allowing the user to browse CMIS repositories/folders. /*if(TODO check if OpenDataSpace, and further separate code below) { System.Uri resourceLocater = new System.Uri("/CmisSync;component/TreeView.xaml", System.UriKind.Relative); System.Windows.Controls.TreeView treeView = System.Windows.Application.LoadComponent(resourceLocater) as TreeView; ObservableCollection<CmisRepo> repos = new ObservableCollection<CmisRepo>(); */ System.Windows.Controls.TreeView treeView = new System.Windows.Controls.TreeView(); treeView.Width = 410; treeView.Height = 267; // Some CMIS servers hold several repositories (ex:Nuxeo). Show one root per repository. foreach (KeyValuePair<String, String> repository in Controller.repositories) { System.Windows.Controls.TreeViewItem item = new System.Windows.Controls.TreeViewItem(); item.Tag = new SelectionTreeItem(repository.Key, "/"); item.Header = repository.Value; treeView.Items.Add(item); } ContentCanvas.Children.Add(treeView); Canvas.SetTop(treeView, 70); Canvas.SetLeft(treeView, 185); // Action: when an element in the tree is clicked, loads its children and show them. treeView.SelectedItemChanged += delegate { // Identify the selected remote path. TreeViewItem item = (TreeViewItem)treeView.SelectedItem; Controller.saved_remote_path = ((SelectionTreeItem)item.Tag).fullPath; // Identify the selected repository. object cursor = item; while (cursor is TreeViewItem) { TreeViewItem treeViewItem = (TreeViewItem)cursor; cursor = treeViewItem.Parent; if (!(cursor is TreeViewItem)) { Controller.saved_repository = ((SelectionTreeItem)treeViewItem.Tag).repository; } } // Load sub-folders if it has not been done already. // We use each item's Tag to store metadata: whether this item's subfolders have been loaded or not. if (((SelectionTreeItem)item.Tag).childrenLoaded == false) { System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor; // Get list of subfolders (asynchronously) GetSubfoldersDelegate dlgt = new GetSubfoldersDelegate(CmisUtils.GetSubfolders); IAsyncResult ar = dlgt.BeginInvoke(Controller.saved_repository, Controller.saved_remote_path, Controller.saved_address.ToString(), Controller.saved_user, Controller.saved_password, null, null); while (!ar.AsyncWaitHandle.WaitOne(100)) { System.Windows.Forms.Application.DoEvents(); } string[] subfolders = dlgt.EndInvoke(ar); // Create a sub-item for each subfolder foreach (string subfolder in subfolders) { System.Windows.Controls.TreeViewItem subItem = new System.Windows.Controls.TreeViewItem(); subItem.Tag = new SelectionTreeItem(null, subfolder); subItem.Header = Path.GetFileName(subfolder); item.Items.Add(subItem); } ((SelectionTreeItem)item.Tag).childrenLoaded = true; item.ExpandSubtree(); System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default; } }; Button cancel_button = new Button() { Content = Properties_Resources.Cancel }; Button continue_button = new Button() { Content = CmisSync.Properties_Resources.ResourceManager.GetString("Continue", CultureInfo.CurrentCulture) }; Button back_button = new Button() { Content = Properties_Resources.Back, IsDefault = false }; Buttons.Add(back_button); Buttons.Add(continue_button); Buttons.Add(cancel_button); continue_button.Focus(); cancel_button.Click += delegate { Controller.PageCancelled(); }; continue_button.Click += delegate { Controller.Add2PageCompleted( Controller.saved_repository, Controller.saved_remote_path); }; back_button.Click += delegate { Controller.BackToPage1(); }; break; } #endregion // Third step of the remote folder addition dialog: Customizing the local folder. #region Page Customize case PageType.Customize: { string parentFolder = Controller.DefaultRepoPath; // GUI elements. Header = Properties_Resources.Customize; // Customize local folder name TextBlock localfolder_label = new TextBlock() { Text = Properties_Resources.EnterLocalFolderName, FontWeight = FontWeights.Bold, TextWrapping = TextWrapping.Wrap, Width = 420 }; string localfoldername = Controller.saved_address.Host.ToString(); foreach (KeyValuePair<String, String> repository in Controller.repositories) { if (repository.Key == Controller.saved_repository) { localfoldername += "\\" + repository.Value; break; } } TextBox localfolder_box = new TextBox() { Width = 420, Text = localfoldername }; TextBlock localrepopath_label = new TextBlock() { Text = Properties_Resources.ChangeRepoPath, FontWeight = FontWeights.Bold }; TextBox localrepopath_box = new TextBox() { Width = 375, Text = Path.Combine(parentFolder, localfolder_box.Text) }; Button choose_folder_button = new Button() { Width = 40, Content = "..." }; TextBlock localfolder_error_label = new TextBlock() { FontSize = 11, Foreground = new SolidColorBrush(Color.FromRgb(255, 128, 128)), Visibility = Visibility.Hidden, TextWrapping = TextWrapping.Wrap, MaxWidth = 420 }; Button cancel_button = new Button() { Content = Properties_Resources.Cancel }; Button add_button = new Button() { Content = Properties_Resources.Add, IsDefault = true }; Button back_button = new Button() { Content = Properties_Resources.Back }; Buttons.Add(back_button); Buttons.Add(add_button); Buttons.Add(cancel_button); // Local Folder Name ContentCanvas.Children.Add(localfolder_label); Canvas.SetTop(localfolder_label, 160); Canvas.SetLeft(localfolder_label, 185); ContentCanvas.Children.Add(localfolder_box); Canvas.SetTop(localfolder_box, 180); Canvas.SetLeft(localfolder_box, 185); ContentCanvas.Children.Add(localrepopath_label); Canvas.SetTop(localrepopath_label, 200); Canvas.SetLeft(localrepopath_label, 185); ContentCanvas.Children.Add(localrepopath_box); Canvas.SetTop(localrepopath_box, 220); Canvas.SetLeft(localrepopath_box, 185); ContentCanvas.Children.Add(choose_folder_button); Canvas.SetTop(choose_folder_button, 220); Canvas.SetLeft(choose_folder_button, 565); ContentCanvas.Children.Add(localfolder_error_label); Canvas.SetTop(localfolder_error_label, 275); Canvas.SetLeft(localfolder_error_label, 185); TaskbarItemInfo.ProgressValue = 0.0; TaskbarItemInfo.ProgressState = TaskbarItemProgressState.None; localfolder_box.Focus(); localfolder_box.Select(localfolder_box.Text.Length, 0); // Repo path validity. CheckCustomizeInput(localfolder_box, localrepopath_box, localfolder_error_label); // Actions. Controller.UpdateAddProjectButtonEvent += delegate(bool button_enabled) { Dispatcher.BeginInvoke((Action)delegate { if (add_button.IsEnabled != button_enabled) { add_button.IsEnabled = button_enabled; if (button_enabled) { add_button.IsDefault = true; back_button.IsDefault = false; } } }); }; CheckRepoPathAndNameDelegate checkRepoPathAndNameDelegate = delegate() { string error = Controller.CheckRepoPathAndName(localrepopath_box.Text, localfolder_box.Text); if (!String.IsNullOrEmpty(error)) { localfolder_error_label.Text = Properties_Resources.ResourceManager.GetString(error, CultureInfo.CurrentCulture); localfolder_error_label.Visibility = Visibility.Visible; } else { localfolder_error_label.Visibility = Visibility.Hidden; } }; //execute the check on first run... checkRepoPathAndNameDelegate(); localfolder_box.TextChanged += delegate { localrepopath_box.Text = Path.Combine(parentFolder, localfolder_box.Text); }; localrepopath_box.TextChanged += delegate { checkRepoPathAndNameDelegate(); }; windowActivatedEventHandler = new EventHandler(delegate(object sender, EventArgs e) { checkRepoPathAndNameDelegate(); }); Activated += windowActivatedEventHandler; // Choose a folder. choose_folder_button.Click += delegate { System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); if (folderBrowserDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { parentFolder = folderBrowserDialog1.SelectedPath; localrepopath_box.Text = Path.Combine(parentFolder, localfolder_box.Text); } }; // Other actions. cancel_button.Click += delegate { Controller.PageCancelled(); }; back_button.Click += delegate { Controller.BackToPage2(); }; add_button.Click += delegate { Controller.CustomizePageCompleted(localfolder_box.Text, localrepopath_box.Text); }; Controller.LocalPathExists += LocalPathExistsHandler; break; } #endregion // Final page of the remote folder addition dialog: end of the addition wizard. #region Page Finished case PageType.Finished: { // GUI elements. Header = Properties_Resources.Ready; Description = Properties_Resources.YouCanFind; Button finish_button = new Button() { Content = Properties_Resources.Finish }; Button open_folder_button = new Button() { Content = Properties_Resources.OpenFolder }; TaskbarItemInfo.ProgressValue = 0.0; TaskbarItemInfo.ProgressState = TaskbarItemProgressState.None; Buttons.Add(open_folder_button); Buttons.Add(finish_button); // Actions. finish_button.Click += delegate { Controller.FinishPageCompleted(); }; open_folder_button.Click += delegate { Controller.OpenFolderClicked(); }; SystemSounds.Exclamation.Play(); break; } #endregion // Settings dialog. #region Page Settings case PageType.Settings: { // GUI elements. Header = Properties_Resources.Settings; // Address input GUI. TextBlock address_label = new TextBlock() { Text = Properties_Resources.WebAddress, FontWeight = FontWeights.Bold }; TextBox address_box = new TextBox() { Width = 420, Text = Controller.saved_address.ToString(), IsEnabled = false, }; // User input GUI. TextBlock user_label = new TextBlock() { Text = Properties_Resources.User + ":", FontWeight = FontWeights.Bold, Width = 200 }; TextBox user_box = new TextBox() { Width = 200, Text = Controller.saved_user, IsEnabled = false, }; // Password input GUI. TextBlock password_label = new TextBlock() { Text = Properties_Resources.Password + ":", FontWeight = FontWeights.Bold, Width = 200 }; PasswordBox password_box = new PasswordBox() { Width = 200 }; // Rather than a TextBlock, we use a textBox so that users can copy/paste the error message and Google it. TextBox authentication_error_label = new TextBox() { FontSize = 11, Foreground = new SolidColorBrush(Color.FromRgb(255, 128, 128)), Visibility = Visibility.Hidden, IsReadOnly = true, Background = Brushes.Transparent, BorderThickness = new Thickness(0), TextWrapping = TextWrapping.Wrap, MaxWidth = 420 }; // Sync at startup ? CheckBox startup_checkbox = new CheckBox() { Content = Properties_Resources.SyncAtStartup, IsChecked = Controller.saved_syncatstartup, FontWeight = FontWeights.Bold, Width = 400, }; // Sync duration input GUI. TextBlock slider_label = new TextBlock() { Text = Properties_Resources.SyncInterval + ":", FontWeight = FontWeights.Bold, Width = 200, }; PollIntervalSlider slider = new PollIntervalSlider() { Width = 400, PollInterval = Controller.saved_sync_interval }; TextBlock slider_min_label = new TextBlock() { Text = slider.FormattedMinimum(), Width = 200, }; TextBlock slider_max_label = new TextBlock() { Text = slider.FormattedMaximum(), Width = 200, TextAlignment = TextAlignment.Right, }; // Buttons. Button cancel_button = new Button() { Content = Properties_Resources.Cancel }; Button save_button = new Button() { Content = Properties_Resources.Save }; Buttons.Add(save_button); Buttons.Add(cancel_button); // Address ContentCanvas.Children.Add(address_label); Canvas.SetTop(address_label, 50); Canvas.SetLeft(address_label, 185); ContentCanvas.Children.Add(address_box); Canvas.SetTop(address_box, 70); Canvas.SetLeft(address_box, 185); // User ContentCanvas.Children.Add(user_label); Canvas.SetTop(user_label, 110); Canvas.SetLeft(user_label, 185); ContentCanvas.Children.Add(user_box); Canvas.SetTop(user_box, 130); Canvas.SetLeft(user_box, 185); // Password ContentCanvas.Children.Add(password_label); Canvas.SetTop(password_label, 170); Canvas.SetLeft(password_label, 185); ContentCanvas.Children.Add(password_box); Canvas.SetTop(password_box, 190); Canvas.SetLeft(password_box, 185); // Error label ContentCanvas.Children.Add(authentication_error_label); Canvas.SetTop(authentication_error_label, 215); Canvas.SetLeft(authentication_error_label, 185); // Sync at startup ContentCanvas.Children.Add(startup_checkbox); Canvas.SetTop(startup_checkbox, 220); Canvas.SetLeft(startup_checkbox, 185); // Sync Interval ContentCanvas.Children.Add(slider_label); Canvas.SetTop(slider_label, 250); Canvas.SetLeft(slider_label, 185); ContentCanvas.Children.Add(slider); Canvas.SetTop(slider, 270); Canvas.SetLeft(slider, 185); ContentCanvas.Children.Add(slider_min_label); Canvas.SetTop(slider_min_label, 300); Canvas.SetLeft(slider_min_label, 185); ContentCanvas.Children.Add(slider_max_label); Canvas.SetTop(slider_max_label, 300); Canvas.SetLeft(slider_max_label, 385); TaskbarItemInfo.ProgressValue = 0.0; TaskbarItemInfo.ProgressState = TaskbarItemProgressState.None; user_box.Focus(); // Actions. Controller.UpdateAddProjectButtonEvent += delegate(bool button_enabled) { Dispatcher.BeginInvoke((Action)delegate { save_button.IsEnabled = button_enabled; }); }; cancel_button.Click += delegate { Controller.PageCancelled(); }; save_button.Click += delegate { if (!String.IsNullOrEmpty(password_box.Password)) { // Show wait cursor System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor; // Try to find the CMIS server (asynchronously) GetRepositoriesFuzzyDelegate dlgt = new GetRepositoriesFuzzyDelegate(CmisUtils.GetRepositoriesFuzzy); IAsyncResult ar = dlgt.BeginInvoke( new ServerCredentials() { UserName = Controller.saved_user, Password = password_box.Password, Address = Controller.saved_address }, null, null); while (!ar.AsyncWaitHandle.WaitOne(100)) { System.Windows.Forms.Application.DoEvents(); } Tuple<CmisServer, Exception> result = dlgt.EndInvoke(ar); CmisServer cmisServer = result.Item1; Controller.repositories = cmisServer != null ? cmisServer.Repositories : null; // Hide wait cursor System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default; if (Controller.repositories == null) { // Could not retrieve repositories list from server, show warning. string warning = ""; string message = result.Item2.Message; Exception e = result.Item2; if (e is PermissionDeniedException) { warning = Properties_Resources.LoginFailedForbidden; } else if (e is ServerNotFoundException) { warning = Properties_Resources.ConnectFailure; } else if (e.Message == "SendFailure" && cmisServer.Url.Scheme.StartsWith("https")) { warning = Properties_Resources.SendFailureHttps; } else if (e.Message == "TrustFailure") { warning = Properties_Resources.TrustFailure; } else { warning = message + Environment.NewLine + Properties_Resources.Sorry; } authentication_error_label.Text = warning; authentication_error_label.Visibility = Visibility.Visible; } else { // Continue to next step, which is choosing a particular folder. Controller.SettingsPageCompleted(password_box.Password, slider.PollInterval, (bool)startup_checkbox.IsChecked); } } else { Controller.SettingsPageCompleted(null, slider.PollInterval, (bool)startup_checkbox.IsChecked); } }; break; } #endregion } ShowAll(); Logger.Debug("Exiting ChangePageEvent."); }); }; this.Closing += delegate { Controller.PageCancelled(); }; Controller.PageCancelled(); Logger.Debug("Exiting constructor."); }