use std::marker::PhantomData;
use crate::bindgen::{FPDF_ANNOTATION, FPDF_FORMHANDLE};
use crate::error::PdfiumError;
use crate::pdf::document::page::field::private::internal::{
PdfFormFieldFlags, PdfFormFieldPrivate,
};
use crate::pdfium::PdfiumLibraryBindingsAccessor;
#[cfg(doc)]
use {
crate::pdf::document::form::PdfForm,
crate::pdf::document::page::annotation::PdfPageAnnotationType,
crate::pdf::document::page::field::{PdfFormField, PdfFormFieldType},
};
pub struct PdfFormTextField<'a> {
form_handle: FPDF_FORMHANDLE,
annotation_handle: FPDF_ANNOTATION,
lifetime: PhantomData<&'a FPDF_ANNOTATION>,
}
impl<'a> PdfFormTextField<'a> {
#[inline]
pub(crate) fn from_pdfium(
form_handle: FPDF_FORMHANDLE,
annotation_handle: FPDF_ANNOTATION,
) -> Self {
PdfFormTextField {
form_handle,
annotation_handle,
lifetime: PhantomData,
}
}
#[inline]
pub fn value(&self) -> Option<String> {
if self.is_rich_text() {
self.get_string_value("RV")
} else {
self.value_impl()
}
}
#[inline]
pub fn set_value(&mut self, value: &str) -> Result<(), PdfiumError> {
if self.is_rich_text() {
self.set_string_value("RV", value)
} else {
self.set_value_impl(value)
}
}
#[inline]
pub fn is_multiline(&self) -> bool {
self.get_flags_impl()
.contains(PdfFormFieldFlags::TextMultiline)
}
#[cfg(any(feature = "pdfium_future", feature = "pdfium_7350"))]
#[inline]
pub fn set_is_multiline(&self, is_multiline: bool) -> Result<(), PdfiumError> {
self.update_one_flag_impl(PdfFormFieldFlags::TextMultiline, is_multiline)
}
#[inline]
pub fn is_password(&self) -> bool {
self.get_flags_impl()
.contains(PdfFormFieldFlags::TextPassword)
}
#[cfg(any(feature = "pdfium_future", feature = "pdfium_7350"))]
#[inline]
pub fn set_is_password(&self, is_password: bool) -> Result<(), PdfiumError> {
self.update_one_flag_impl(PdfFormFieldFlags::TextPassword, is_password)
}
pub fn is_file_select(&self) -> bool {
self.get_flags_impl()
.contains(PdfFormFieldFlags::TextFileSelect)
}
#[cfg(any(feature = "pdfium_future", feature = "pdfium_7350"))]
pub fn set_is_file_select(&mut self, is_file_select: bool) -> Result<(), PdfiumError> {
self.update_one_flag_impl(PdfFormFieldFlags::TextFileSelect, is_file_select)
}
pub fn is_spell_checked(&self) -> bool {
!self
.get_flags_impl()
.contains(PdfFormFieldFlags::TextDoNotSpellCheck)
}
#[cfg(any(feature = "pdfium_future", feature = "pdfium_7350"))]
pub fn set_is_spell_checked(&mut self, is_spell_checked: bool) -> Result<(), PdfiumError> {
self.update_one_flag_impl(PdfFormFieldFlags::TextDoNotSpellCheck, !is_spell_checked)
}
pub fn is_scrollable(&self) -> bool {
!self
.get_flags_impl()
.contains(PdfFormFieldFlags::TextDoNotScroll)
}
#[cfg(any(feature = "pdfium_future", feature = "pdfium_7350"))]
pub fn set_is_scrollable(&mut self, is_scrollable: bool) -> Result<(), PdfiumError> {
self.update_one_flag_impl(PdfFormFieldFlags::TextDoNotScroll, !is_scrollable)
}
pub fn is_combed(&self) -> bool {
!self.is_multiline()
&& !self.is_password()
&& !self.is_file_select()
&& self.get_flags_impl().contains(PdfFormFieldFlags::TextComb)
}
pub fn is_rich_text(&self) -> bool {
self.get_flags_impl()
.contains(PdfFormFieldFlags::TextRichText)
}
#[cfg(any(feature = "pdfium_future", feature = "pdfium_7350"))]
pub fn set_is_rich_text(&mut self, is_rich_text: bool) -> Result<(), PdfiumError> {
self.update_one_flag_impl(PdfFormFieldFlags::TextRichText, is_rich_text)
}
}
impl<'a> PdfFormFieldPrivate<'a> for PdfFormTextField<'a> {
#[inline]
fn form_handle(&self) -> FPDF_FORMHANDLE {
self.form_handle
}
#[inline]
fn annotation_handle(&self) -> FPDF_ANNOTATION {
self.annotation_handle
}
}
impl<'a> PdfiumLibraryBindingsAccessor<'a> for PdfFormTextField<'a> {}
#[cfg(feature = "thread_safe")]
unsafe impl<'a> Send for PdfFormTextField<'a> {}
#[cfg(feature = "thread_safe")]
unsafe impl<'a> Sync for PdfFormTextField<'a> {}