// Copyright (C) 2003-2026, Foxit Software Inc..
// All Rights Reserved.
//
// http://www.foxitsoftware.com
//
// The following code is copyrighted and contains proprietary information and trade secrets of Foxit Software Inc..
// You cannot distribute any part of Foxit PDF SDK to any third party or general public,
// unless there is a separate license agreement with Foxit Software Inc. which explicitly grants you such rights.
//
// This file contains an example to demonstrate how to use Foxit PDF SDK to add form field and
// get form field information.

using System;

using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
using foxit.pdf.interform;
using foxit.pdf.annots;
using foxit.pdf.actions;

namespace formCS
{
    class form
    {
        public static void AddInteractiveForms(PDFPage page,Form form)
        {
            {
                // Add push button field.
                using (Control btn_submit = form.AddControl(page, "Push Button Submit", Field.Type.e_TypePushButton, new RectF(50, 750, 150, 780)))
                // Set default appearance
                using (DefaultAppearance default_ap = new DefaultAppearance())
                {
                    default_ap.flags = (int)(DefaultAppearance.DefAPFlags.e_FlagFont | DefaultAppearance.DefAPFlags.e_FlagFontSize | DefaultAppearance.DefAPFlags.e_FlagTextColor);
                    using (default_ap.font = new Font(Font.StandardID.e_StdIDHelveticaB))
                    {
                        default_ap.text_size = 12.0f;
                        default_ap.text_color = 0x000000;
                        form.SetDefaultAppearance(default_ap);
                    }

                    // Set push button appearance.
                    using (Widget widget = btn_submit.GetWidget())
                    {
                        widget.SetHighlightingMode(Annot.HighlightingMode.e_HighlightingPush);
                        widget.SetMKBorderColor(0xFF0000);
                        widget.SetMKBackgroundColor(0xF0F0F0);
                        widget.SetMKNormalCaption("Submit");
                        widget.ResetAppearanceStream();

                        // Set submit form action.
                        using (PDFDoc doc = form.GetDocument())
                        {
                            using (foxit.pdf.actions.Action action = foxit.pdf.actions.Action.Create(doc, foxit.pdf.actions.Action.Type.e_TypeSubmitForm))
                            using (SubmitFormAction submit_action = new SubmitFormAction(action))
                            {
                                int count = form.GetFieldCount(null);
                                WStringArray name_array = new WStringArray();
                                for (int i = 0; i < count; i++)
                                {
                                    Field field = form.GetField(i, null);
                                    using (field)
                                    {
                                        name_array.Add(field.GetName());
                                    }
                                }

                                submit_action.SetFieldNames(name_array);
                                //submit_action.SetURL("http://www.foxitsoftware.com");
                                widget.SetAction(submit_action);
                                widget.ResetAppearanceStream();
                                Console.WriteLine("Add button field.");
                            }
                        }
                    }
                }
            }

            {
                // Add radio button group 
                using (Control control = form.AddControl(page, "Radio Button0", Field.Type.e_TypeRadioButton, new RectF(50.0f, 700f, 90f, 740f)))
                using (Control control1 = form.AddControl(page, "Radio Button0", Field.Type.e_TypeRadioButton, new RectF(100.0f, 700f, 140f, 740f)))
                {
                    control.SetExportValue("YES");
                    control.SetChecked(true);
                    // Update radio button's appearance.
                    using (Widget widget = control.GetWidget())
                        widget.ResetAppearanceStream();

                    control1.SetExportValue("NO");
                    control1.SetChecked(false);
                    // Update radio button's appearance.
                    using (Widget widget1 = control1.GetWidget())
                        widget1.ResetAppearanceStream();
                    Console.WriteLine("Add radio button.");
                }
            }

            {
                // Add check box
                using (Control control = form.AddControl(page, "Check Box0", Field.Type.e_TypeCheckBox, new RectF(50.0f, 650f, 90f, 690f)))
                {
                    control.SetChecked(true);

                    using (Widget widget = control.GetWidget())
                    {
                        widget.SetMKBorderColor(0x000000);
                        widget.SetMKBackgroundColor(0xFFFFFF);
                        widget.ResetAppearanceStream();
                        Console.WriteLine("Add check box.");
                    }
                }
            }

            {
                // Add text field
                using (Control control = form.AddControl(page, "Text Field0", Field.Type.e_TypeTextField, new RectF(50f, 600f, 90f, 640f)))
                using (Control control1 = form.AddControl(page, "Text Field1", Field.Type.e_TypeTextField, new RectF(100f, 600f, 140f, 640f)))
                using (Control control2 = form.AddControl(page, "Text Field2", Field.Type.e_TypeTextField, new RectF(150f, 600f, 190f, 640f)))
                using (Field field = control.GetField())
                {
                    field.SetValue("3");
                    // Update text field's appearance.
                    using (Widget widget = control.GetWidget())
                        widget.ResetAppearanceStream();
                    using (Field field1 = control1.GetField())
                    {
                        field1.SetValue("23");
                        // Update text field's appearance.
                        using(Widget widget1 = control1.GetWidget())
                            widget1.ResetAppearanceStream();

                        using (Field field2 = control2.GetField())
                        using (PDFDoc doc = form.GetDocument())
                        using (foxit.pdf.actions.Action action = foxit.pdf.actions.Action.Create(doc, foxit.pdf.actions.Action.Type.e_TypeJavaScript))
                        using (foxit.pdf.actions.JavaScriptAction javascipt_action = new foxit.pdf.actions.JavaScriptAction(action))
                        {
                           javascipt_action.SetScript("AFSimple_Calculate(\"SUM\", new Array (\"Text Field0\", \"Text Field1\"));");
                           using (AdditionalAction aa = new AdditionalAction(field2))
                           {
                              aa.SetAction(AdditionalAction.TriggerEvent.e_TriggerFieldRecalculateValue, javascipt_action);
                              field2.SetValue("333333");
                              // Update text field's appearance.
                              using(Widget widget2 = control2.GetWidget())
                                  widget2.ResetAppearanceStream();
                              Console.WriteLine("Add text field.");
                           }
                        }
                    }
                 }
             }

            {
                // Add text field with flag comb
                using (Control control = form.AddControl(page, "Text Field3", Field.Type.e_TypeTextField, new RectF(50f, 570f, 100f, 590f)))
                using (Field field = control.GetField())
                {
                   field.SetFlags((int)Field.Flags.e_FlagTextComb);
                   field.SetValue("94538");
                   field.SetMaxLength(5);
                   using (Widget widget = control.GetWidget())
                   {
                      // Update text field's appearance.
                      widget.ResetAppearanceStream();
                   }
                }
            }

            {
                // Add text field, with flag multiline.
                using (Control control = form.AddControl(page, "Text Field4", Field.Type.e_TypeTextField, new RectF(110, 550, 190, 590)))
                using (Field field = control.GetField())
                {
                   field.SetFlags((int)Field.Flags.e_FlagTextMultiline);
                   field.SetValue("Text fields are boxes or spaces in which the user can enter text from the keyboard.");
                   using (Widget widget = control.GetWidget())
                   {
                     // Update text field's appearance.
                     widget.ResetAppearanceStream();
                   }
                }
            }

            {
                // Add text field, with flag password.
                using (Control control = form.AddControl(page, "Text Field5", Field.Type.e_TypeTextField, new RectF(200f, 570f, 240f, 590f)))
                using (Field field = control.GetField())
                {
                    field.SetFlags((int)Field.Flags.e_FlagTextPassword);
                    field.SetValue("Password");
                    using (Widget widget = control.GetWidget())
                    {
                        widget.ResetAppearanceStream();
                    }
                }
            }

            {
                // Add list box
                using (Control control = form.AddControl(page, "List Box0", Field.Type.e_TypeListBox, new RectF(50f, 450f, 350f, 500f)))
                using (Field field = control.GetField())
                using (ChoiceOptionArray options = new ChoiceOptionArray())
                {
                   options.Add(new ChoiceOption("Foxit SDK", "Foxit SDK", true, true));
                   options.Add(new ChoiceOption("Foxit Reader", "Foxit Reader", true, true));
                   options.Add(new ChoiceOption("Foxit Phantom", "Foxit Phantom", true, true));
                   field.SetOptions(options);

                   using (Widget widget = control.GetWidget())
                   {
                      widget.SetMKBorderColor(0x000000);
                      widget.SetMKBackgroundColor(0xFFFFFF);
                      widget.ResetAppearanceStream();
                   }
                }
            }

            {
                // Add combo box
                using (Control control = form.AddControl(page, "Combo Box0", Field.Type.e_TypeComboBox, new RectF(50f, 350f, 350f, 400f)))
                using (Field field = control.GetField())
                using (ChoiceOptionArray options = new ChoiceOptionArray())
                {
                  options.Add(new ChoiceOption("Foxit SDK", "Foxit SDK", true, true));
                  options.Add(new ChoiceOption("Foxit Reader", "Foxit Reader", true, true));
                  options.Add(new ChoiceOption("Foxit Phantom", "Foxit Phantom", true, true));
                  field.SetOptions(options);

                  using (Widget widget = control.GetWidget())
                  {
                     widget.SetMKBorderColor(0x000000);
                     widget.SetMKBackgroundColor(0xFFFFFF);
                     widget.ResetAppearanceStream();
                  }
                }
            }
        }

        static void Main(string[] args)
        {
            string output_path = "../output_files/form/";
            System.IO.Directory.CreateDirectory(output_path);

            string sn = "Rew1vB0TqoMIxX444UcpScARWdhgJpsJfzmyMLR32a0+EgrCjp2NaQ==";
            string key = "8f3g1sFttW8NAgfSNv+BvaJWy4Pp8flcm7ncNDkdvCCO4JwUFbGLyZdujReMaiplbYJwwxam3lr7uHtQaEf0xTSu8j2ZBdrZ8FS4OQkEUjOI9UEGb3Ic0GqmlP9T9OnSItOYqoZZA/OnYg5EaVP+c/ha32nUquOk+5riEdhYgINAZDdgJkPc+YSWsrfixOIROf6t34j3eRcyFnOY0MS7tSXi1AEPE0VZdyu+5bfmBSGvLI+WR5lQ+oOQR5hRGwqf990WEdBelNO7dxhZELVhEZ+/L60PpDf5y9A8qmrY6PiEU8nhqIyLpks0BxeIsYyZ3Cr82jjfbItPGyEARsIVzluBSgVMD4oGjojz8T6wGDEXUbmZH/pra94XAs8wZ28mzbmIEppWnhBqX0c6Ov8iXCfFfUZr4KNuPxMEgk4VOYTMOd70GEjGnylivw18hbn7ZpkWh2Zql+uU2HejvOgn+WHvT0HF9NhK0Xb5vH8aFkgBP92PJx8obIbxBVeeExczxvsqWufuPdXS2sPNIgMYZ2TtvqVVsiUToeGB2FQo09fzZOSH5Vi18u/siyvC3FmjeMf4+OYWPuDPNCcrb21NgcHam7XI8AAoGLTGtLLWR+fxynbBBcg2d2ZPcZ5CMFIfOBHRWCkcA0sDT3cl9nsBppHNJze/jVxHy+lREeQEA/etSIgohTGAWW3ZlpibRXqMxlmVWEPifCubbWTzQ6U54mRMpW2UghH3gvCNFNgdday3Av7EtlIJOdUuiMq3zmmd5J4Jt4C82CKnVewA0DtZ4EEtwRG9IYuLrfpuZlnjBAtoeXRV1lqUZ6BcCe0E3m9jO28sGkALuIeJQ74XG7X8lMC7lMWWQYiYD7D6G9QT6X3qV4vXJwNKRKpYc/rI+amEawTSnDYAMEaYPwtZ0rb/7BL+atsZZaI+ncebdfVfjDJZbCZAc+JnkuNlUn2xrNRuObw8h/G0lm2pNOEJ10S8R4+yplo5B1QmC2dCDhaTaW67QJPqnJPKbVmjw7i6KGBi+CDP3JnAKlOX/YUu8uk56JfeQUuGcQg/KaBMGctnchH2n1i3+oGbibhurQj22+OO66Q6mijKoCRP/QJm5WTGcO4c0iVX0B8dIlai/uv/pGU8Wps9MxysH5ViVIj56LWKuNfy1FNO9+wx4iHYnUxfW0Iccq3YJYAlOBkMv8VZIJl9aTEEFJ626LJEw/UbEBdR9CdlwnylPf4RuNW/lcGYMgq3xNVpp/bzYKwZivvQOFgMdX1tv8D33SHvAm3zrRCU+v94BJXnBi9k25fnKsc705IMwv+I6bueXA+mDnagj1oTqsWXZ0WnPAYI3WUO7sBf7XUH230wfYXnTSVhujJxiEP/2oWqi2813gtQkKwz9N2p6yT8Vsh3+BaAwwDvtOZMJKUFcabTBSL6NoouzmzwItJ4mIboT6KXaef66rs8jCU=";
            // Initialize library
            ErrorCode error_code = Library.Initialize(sn, key);
            if (error_code != ErrorCode.e_ErrSuccess)
            {
                Console.WriteLine("Library Initialize Error: {0}\n", error_code);
                Library.Release();
                return;
            }

            try
            {
                using (PDFDoc doc = new PDFDoc())
                using (Form form = new Form(doc))
                {
                   // Create a blank new page and add some form fields.
                   using (PDFPage page = doc.InsertPage(0, PDFPage.Size.e_SizeLetter))
                   {
                      AddInteractiveForms(page, form);
                      string new_pdf = output_path + "form.pdf";
                      doc.SaveAs(new_pdf, (int)PDFDoc.SaveFlags.e_SaveFlagNoOriginal);
                   }
                }
            }
            catch (foxit.PDFException e)
            {
                Console.WriteLine(e.Message);
            }

            Library.Release();
        }
    }
}
