Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [ComVisible(true)]
- [ClassInterface(ClassInterfaceType.None)]
- [ComDefaultInterface(typeof(IFunctionality))]
- public class ImportFunctionality : IFunctionality
- {
- private ImportWindow _window; // a WPF view
- public ImportFunctionality()
- { }
- public bool CanExecute()
- {
- return CurrentUser.IsAuthorized(AuthId);
- }
- public string AuthId
- {
- get { return GetType().ToString(); }
- }
- /// <summary>
- /// Prompts for an Excel workbook filename and creates pricing tables from workbook data.
- /// </summary>
- public void Execute()
- {
- try
- {
- if (!CanExecute()) throw new NotAuthorizedException(resx.Functionality_Execute_NotAuthorised);
- var xlData = GetExcelSourceData();
- if (xlData == null) return;
- var viewModel = GetImportSettings(xlData);
- if (viewModel == null) return;
- if (!GetUserConfirmation(viewModel)) return;
- ImportGridContent(viewModel);
- }
- catch (NotAuthorizedException exception)
- {
- MsgBox.Failure(resx.NotAuthorized, exception.Message);
- }
- catch (Exception exception)
- {
- MsgBox.Error(exception);
- }
- }
- private DataTable GetExcelSourceData()
- {
- var file = FileDialogHelper.GetOpenFileName(resx.FileDialogFilter_Excel97_2003);
- if (file == string.Empty) return null;
- return Excel8OleDbHelper.ImportExcelFile(file);
- }
- private ImportViewModel GetImportSettings(DataTable xlData)
- {
- var viewModel = new ImportViewModel(xlData);
- // todo: add metadata to viewModel constructor...
- using (var data = new ImportModel(Settings.Default.DefaultDb))
- {
- // Wrap Linq2SQL objects into UI-visible instances:
- var meta = data.LoadImportMetadata()
- .Select(e => new ImportMetaData
- {
- // named property setters
- }).ToList();
- // load metadata into ViewModel:
- viewModel.SetMetadata(new ObservableCollection<ImportMetaData>(meta));
- }
- _window = new ImportWindow(viewModel);
- viewModel.WindowClosing += viewModel_WindowClosing;
- _window.ShowDialog();
- var result = viewModel.DialogResult;
- return (result == DialogResult.Ok)
- ? viewModel
- : null;
- }
- private bool GetUserConfirmation(ImportViewModel viewModel)
- {
- var result = MsgBox.Prompt(resx.ConfirmationRequired, resx.ImportFunctionality_ConfirmProceed);
- return (result == DialogResult.Yes);
- }
- void viewModel_WindowClosing(object sender, EventArgs e)
- {
- _window.Close();
- }
- /// <summary>
- /// Returns a <see cref="IImportData"/> implementation that corresponds to database name specified by supplied <see cref="viewModel"/>.
- /// </summary>
- /// <param name="viewModel"></param>
- /// <returns></returns>
- public IImportData GetTargetConnection(ImportViewModel viewModel)
- {
- var connectionString = Settings.Default[viewModel.SelectedDatabase].ToString();
- return viewModel.SelectedCompany == CompaniesEnum.Company1.ToString()
- ? new ImportDataCompany1(connectionString)
- : viewModel.SelectedCompany == CompaniesEnum.Company2.ToString()
- ? new ImportDataCompany2(connectionString)
- : new ImportData(connectionString)
- // this is begging to be refactored
- ;
- }
- private void ImportGridContent(ImportViewModel viewModel)
- {
- using (var data = GetTargetConnection(viewModel))
- {
- var args = new AsyncImportEventArgs(viewModel, data);
- var iterations = viewModel.GridSource.Rows.Count * viewModel.SelectedMetadata.Count();
- data.BeginTransaction();
- MsgBox.ProgressStatus<AsyncImportEventArgs>(resx.ImportFunctionality_Title, resx.ImportFunctionality_PleaseWait, DoAsyncImport, args, CancelAsyncImport, iterations);
- if (args.Success)
- data.CommitTransaction();
- else
- data.RollbackTransaction();
- }
- }
- protected void DoAsyncImport(AsyncProgressArgs<AsyncImportEventArgs> e)
- {
- // Lengthy operation involving DAL calls and periodically updating the view
- // ...
- // Update the view:
- e.UpdateProgress(resx.ProgressCompleted, maxProgressValue);
- e.UpdateMessage(resx.ImportFunctionality_TitleCompleted);
- }
- private void CancelAsyncImport(AsyncImportEventArgs e)
- {
- e.Success = false;
- e.Data.RollbackTransaction();
- MsgBox.Info(resx.ImportFunctionality_Cancelled_Title, resx.ImportFunctionality_Cancelled_Msg);
- }
- #region nested types
- /// <summary>
- /// Encapsulates parameters passed to async method for importing pricing tables.
- /// </summary>
- public class AsyncImportEventArgs : EventArgs
- {
- public ImportViewModel ViewModel { get; private set; }
- public IImportData Data { get; private set; }
- public bool Success { get; set; }
- public AsyncImportEventArgs(ImportViewModel dialog, IImportData data)
- {
- ViewModel = dialog;
- Data = data;
- }
- }
- #endregion
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement