public static bool TryFindFocusedControl(IInputElement focusedElement, out DataEntryControl focusedControl) { if (focusedElement is FrameworkElement focusedFrameworkElement) { focusedControl = (DataEntryControl)focusedFrameworkElement.Tag; if (focusedControl != null) { return(true); } // for complex controls which dynamic generate child controls, such as date time pickers, the tag of the focused element can't be set // so try to locate a parent of the focused element with a tag indicating the control FrameworkElement parent = null; if (focusedFrameworkElement.Parent != null && focusedFrameworkElement.TemplatedParent is FrameworkElement) { parent = (FrameworkElement)focusedFrameworkElement.Parent; } else if (focusedFrameworkElement.TemplatedParent != null && focusedFrameworkElement.TemplatedParent is FrameworkElement element) { parent = element; } if (parent != null) { return(DataEntryHandler.TryFindFocusedControl(parent, out focusedControl)); } } focusedControl = null; return(false); }
public DataEntryDateTime(ControlRow control, DataEntryControls styleProvider) : base(control, styleProvider, ControlContentStyleEnum.DateTimeBox, ControlLabelStyleEnum.DefaultLabel) { // configure the various elements DataEntryHandler.Configure(this.ContentControl, null); this.ContentControl.GotKeyboardFocus += this.ContentControl_GotKeyboardFocus; this.ContentControl.LostKeyboardFocus += this.ContentControl_LostKeyboardFocus; }
// Get a file path from the global datahandler. // If we can't, or if it does not exist, return String.Empty public static string TryGetFilePathFromGlobalDataHandler() { string path; // If anything is null, we defer resetting anything. Note that we may get an update later (e.g., via the timer) DataEntryHandler handler = Util.GlobalReferences.MainWindow?.DataHandler; if (handler?.ImageCache?.CurrentDifferenceState != null && handler?.FileDatabase != null) { // Get the path path = handler.ImageCache.Current.GetFilePath(handler.FileDatabase.FolderPath); return(File.Exists(path) ? path : null); } return(null); }
/// <summary> /// Generate the controls based upon the control descriptions found in the template /// </summary>> public void CreateControls(FileDatabase database, DataEntryHandler dataEntryPropagator) { // Check the arguments for null ThrowIf.IsNullArgument(dataEntryPropagator, nameof(dataEntryPropagator)); ThrowIf.IsNullArgument(database, nameof(database)); // Depending on how the user interacts with the file import process image set loading can be aborted after controls are generated and then // another image set loaded. Any existing controls therefore need to be cleared. this.Controls.Clear(); this.ControlsByDataLabel.Clear(); this.ControlGrid.Inlines.Clear(); foreach (ControlRow control in database.Controls) { // no point in generating a control if it doesn't render in the UX if (control.Visible == false) { continue; } DataEntryControl controlToAdd; if (control.Type == Constant.DatabaseColumn.DateTime) { DataEntryDateTime dateTimeControl = new DataEntryDateTime(control, this); controlToAdd = dateTimeControl; } else if (control.Type == Constant.DatabaseColumn.File || control.Type == Constant.DatabaseColumn.RelativePath || control.Type == Constant.DatabaseColumn.Folder || control.Type == Constant.DatabaseColumn.Date || control.Type == Constant.DatabaseColumn.Time || control.Type == Constant.Control.Note) { // standard controls rendering as notes aren't editable by the user, so we don't need autocompletions on tht Dictionary <string, string> autocompletions = null; bool readOnly = control.Type != Constant.Control.Note; if (readOnly == false) { autocompletions = new Dictionary <string, string>(); } DataEntryNote noteControl = new DataEntryNote(control, autocompletions, this) { ContentReadOnly = readOnly }; controlToAdd = noteControl; } else if (control.Type == Constant.Control.Flag || control.Type == Constant.DatabaseColumn.DeleteFlag) { DataEntryFlag flagControl = new DataEntryFlag(control, this); controlToAdd = flagControl; } else if (control.Type == Constant.Control.Counter) { DataEntryCounter counterControl = new DataEntryCounter(control, this); controlToAdd = counterControl; } else if (control.Type == Constant.Control.FixedChoice) { DataEntryChoice choiceControl = new DataEntryChoice(control, this); controlToAdd = choiceControl; } else if (control.Type == Constant.DatabaseColumn.ImageQuality) { DataEntryChoice choiceControl = new DataEntryChoice(control, this); choiceControl.HideItems(new List <string> { FileSelectionEnum.Corrupted.ToString(), FileSelectionEnum.Missing.ToString() }); controlToAdd = choiceControl; } else if (control.Type == Constant.DatabaseColumn.UtcOffset) { DataEntryUtcOffset utcOffsetControl = new DataEntryUtcOffset(control, this) { ContentReadOnly = true }; controlToAdd = utcOffsetControl; } else { TracePrint.PrintMessage(String.Format("Unhandled control type {0} in CreateControls.", control.Type)); continue; } this.ControlGrid.Inlines.Add(controlToAdd.Container); this.Controls.Add(controlToAdd); this.ControlsByDataLabel.Add(control.DataLabel, controlToAdd); } // Redundant check as for some reason CA1062 was still showing up as a warning. ThrowIf.IsNullArgument(dataEntryPropagator, nameof(dataEntryPropagator)); dataEntryPropagator.SetDataEntryCallbacks(this.ControlsByDataLabel); this.dataEntryHandler = dataEntryPropagator; }