/// <summary>
        /// Adds information about the value of capability in specified usage mode to the string builder.
        /// </summary>
        /// <param name="capUsageMode"></param>
        /// <param name="capValue"></param>
        /// <param name="capsInfo"></param>
        private void AddCapInfoToCapsInfo(DeviceCapabilityUsageMode capUsageMode, TwainValueContainerBase capValue, StringBuilder capsInfo)
        {
            capsInfo.Append(string.Format("  Usage mode: {0}{1}", capUsageMode, Environment.NewLine));
            capsInfo.Append(string.Format("    Value container type: {0}{1}", capValue.ContainerType, Environment.NewLine));

            switch (capValue.ContainerType)
            {
            case TwainValueContainerType.OneValue:
                TwainOneValueContainer oneDeviceCapabilityValue = (TwainOneValueContainer)capValue;
                AddCapOneCurrentValueInfoToCapsInfo(oneDeviceCapabilityValue, capsInfo);
                break;

            case TwainValueContainerType.Range:
                TwainRangeValueContainer rangeDeviceCapabilityValue = (TwainRangeValueContainer)capValue;
                AddCapRangeCurrentValueInfoToCapsInfo(rangeDeviceCapabilityValue, capsInfo);
                AddCapRangeDefaultValueInfoToCapsInfo(rangeDeviceCapabilityValue, capsInfo);
                AddCapMinValueInfoToCapsInfo(rangeDeviceCapabilityValue, capsInfo);
                AddCapMaxValueInfoToCapsInfo(rangeDeviceCapabilityValue, capsInfo);
                AddCapStepSizeInfoToCapsInfo(rangeDeviceCapabilityValue, capsInfo);
                break;

            case TwainValueContainerType.Enum:
                TwainEnumValueContainer enumDeviceCapabilityValue = (TwainEnumValueContainer)capValue;
                AddCapEnumCurrentValueInfoToCapsInfo(enumDeviceCapabilityValue, capsInfo);
                AddCapEnumDefaultValueInfoToCapsInfo(enumDeviceCapabilityValue, capsInfo);
                AddCapValuesInfoToCapsInfo(enumDeviceCapabilityValue, capsInfo);
                break;

            case TwainValueContainerType.Array:
                TwainArrayValueContainer arrayDeviceCapabilityValue = (TwainArrayValueContainer)capValue;
                AddCapValuesInfoToCapsInfo(arrayDeviceCapabilityValue, capsInfo);
                break;
            }
        }
        /// <summary>
        /// Adds an extended image info to the result.
        /// </summary>
        private void AddExtendedImageInfoToResultTextBox(int index, ExtendedImageInfo info)
        {
            if (!info.IsValueValid)
            {
                return;
            }

            extendedImageInfoAboutAcquiredImageTextBox.Text += string.Format("Extended image info {0}", index);
            extendedImageInfoAboutAcquiredImageTextBox.Text += Environment.NewLine;

            extendedImageInfoAboutAcquiredImageTextBox.Text += string.Format("  Name={0}", Enum.GetName(typeof(ExtendedImageInfoId), info.InfoId));
            extendedImageInfoAboutAcquiredImageTextBox.Text += Environment.NewLine;

            extendedImageInfoAboutAcquiredImageTextBox.Text += string.Format("  Id={0}", info.InfoId);
            extendedImageInfoAboutAcquiredImageTextBox.Text += Environment.NewLine;

            extendedImageInfoAboutAcquiredImageTextBox.Text += string.Format("  Value type={0}", info.ValueType);
            extendedImageInfoAboutAcquiredImageTextBox.Text += Environment.NewLine;

            TwainOneValueContainer oneDeviceCapabilityValue = info.Value as TwainOneValueContainer;

            if (oneDeviceCapabilityValue != null)
            {
                extendedImageInfoAboutAcquiredImageTextBox.Text += string.Format("  Value={0}", oneDeviceCapabilityValue.Value);
                extendedImageInfoAboutAcquiredImageTextBox.Text += Environment.NewLine;
            }
            else
            {
                TwainArrayValueContainer arrayDeviceCapabilityValue = info.Value as TwainArrayValueContainer;
                if (arrayDeviceCapabilityValue != null)
                {
                    extendedImageInfoAboutAcquiredImageTextBox.Text += "Values: ";
                    if (arrayDeviceCapabilityValue.Values != null)
                    {
                        if (arrayDeviceCapabilityValue.Values.GetType() == typeof(byte[]))
                        {
                            extendedImageInfoAboutAcquiredImageTextBox.Text += string.Format("byte[{0}]", arrayDeviceCapabilityValue.Values.Length);
                        }
                        else
                        {
                            for (int i = 0; i < arrayDeviceCapabilityValue.Values.Length; i++)
                            {
                                extendedImageInfoAboutAcquiredImageTextBox.Text += string.Format("{0}, ", arrayDeviceCapabilityValue.Values.GetValue(i));
                            }
                        }
                    }
                    extendedImageInfoAboutAcquiredImageTextBox.Text += Environment.NewLine;
                }
            }
        }
        /// <summary>
        /// Gets information about the supported values stored in Array container.
        /// </summary>
        /// <param name="deviceCapabilityValue"></param>
        private void AddCapValuesToForm(TwainArrayValueContainer deviceCapabilityValue)
        {
            if (deviceCapabilityValue.Values == null)
            {
                return;
            }

            if (deviceCapabilityValue.EnumValues != null)
            {
                for (int i = 0; i < deviceCapabilityValue.Values.Length; i++)
                {
                    supportedValuesListBox.Items.Add(string.Format("{0} [{1}]", deviceCapabilityValue.Values.GetValue(i), deviceCapabilityValue.EnumValues.GetValue(i)));
                }
            }
            else
            {
                for (int i = 0; i < deviceCapabilityValue.Values.Length; i++)
                {
                    supportedValuesListBox.Items.Add(deviceCapabilityValue.Values.GetValue(i));
                }
            }
        }
        /// <summary>
        /// Gets information about the supported values stored in Array container.
        /// </summary>
        /// <param name="deviceCapabilityValue"></param>
        /// <param name="capsInfo"></param>
        private void AddCapValuesInfoToCapsInfo(TwainArrayValueContainer deviceCapabilityValue, StringBuilder capsInfo)
        {
            if (deviceCapabilityValue.Values == null ||
                deviceCapabilityValue.Values.Length == 0)
            {
                capsInfo.Append(string.Format("    Supported values[0]:{0}", Environment.NewLine));
                return;
            }

            StringBuilder values = new StringBuilder();

            if (deviceCapabilityValue.Values.GetValue(0).GetType().Equals(typeof(string)))
            {
                for (int j = 0; j < deviceCapabilityValue.Values.Length; j++)
                {
                    values.Append(string.Format("\"{0}\", ", deviceCapabilityValue.Values.GetValue(j)));
                }
            }
            else
            {
                if (deviceCapabilityValue.EnumValues != null)
                {
                    for (int i = 0; i < deviceCapabilityValue.Values.Length; i++)
                    {
                        values.Append(string.Format("{0} [{1}], ", deviceCapabilityValue.Values.GetValue(i), deviceCapabilityValue.EnumValues.GetValue(i)));
                    }
                }
                else
                {
                    for (int i = 0; i < deviceCapabilityValue.Values.Length; i++)
                    {
                        values.Append(string.Format("{0}, ", deviceCapabilityValue.Values.GetValue(i)));
                    }
                }
            }

            capsInfo.Append(string.Format("    Supported values[{0}, {1}]: {2}{3}", deviceCapabilityValue.Values.Length, deviceCapabilityValue.Values.GetValue(0).GetType(), values, Environment.NewLine));
        }
        /// <summary>
        /// Gets information about value of specified capability in specified usage mode.
        /// </summary>
        /// <param name="deviceCapability"></param>
        /// <param name="usageMode"></param>
        private void GetCapValue(DeviceCapability deviceCapability, DeviceCapabilityUsageMode usageMode)
        {
            usageModeTextBox.Text     = "";
            containerTypeTextBox.Text = "";
            valueTypeTextBox.Text     = "";
            currentValueTextBox.Text  = "";
            minValueTextBox.Text      = "";
            maxValueTextBox.Text      = "";
            defaultValueTextBox.Text  = "";
            stepSizeTextBox.Text      = "";
            supportedValuesListBox.Items.Clear();

            try
            {
                TwainValueContainerBase deviceCapabilityValue = null;
                if (usageMode == DeviceCapabilityUsageMode.GetCurrent)
                {
                    deviceCapabilityValue = deviceCapability.GetCurrentValue();
                }
                else if (usageMode == DeviceCapabilityUsageMode.GetDefault)
                {
                    deviceCapabilityValue = deviceCapability.GetDefaultValue();
                }
                else
                {
                    deviceCapabilityValue = deviceCapability.GetValue();
                }

                if (getMethodComboBox.Items.Count == 0)
                {
                    //
                    usageModeTextBox.Text = deviceCapability.UsageMode.ToString();
                    //
                    if ((deviceCapability.UsageMode & DeviceCapabilityUsageMode.Get) != 0)
                    {
                        getMethodComboBox.Items.Add(DeviceCapabilityUsageMode.Get);
                    }
                    if ((deviceCapability.UsageMode & DeviceCapabilityUsageMode.GetCurrent) != 0)
                    {
                        getMethodComboBox.Items.Add(DeviceCapabilityUsageMode.GetCurrent);
                    }
                    if ((deviceCapability.UsageMode & DeviceCapabilityUsageMode.GetDefault) != 0)
                    {
                        getMethodComboBox.Items.Add(DeviceCapabilityUsageMode.GetDefault);
                    }
                }

                if (deviceCapabilityValue != null)
                {
                    //
                    containerTypeTextBox.Text = deviceCapabilityValue.ContainerType.ToString();
                    valueTypeTextBox.Text     = deviceCapability.ValueType.ToString();

                    //
                    switch (deviceCapabilityValue.ContainerType)
                    {
                    case TwainValueContainerType.OneValue:
                        TwainOneValueContainer oneDeviceCapabilityValue = (TwainOneValueContainer)deviceCapabilityValue;
                        AddCapOneCurrentValueToForm(oneDeviceCapabilityValue);
                        break;

                    case TwainValueContainerType.Range:
                        TwainRangeValueContainer rangeDeviceCapabilityValue = (TwainRangeValueContainer)deviceCapabilityValue;
                        AddCapRangeCurrentValueToForm(rangeDeviceCapabilityValue);
                        AddCapRangeDefaultValueToForm(rangeDeviceCapabilityValue);
                        AddCapMinValueToForm(rangeDeviceCapabilityValue);
                        AddCapMaxValueToForm(rangeDeviceCapabilityValue);
                        AddCapStepSizeToForm(rangeDeviceCapabilityValue);
                        break;

                    case TwainValueContainerType.Enum:
                        TwainEnumValueContainer enumDeviceCapabilityValue = (TwainEnumValueContainer)deviceCapabilityValue;
                        AddCapEnumCurrentValueToForm(enumDeviceCapabilityValue);
                        AddCapEnumDefaultValueToForm(enumDeviceCapabilityValue);
                        AddCapValuesToForm(enumDeviceCapabilityValue);
                        break;

                    case TwainValueContainerType.Array:
                        TwainArrayValueContainer arrayDeviceCapabilityValue = (TwainArrayValueContainer)deviceCapabilityValue;
                        AddCapValuesToForm(arrayDeviceCapabilityValue);
                        break;
                    }
                }
            }
            catch (TwainDeviceCapabilityException ex)
            {
                currentValueTextBox.Text = ex.Message;
            }
        }