Переглянути джерело

PDFTools(Android) - 1.ListBox 交互 2.下拉框Form 3.签名Form

liuxiaolong 1 рік тому
батько
коміт
011504323b
38 змінених файлів з 1307 додано та 54 видалено
  1. BIN
      compdfkit-repo/compdfkit-ui/ComPDFKit-UI.aar
  2. BIN
      compdfkit-repo/compdfkit/ComPDFKit.aar
  3. 3 2
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfstyle/CAnnotImplStyle.java
  4. 44 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfstyle/CPDFGlobalAnnotStyle.java
  5. 6 9
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/contextmenu/CListBoxContextMenuView.java
  6. 32 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/contextmenu/CPDFContextMenuHelper.java
  7. 43 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/contextmenu/CSignatureContextMenuView.java
  8. 66 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/contextmenu/ComboBoxContextMenuView.java
  9. 6 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/contextmenu/ContextMenuProviderParams.java
  10. 23 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/contextmenu/interfaces/ContextMenuComboBoxProvider.java
  11. 23 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/contextmenu/interfaces/ContextMenuFormSignProvider.java
  12. 19 1
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/utils/dialog/CEditDialog.java
  13. 2 2
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfformbar/data/CFormToolDatas.java
  14. 7 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfstyle/CAnnotStyle.java
  15. 7 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfstyle/CStyleFragmentDatas.java
  16. 1 1
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfstyle/CStyleUIParams.java
  17. 29 1
      compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfstyle/manager/CStyleManager.java
  18. 11 6
      compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdflistbox/CListBoxItemsAdapter.java
  19. 78 18
      compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdflistbox/CListBoxEditFragment.java
  20. 45 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/option/select/CFormOptionListAdapter.java
  21. 142 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/option/select/CFormOptionSelectDialogFragment.java
  22. 6 2
      compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdfcheckbox/CheckBoxStyleFragment.java
  23. 16 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdfcombobox/ComboBoxStyleFragment.java
  24. 36 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdfcombobox/CustomComboBoxWidgetImpl.java
  25. 275 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdflistbox/CListBoxStyleFragment.java
  26. 36 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdflistbox/CustomListBoxWidgetImpl.java
  27. 56 0
      compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdfsign/CustomSignatureWidgetImpl.java
  28. 70 2
      compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdfstyle/CFormStyle.java
  29. 3 1
      compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdftextfield/CTextFieldStyleFragment.java
  30. 4 2
      compdfkit-tools/src/main/java/com/compdfkit/tools/viewer/pdfbookmark/CPDFBookmarkFragment.java
  31. 1 2
      compdfkit-tools/src/main/res/layout/tools_bota_bookmark_input_dialog.xml
  32. 1 1
      compdfkit-tools/src/main/res/layout/tools_properties_list_box_edit_fragment.xml
  33. 1 0
      compdfkit-tools/src/main/res/layout/tools_properties_list_box_edit_list_item.xml
  34. 32 0
      compdfkit-tools/src/main/res/layout/tools_properties_form_option_list_item.xml
  35. 26 0
      compdfkit-tools/src/main/res/layout/tools_properties_form_option_select_fragment.xml
  36. 136 0
      compdfkit-tools/src/main/res/layout/tools_properties_list_box_style_fragment.xml
  37. 6 1
      compdfkit-tools/src/main/res/values/tools_strings.xml
  38. 15 3
      form-ctrl-demo/src/main/java/com/compdfkit/demo/form/PDFFormSampleActivity.java

BIN
compdfkit-repo/compdfkit-ui/ComPDFKit-UI.aar


BIN
compdfkit-repo/compdfkit/ComPDFKit.aar


+ 3 - 2
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfstyle/CAnnotImplStyle.java

@@ -29,6 +29,7 @@ import com.compdfkit.ui.proxy.CPDFLineAnnotImpl;
 import com.compdfkit.ui.proxy.CPDFMarkupAnnotImpl;
 import com.compdfkit.ui.proxy.CPDFSquareAnnotImpl;
 import com.compdfkit.ui.reader.CPDFPageView;
+import com.compdfkit.ui.reader.PageView;
 
 import java.util.LinkedHashSet;
 
@@ -37,9 +38,9 @@ public class CAnnotImplStyle implements CStyleProvider {
 
     private CPDFBaseAnnotImpl annotImpl;
 
-    private CPDFPageView pageView;
+    private PageView pageView;
 
-    public CAnnotImplStyle(CPDFBaseAnnotImpl annotImpl, CPDFPageView pageView) {
+    public CAnnotImplStyle(CPDFBaseAnnotImpl annotImpl, PageView pageView) {
         this.annotImpl = annotImpl;
         this.pageView = pageView;
     }

+ 44 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/annotation/pdfproperties/pdfstyle/CPDFGlobalAnnotStyle.java

@@ -41,6 +41,7 @@ import com.compdfkit.ui.attribute.CPDFTextAttr;
 import com.compdfkit.ui.attribute.CPDFUnderlineAttr;
 import com.compdfkit.ui.attribute.IAttributeCallback;
 import com.compdfkit.ui.attribute.form.CPDFCheckboxAttr;
+import com.compdfkit.ui.attribute.form.CPDFComboboxAttr;
 import com.compdfkit.ui.attribute.form.CPDFListboxAttr;
 import com.compdfkit.ui.attribute.form.CPDFRadiobuttonAttr;
 import com.compdfkit.ui.attribute.form.CPDFTextfieldAttr;
@@ -207,6 +208,7 @@ public class CPDFGlobalAnnotStyle extends CBasicOnStyleChangeListener implements
                     String textFieldFontName = CPDFTextAttribute.FontNameHelper.obtainFontName(params.getFontType(), params.isFontBold(), params.isFontItalic());
                     textFieldAttr.setTextAttribute(new CPDFTextAttribute(textFieldFontName, params.getFontSize(), params.getTextColor()));
                     textFieldAttr.setMultiline(params.isFormMultiLine());
+                    textFieldAttr.setBgAlpha(0.5F);
                     switch (params.getAlignment()) {
                         case LEFT:
                             textFieldAttr.setAlignment(CPDFTextAlignment.ALIGNMENT_LEFT);
@@ -229,6 +231,7 @@ public class CPDFGlobalAnnotStyle extends CBasicOnStyleChangeListener implements
                     checkboxAttr.setCheckColor(params.getColor());
                     checkboxAttr.setBorderColor(params.getLineColor());
                     checkboxAttr.setBgColor(params.getFillColor());
+                    checkboxAttr.setBgAlpha(0.1F);
                     break;
                 case FORM_RADIO_BUTTON:
                     CPDFRadiobuttonAttr radiobuttonAttr = attribute.getRadiobuttonAttr();
@@ -237,6 +240,23 @@ public class CPDFGlobalAnnotStyle extends CBasicOnStyleChangeListener implements
                     radiobuttonAttr.setCheckColor(params.getColor());
                     radiobuttonAttr.setBorderColor(params.getLineColor());
                     radiobuttonAttr.setBgColor(params.getFillColor());
+                    radiobuttonAttr.setBgAlpha(0.2F);
+                    break;
+                case FORM_LIST_BOX:
+                    CPDFListboxAttr listBoxAttr = attribute.getListboxAttr();
+                    listBoxAttr.setFontSize(params.getFontSize());
+                    listBoxAttr.setFontColor(params.getTextColor());
+                    listBoxAttr.setBgColor(params.getFillColor());
+                    listBoxAttr.setBorderWidth(2);
+                    listBoxAttr.setBorderColor(params.getLineColor());
+                    break;
+                case FORM_COMBO_BOX:
+                    CPDFComboboxAttr comboBoxAttr = attribute.getComboboxAttr();
+                    comboBoxAttr.setBgColor(params.getFillColor());
+                    comboBoxAttr.setFontSize(params.getFontSize());
+                    comboBoxAttr.setFontColor(params.getTextColor());
+                    comboBoxAttr.setBorderWidth(2);
+                    comboBoxAttr.setBorderColor(params.getLineColor());
                     break;
                 default:
                     break;
@@ -377,6 +397,30 @@ public class CPDFGlobalAnnotStyle extends CBasicOnStyleChangeListener implements
                         break;
                 }
                 break;
+            case FORM_LIST_BOX:
+                CPDFListboxAttr listboxAttr = attribute.getListboxAttr();
+                style.setFontSize((int) listboxAttr.getFontSize());
+                style.setTextColor(listboxAttr.getFontColor());
+                style.setFillColor(listboxAttr.getBgColor());
+                style.setLineColor(listboxAttr.getBorderColor());
+                style.setBorderWidth(listboxAttr.getBorderWidth());
+                CPDFTextAttribute.FontNameHelper.FontType listBoxFontType = CPDFTextAttribute.FontNameHelper.getFontType(listboxAttr.getFontName());
+                style.setFontType(listBoxFontType);
+                style.setFontBold(CPDFTextAttribute.FontNameHelper.isBold(listboxAttr.getFontName()));
+                style.setFontItalic(CPDFTextAttribute.FontNameHelper.isItalic(listboxAttr.getFontName()));
+                break;
+            case FORM_COMBO_BOX:
+                CPDFComboboxAttr comboBoxAttr = attribute.getComboboxAttr();
+                style.setFontSize((int) comboBoxAttr.getFontSize());
+                style.setTextColor(comboBoxAttr.getFontColor());
+                style.setFillColor(comboBoxAttr.getBgColor());
+                style.setLineColor(comboBoxAttr.getBorderColor());
+                style.setBorderWidth(comboBoxAttr.getBorderWidth());
+                CPDFTextAttribute.FontNameHelper.FontType comBoBoxFontType = CPDFTextAttribute.FontNameHelper.getFontType(comboBoxAttr.getFontName());
+                style.setFontType(comBoBoxFontType);
+                style.setFontBold(CPDFTextAttribute.FontNameHelper.isBold(comboBoxAttr.getFontName()));
+                style.setFontItalic(CPDFTextAttribute.FontNameHelper.isItalic(comboBoxAttr.getFontName()));
+                break;
             default:
                 break;
         }

+ 6 - 9
compdfkit-tools/src/main/java/com/compdfkit/tools/common/contextmenu/CListBoxContextMenuView.java

@@ -13,33 +13,30 @@ import android.view.View;
 
 import androidx.fragment.app.FragmentActivity;
 
-import com.compdfkit.core.annotation.form.CPDFWidgetItem;
 import com.compdfkit.core.annotation.form.CPDFWidgetItems;
 import com.compdfkit.tools.R;
-import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuCheckBoxProvider;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuListBoxProvider;
 import com.compdfkit.tools.common.contextmenu.provider.ContextMenuView;
 import com.compdfkit.tools.common.views.pdfstyle.CAnnotStyle;
 import com.compdfkit.tools.common.views.pdfstyle.CStyleDialogFragment;
 import com.compdfkit.tools.common.views.pdfstyle.CStyleType;
 import com.compdfkit.tools.common.views.pdfstyle.manager.CStyleManager;
-import com.compdfkit.tools.form.pdfproperties.pdflistbox.CListBoxEditFragment;
-import com.compdfkit.ui.proxy.form.CPDFCheckboxWidgetImpl;
+import com.compdfkit.tools.form.pdfproperties.option.edit.CFormOptionEditFragment;
 import com.compdfkit.ui.proxy.form.CPDFListboxWidgetImpl;
 import com.compdfkit.ui.reader.CPDFPageView;
 
-import java.util.Arrays;
-import java.util.Collections;
-
 
 public class CListBoxContextMenuView implements ContextMenuListBoxProvider {
 
     @Override
     public View createListBoxContentView(CPDFContextMenuHelper helper, CPDFPageView pageView, CPDFListboxWidgetImpl listBoxWidgetImpl) {
         ContextMenuView menuView = new ContextMenuView(pageView.getContext());
-        menuView.addItem(R.string.tools_edit, v -> {
+        menuView.addItem(R.string.tools_option_list, v -> {
             CPDFWidgetItems widgetItems = (CPDFWidgetItems) listBoxWidgetImpl.onGetAnnotation();
-            CListBoxEditFragment editFragment = CListBoxEditFragment.newInstance();
+            CFormOptionEditFragment editFragment = CFormOptionEditFragment.newInstance(
+                    R.string.tools_check_list_box,
+                    R.string.tools_add_list_box,
+                    R.string.tools_edit);
             editFragment.setPdfWidgetItems(widgetItems);
             editFragment.setEditListListener((widgetItems1, selectedIndexs1) -> {
                 widgetItems.setOptionItems(widgetItems1, selectedIndexs1);

+ 32 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/contextmenu/CPDFContextMenuHelper.java

@@ -18,8 +18,10 @@ import android.widget.PopupWindow;
 
 import com.compdfkit.core.annotation.form.CPDFWidgetItems;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuCheckBoxProvider;
+import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuComboBoxProvider;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuEditImageProvider;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuEditTextProvider;
+import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuFormSignProvider;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuFreeTextProvider;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuInkProvider;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuLinkProvider;
@@ -43,6 +45,7 @@ import com.compdfkit.ui.proxy.CPDFSoundAnnotImpl;
 import com.compdfkit.ui.proxy.CPDFStampAnnotImpl;
 import com.compdfkit.ui.proxy.CPDFTextAnnotImpl;
 import com.compdfkit.ui.proxy.form.CPDFCheckboxWidgetImpl;
+import com.compdfkit.ui.proxy.form.CPDFComboboxWidgetImpl;
 import com.compdfkit.ui.proxy.form.CPDFListboxWidgetImpl;
 import com.compdfkit.ui.proxy.form.CPDFRadiobuttonWidgetImpl;
 import com.compdfkit.ui.proxy.form.CPDFTextWidgetImpl;
@@ -233,6 +236,23 @@ public class CPDFContextMenuHelper extends CPDFContextMenuShowHelper {
         return super.getRadiobuttonContentView(cpdfPageView, cpdfBaseAnnot, layoutInflater);
     }
 
+    @Override
+    public View getComboboxContentView(CPDFPageView cpdfPageView, CPDFBaseAnnotImpl cpdfBaseAnnot, LayoutInflater layoutInflater) {
+        if (helperParams.comboBoxProvider != null){
+            return helperParams.comboBoxProvider.createComboBoxContentView(this, cpdfPageView, (CPDFComboboxWidgetImpl) cpdfBaseAnnot);
+        }
+        return super.getComboboxContentView(cpdfPageView, cpdfBaseAnnot, layoutInflater);
+    }
+
+
+    @Override
+    public View getSignatureContentView(CPDFPageView cpdfPageView, CPDFBaseAnnotImpl cpdfBaseAnnot, LayoutInflater layoutInflater) {
+        if (helperParams.formSignatureProvider != null){
+            return helperParams.formSignatureProvider.createFormSignContentView(this, cpdfPageView, cpdfBaseAnnot);
+        }
+        return super.getSignatureContentView(cpdfPageView, cpdfBaseAnnot, layoutInflater);
+    }
+
     @Override
     public void dismissContextMenu() {
         if (popupWindow != null) {
@@ -334,6 +354,16 @@ public class CPDFContextMenuHelper extends CPDFContextMenuShowHelper {
             return this;
         }
 
+        public Builder setComboBoxContextMenu(ContextMenuComboBoxProvider comboBoxProvider){
+            this.params.comboBoxProvider = comboBoxProvider;
+            return this;
+        }
+
+        public Builder setSignatureContextMenu(ContextMenuFormSignProvider signProvider){
+            this.params.formSignatureProvider = signProvider;
+            return this;
+        }
+
         public CPDFContextMenuHelper create(CPDFViewCtrl pdfView){
             return new CPDFContextMenuHelper(pdfView, params);
         }
@@ -356,6 +386,8 @@ public class CPDFContextMenuHelper extends CPDFContextMenuShowHelper {
             params.checkBoxProvider = new CCheckBoxContextMenuView();
             params.radioButtonProvider = new CRadioButtonContextMenuView();
             params.listBoxProvider = new CListBoxContextMenuView();
+            params.comboBoxProvider = new ComboBoxContextMenuView();
+            params.formSignatureProvider = new CSignatureContextMenuView();
             return this;
         }
     }

+ 43 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/contextmenu/CSignatureContextMenuView.java

@@ -0,0 +1,43 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.common.contextmenu;
+
+import android.view.View;
+
+import androidx.fragment.app.FragmentActivity;
+
+import com.compdfkit.core.annotation.form.CPDFWidgetItems;
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuComboBoxProvider;
+import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuFormSignProvider;
+import com.compdfkit.tools.common.contextmenu.provider.ContextMenuView;
+import com.compdfkit.tools.common.views.pdfstyle.CAnnotStyle;
+import com.compdfkit.tools.common.views.pdfstyle.CStyleDialogFragment;
+import com.compdfkit.tools.common.views.pdfstyle.CStyleType;
+import com.compdfkit.tools.common.views.pdfstyle.manager.CStyleManager;
+import com.compdfkit.tools.form.pdfproperties.option.edit.CFormOptionEditFragment;
+import com.compdfkit.ui.proxy.CPDFBaseAnnotImpl;
+import com.compdfkit.ui.proxy.form.CPDFComboboxWidgetImpl;
+import com.compdfkit.ui.reader.CPDFPageView;
+
+
+public class CSignatureContextMenuView implements ContextMenuFormSignProvider {
+
+
+    @Override
+    public View createFormSignContentView(CPDFContextMenuHelper helper, CPDFPageView pageView, CPDFBaseAnnotImpl annotImpl) {
+        ContextMenuView menuView = new ContextMenuView(pageView.getContext());
+        menuView.addItem(R.string.tools_delete, v -> {
+            pageView.deleteAnnotation(annotImpl);
+            helper.dismissContextMenu();
+        });
+        return menuView;
+    }
+}

+ 66 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/contextmenu/ComboBoxContextMenuView.java

@@ -0,0 +1,66 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.common.contextmenu;
+
+import android.view.View;
+
+import androidx.fragment.app.FragmentActivity;
+
+import com.compdfkit.core.annotation.form.CPDFWidgetItems;
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuComboBoxProvider;
+import com.compdfkit.tools.common.contextmenu.provider.ContextMenuView;
+import com.compdfkit.tools.common.views.pdfstyle.CAnnotStyle;
+import com.compdfkit.tools.common.views.pdfstyle.CStyleDialogFragment;
+import com.compdfkit.tools.common.views.pdfstyle.CStyleType;
+import com.compdfkit.tools.common.views.pdfstyle.manager.CStyleManager;
+import com.compdfkit.tools.form.pdfproperties.option.edit.CFormOptionEditFragment;
+import com.compdfkit.ui.proxy.form.CPDFComboboxWidgetImpl;
+import com.compdfkit.ui.reader.CPDFPageView;
+
+
+public class ComboBoxContextMenuView implements ContextMenuComboBoxProvider {
+
+    @Override
+    public View createComboBoxContentView(CPDFContextMenuHelper helper, CPDFPageView pageView, CPDFComboboxWidgetImpl comboBoxWidgetImpl) {
+        ContextMenuView menuView = new ContextMenuView(pageView.getContext());
+        menuView.addItem(R.string.tools_option_list, v -> {
+            CPDFWidgetItems widgetItems = (CPDFWidgetItems) comboBoxWidgetImpl.onGetAnnotation();
+            CFormOptionEditFragment editFragment = CFormOptionEditFragment.newInstance(
+                    R.string.tools_combo_box,
+                    R.string.tools_add_combo_box,
+                    R.string.tools_edit);
+            editFragment.setPdfWidgetItems(widgetItems);
+            editFragment.setEditListListener((widgetItems1, selectedIndexs1) -> {
+                widgetItems.setOptionItems(widgetItems1, selectedIndexs1);
+                widgetItems.updateAp();
+                comboBoxWidgetImpl.onAnnotAttrChange();
+                pageView.invalidate();
+            });
+            if (helper.getReaderView().getContext() instanceof FragmentActivity) {
+                FragmentActivity fragmentActivity = (FragmentActivity) helper.getReaderView().getContext();
+                editFragment.show(fragmentActivity.getSupportFragmentManager(), "editFragment");
+            }
+            helper.dismissContextMenu();
+        });
+        menuView.addItem(R.string.tools_context_menu_attribute, v -> {
+            CStyleManager styleManager = new CStyleManager(comboBoxWidgetImpl, pageView);
+            CAnnotStyle style = styleManager.getStyle(CStyleType.FORM_LIST_BOX);
+            CStyleDialogFragment styleDialogFragment = CStyleDialogFragment.newInstance(style);
+            styleManager.setAnnotStyleFragmentListener(styleDialogFragment);
+            styleDialogFragment.show(helper.getReaderView().getContext());
+        });
+        menuView.addItem(R.string.tools_delete, v -> {
+            pageView.deleteAnnotation(comboBoxWidgetImpl);
+            helper.dismissContextMenu();
+        });
+        return menuView;
+    }
+}

+ 6 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/contextmenu/ContextMenuProviderParams.java

@@ -12,8 +12,10 @@ package com.compdfkit.tools.common.contextmenu;
 
 
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuCheckBoxProvider;
+import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuComboBoxProvider;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuEditImageProvider;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuEditTextProvider;
+import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuFormSignProvider;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuFreeTextProvider;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuInkProvider;
 import com.compdfkit.tools.common.contextmenu.interfaces.ContextMenuLinkProvider;
@@ -58,4 +60,8 @@ class ContextMenuProviderParams {
     public ContextMenuRadioButtonProvider radioButtonProvider;
 
     public ContextMenuListBoxProvider listBoxProvider;
+
+    public ContextMenuComboBoxProvider comboBoxProvider;
+
+    public ContextMenuFormSignProvider formSignatureProvider;
 }

+ 23 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/contextmenu/interfaces/ContextMenuComboBoxProvider.java

@@ -0,0 +1,23 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.common.contextmenu.interfaces;
+
+
+import android.view.View;
+
+import com.compdfkit.tools.common.contextmenu.CPDFContextMenuHelper;
+import com.compdfkit.ui.proxy.form.CPDFComboboxWidgetImpl;
+import com.compdfkit.ui.proxy.form.CPDFListboxWidgetImpl;
+import com.compdfkit.ui.reader.CPDFPageView;
+
+public interface ContextMenuComboBoxProvider {
+
+    View createComboBoxContentView(CPDFContextMenuHelper helper, CPDFPageView pageView, CPDFComboboxWidgetImpl comboBoxWidgetImpl);
+}

+ 23 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/contextmenu/interfaces/ContextMenuFormSignProvider.java

@@ -0,0 +1,23 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.common.contextmenu.interfaces;
+
+
+import android.view.View;
+
+import com.compdfkit.tools.common.contextmenu.CPDFContextMenuHelper;
+import com.compdfkit.ui.proxy.CPDFBaseAnnotImpl;
+import com.compdfkit.ui.proxy.form.CPDFComboboxWidgetImpl;
+import com.compdfkit.ui.reader.CPDFPageView;
+
+public interface ContextMenuFormSignProvider {
+
+    View createFormSignContentView(CPDFContextMenuHelper helper, CPDFPageView pageView, CPDFBaseAnnotImpl annotImpl);
+}

+ 19 - 1
compdfkit-tools/src/main/java/com/compdfkit/tools/common/utils/dialog/CEditDialog.java

@@ -21,6 +21,7 @@ import android.widget.Button;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
 import androidx.appcompat.widget.AppCompatEditText;
 import androidx.appcompat.widget.AppCompatTextView;
 import androidx.fragment.app.DialogFragment;
@@ -33,6 +34,8 @@ public class CEditDialog extends DialogFragment {
 
     private static final String EXTRA_EDIT_TEXT_INFO = "extra_edit_text_info";
 
+    private static final String EXTRA_TITLE = "extra_dialog_title";
+
     private AppCompatTextView tvTitle;
 
     private AppCompatEditText editText;
@@ -43,9 +46,12 @@ public class CEditDialog extends DialogFragment {
 
     private OnEditBookmarkListener editListener;
 
-    public static CEditDialog newInstance(String editTextInfo) {
+    private int hintResId;
+
+    public static CEditDialog newInstance(String title, String editTextInfo) {
         CEditDialog dialog = new CEditDialog();
         Bundle bundle = new Bundle();
+        bundle.putString(EXTRA_TITLE, title);
         bundle.putString(EXTRA_EDIT_TEXT_INFO, editTextInfo);
         dialog.setArguments(bundle);
         return dialog;
@@ -70,8 +76,13 @@ public class CEditDialog extends DialogFragment {
         super.onViewCreated(view, savedInstanceState);
         if (getArguments() != null) {
             String defaultTitle = getArguments().getString(EXTRA_EDIT_TEXT_INFO);
+            String title = getArguments().getString(EXTRA_TITLE, "");
             editText.setText(defaultTitle);
             editText.setSelection(defaultTitle.length());
+            tvTitle.setText(title);
+        }
+        if (hintResId != 0) {
+            editText.setHint(hintResId);
         }
         CViewUtils.showKeyboard(editText);
         btnCancel.setOnClickListener(v -> dismiss());
@@ -85,6 +96,13 @@ public class CEditDialog extends DialogFragment {
         });
     }
 
+    public void setHint(@StringRes int hint){
+        this.hintResId = hint;
+        if (editText != null) {
+            editText.setHint(hint);
+        }
+    }
+
     @Override
     public void dismiss() {
         CViewUtils.hideKeyboard(getDialog());

+ 2 - 2
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfformbar/data/CFormToolDatas.java

@@ -17,8 +17,8 @@ public class CFormToolDatas {
         list.add(new CFormToolBean(CPDFWidget.WidgetType.Widget_CheckBox, R.drawable.tools_ic_form_checkbox));
         list.add(new CFormToolBean(CPDFWidget.WidgetType.Widget_RadioButton, R.drawable.tools_ic_form_radiobutton));
         list.add(new CFormToolBean(CPDFWidget.WidgetType.Widget_ListBox, R.drawable.tools_ic_form_listbox));
-        list.add(new CFormToolBean(CPDFWidget.WidgetType.Widget_PushButton, R.drawable.tools_ic_form_pull_down_menu));
-        list.add(new CFormToolBean(CPDFWidget.WidgetType.Widget_ComboBox, R.drawable.tools_ic_form_button));
+        list.add(new CFormToolBean(CPDFWidget.WidgetType.Widget_ComboBox, R.drawable.tools_ic_form_pull_down_menu));
+        list.add(new CFormToolBean(CPDFWidget.WidgetType.Widget_PushButton, R.drawable.tools_ic_form_button));
         list.add(new CFormToolBean(CPDFWidget.WidgetType.Widget_SignatureFields, R.drawable.tools_ic_form_sign));
         return list;
     }

+ 7 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfstyle/CAnnotStyle.java

@@ -542,6 +542,7 @@ public class CAnnotStyle {
                 titleResId = R.string.tools_annot_freetext;
                 break;
             case ANNOT_SIGNATURE:
+            case FORM_SIGNATURE_FIELDS:
                 titleResId = R.string.tools_annot_signature;
                 break;
             case ANNOT_STAMP:
@@ -565,6 +566,12 @@ public class CAnnotStyle {
             case FORM_RADIO_BUTTON:
                 titleResId = R.string.tools_check_radio_button;
                 break;
+            case FORM_LIST_BOX:
+                titleResId = R.string.tools_check_list_box;
+                break;
+            case FORM_COMBO_BOX:
+                titleResId = R.string.tools_combo_box;
+                break;
             default:
                 titleResId = 0;
                 break;

+ 7 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfstyle/CStyleFragmentDatas.java

@@ -21,6 +21,8 @@ import com.compdfkit.tools.common.views.pdfproperties.basic.CBasicPropertiesFrag
 import com.compdfkit.tools.edit.pdfproperties.CEditImagePropertiesFragment;
 import com.compdfkit.tools.edit.pdfproperties.CEditTextProperFragment;
 import com.compdfkit.tools.form.pdfproperties.pdfcheckbox.CheckBoxStyleFragment;
+import com.compdfkit.tools.form.pdfproperties.pdfcombobox.ComboBoxStyleFragment;
+import com.compdfkit.tools.form.pdfproperties.pdflistbox.CListBoxStyleFragment;
 import com.compdfkit.tools.form.pdfproperties.pdfradiobutton.CRadioButtonStyleFragment;
 import com.compdfkit.tools.form.pdfproperties.pdftextfield.CTextFieldStyleFragment;
 
@@ -46,6 +48,7 @@ public class CStyleFragmentDatas {
             case ANNOT_FREETEXT:
                 return new CPropertiesFragmentBean(style.getAnnotTypeTitleResId(), CFreeTextStyleFragment.class);
             case ANNOT_SIGNATURE:
+            case FORM_SIGNATURE_FIELDS:
                 return new CPropertiesFragmentBean(style.getAnnotTypeTitleResId(), CSignatureStyleFragment.class);
             case ANNOT_STAMP:
                 return new CPropertiesFragmentBean(style.getAnnotTypeTitleResId(), CStampStyleFragment.class);
@@ -61,6 +64,10 @@ public class CStyleFragmentDatas {
                 return new CPropertiesFragmentBean(style.getAnnotTypeTitleResId(), CheckBoxStyleFragment.class);
             case FORM_RADIO_BUTTON:
                 return new CPropertiesFragmentBean(style.getAnnotTypeTitleResId(), CRadioButtonStyleFragment.class);
+            case FORM_LIST_BOX:
+                return new CPropertiesFragmentBean(style.getAnnotTypeTitleResId(), CListBoxStyleFragment.class);
+            case FORM_COMBO_BOX:
+                return new CPropertiesFragmentBean(style.getAnnotTypeTitleResId(), ComboBoxStyleFragment.class);
             default:
                 break;
         }

+ 1 - 1
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfstyle/CStyleUIParams.java

@@ -42,7 +42,7 @@ public class CStyleUIParams implements Serializable {
         params.dimAmount = 0.2F;
         params.backgroundDrawable = R.drawable.tools_annot_style_dialog_window_bg;
         params.dialogStyleType = DialogStyleType.Dialog;
-        if (styleType == CStyleType.ANNOT_STAMP || styleType == CStyleType.ANNOT_SIGNATURE){
+        if (styleType == CStyleType.ANNOT_STAMP || styleType == CStyleType.ANNOT_SIGNATURE || styleType == CStyleType.FORM_SIGNATURE_FIELDS){
             params.fillScreenHeight = true;
             params.theme = R.style.Tools_Base_Theme_BasicBottomSheetDialogStyle;
             params.dialogStyleType = CStyleUIParams.DialogStyleType.Activity;

+ 29 - 1
compdfkit-tools/src/main/java/com/compdfkit/tools/common/views/pdfstyle/manager/CStyleManager.java

@@ -32,6 +32,7 @@ import com.compdfkit.ui.edit.CPDFEditSelections;
 import com.compdfkit.ui.proxy.CPDFBaseAnnotImpl;
 import com.compdfkit.ui.reader.CPDFPageView;
 import com.compdfkit.ui.reader.CPDFReaderView;
+import com.compdfkit.ui.reader.PageView;
 
 import java.util.LinkedHashSet;
 
@@ -57,7 +58,7 @@ public class CStyleManager implements CAnnotStyle.OnAnnotStyleChangeListener {
         this.styleProxy = new CEditSelectionStyle(editSelections, pageView);
     }
 
-    public CStyleManager(CPDFBaseAnnotImpl annotImpl, CPDFPageView pageView) {
+    public CStyleManager(CPDFBaseAnnotImpl annotImpl, PageView pageView) {
         if (annotImpl.getAnnotType() == CPDFAnnotation.Type.WIDGET) {
             this.styleProxy = new CFormStyle(annotImpl, pageView);
         } else {
@@ -398,6 +399,33 @@ public class CStyleManager implements CAnnotStyle.OnAnnotStyleChangeListener {
             return this;
         }
 
+        public Builder setListBox(@ColorInt int textColor,
+                                  @ColorInt int fillColor,
+                                  @ColorInt int borderColor,
+                                  @IntRange(from = 1, to = 100) int fontSize){
+            CAnnotStyle style = new CAnnotStyle(CStyleType.FORM_LIST_BOX);
+            style.setFillColor(fillColor);
+            style.setLineColor(borderColor);
+            style.setTextColor(textColor);
+            style.setFontSize(fontSize);
+            attrSet.add(style);
+            return this;
+        }
+
+        public Builder setComboBox(@ColorInt int textColor,
+                                  @ColorInt int fillColor,
+                                   @ColorInt int borderColor,
+                                   @IntRange(from = 1, to = 100) int fontSize){
+            CAnnotStyle style = new CAnnotStyle(CStyleType.FORM_COMBO_BOX);
+            style.setFillColor(fillColor);
+            style.setLineColor(borderColor);
+            style.setTextColor(textColor);
+            style.setFontSize(fontSize);
+            attrSet.add(style);
+            return this;
+        }
+
+
         private CStyleManager create(CPDFViewCtrl pdfView, boolean onStore) {
             return new CStyleManager(new CPDFGlobalAnnotStyle(pdfView, onStore));
         }

+ 11 - 6
compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdflistbox/CListBoxItemsAdapter.java

@@ -7,27 +7,25 @@
  * This notice may not be removed from this file.
  */
 
-package com.compdfkit.tools.form.pdfproperties.pdflistbox;
+package com.compdfkit.tools.form.pdfproperties.option.edit;
 
 import android.content.Context;
 import android.view.ViewGroup;
 
-import androidx.cardview.widget.CardView;
-import androidx.core.content.ContextCompat;
-
 import com.compdfkit.core.annotation.form.CPDFWidgetItem;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.utils.adapter.CBaseQuickAdapter;
 import com.compdfkit.tools.common.utils.adapter.CBaseQuickViewHolder;
 
+import java.util.Collections;
 import java.util.List;
 
 
-public class CListBoxItemsAdapter extends CBaseQuickAdapter<CPDFWidgetItem, CBaseQuickViewHolder> {
+public class CFormEditItemsAdapter extends CBaseQuickAdapter<CPDFWidgetItem, CBaseQuickViewHolder> {
 
     @Override
     protected CBaseQuickViewHolder onCreateViewHolder(Context context, ViewGroup parent, int viewType) {
-        return new CBaseQuickViewHolder(R.layout.tools_properties_list_box_edit_list_item, parent);
+        return new CBaseQuickViewHolder(R.layout.tools_properties_form_option_edit_list_item, parent);
     }
 
     @Override
@@ -44,4 +42,11 @@ public class CListBoxItemsAdapter extends CBaseQuickAdapter<CPDFWidgetItem, CBas
             onBindViewHolder(holder, position, item);
         }
     }
+
+    public void onMove(int fromPosition, int toPosition) {
+        //对原数据进行移动
+        Collections.swap(list, fromPosition, toPosition);
+        //通知数据移动
+        notifyItemMoved(fromPosition, toPosition);
+    }
 }

+ 78 - 18
compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdflistbox/CListBoxEditFragment.java

@@ -7,11 +7,11 @@
  * This notice may not be removed from this file.
  */
 
-package com.compdfkit.tools.form.pdfproperties.pdflistbox;
+package com.compdfkit.tools.form.pdfproperties.option.edit;
 
 
-import android.graphics.Color;
-import android.graphics.drawable.ColorDrawable;
+import static androidx.recyclerview.widget.ItemTouchHelper.ACTION_STATE_IDLE;
+
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -19,14 +19,15 @@ import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
 import androidx.appcompat.widget.AppCompatButton;
+import androidx.recyclerview.widget.ItemTouchHelper;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.compdfkit.core.annotation.form.CPDFWidgetItem;
 import com.compdfkit.core.annotation.form.CPDFWidgetItems;
 import com.compdfkit.tools.R;
-import com.compdfkit.tools.common.utils.dialog.CCommonInputDialog;
 import com.compdfkit.tools.common.utils.dialog.CDialogFragmentUtil;
 import com.compdfkit.tools.common.utils.dialog.CEditDialog;
 import com.compdfkit.tools.common.utils.viewutils.CViewUtils;
@@ -39,9 +40,14 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.UUID;
 
-public class CListBoxEditFragment extends BottomSheetDialogFragment {
+public class CFormOptionEditFragment extends BottomSheetDialogFragment {
+
+    private static final String EXTRA_TOOL_BAR_TITLE = "extra_tool_bar_title";
+
+    private static final String EXTRA_ADD_DIALOG_TITLE = "extra_add_dialog_title";
+
+    private static final String EXTRA_EDIT_DIALOG_TITLE = "extra_edit_dialog_title";
 
     private CToolBar toolBar;
 
@@ -53,13 +59,18 @@ public class CListBoxEditFragment extends BottomSheetDialogFragment {
 
     private CPDFWidgetItems pdfWidgetItems;
 
-    private CListBoxItemsAdapter itemsAdapter;
+    private CFormEditItemsAdapter itemsAdapter;
 
     private OnEditListListener editListListener;
 
-    public static CListBoxEditFragment newInstance() {
+    public static CFormOptionEditFragment newInstance(@StringRes int title,
+                                                      @StringRes int addDialogTitle,
+                                                      @StringRes int editDialogTitle) {
         Bundle args = new Bundle();
-        CListBoxEditFragment fragment = new CListBoxEditFragment();
+        args.putInt(EXTRA_TOOL_BAR_TITLE, title);
+        args.putInt(EXTRA_ADD_DIALOG_TITLE, addDialogTitle);
+        args.putInt(EXTRA_EDIT_DIALOG_TITLE, editDialogTitle);
+        CFormOptionEditFragment fragment = new CFormOptionEditFragment();
         fragment.setArguments(args);
         return fragment;
     }
@@ -83,7 +94,7 @@ public class CListBoxEditFragment extends BottomSheetDialogFragment {
     @Nullable
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
-        View rootView = inflater.inflate(R.layout.tools_properties_list_box_edit_fragment, container, false);
+        View rootView = inflater.inflate(R.layout.tools_properties_form_option_edit_fragment, container, false);
         rvList = rootView.findViewById(R.id.rv_list_box);
         fabAdd = rootView.findViewById(R.id.fab_add);
         toolBar = rootView.findViewById(R.id.tool_bar);
@@ -94,13 +105,20 @@ public class CListBoxEditFragment extends BottomSheetDialogFragment {
     @Override
     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        itemsAdapter = new CListBoxItemsAdapter();
+        if (getArguments() != null) {
+            toolBar.setTitle(getArguments().getInt(EXTRA_TOOL_BAR_TITLE,-1));
+        }
+        itemsAdapter = new CFormEditItemsAdapter();
         itemsAdapter.setList(getItems());
         itemsAdapter.addOnItemChildClickListener(R.id.iv_more, (adapter, view1, position) -> {
             CPDFWidgetItem item = adapter.list.get(position);
             CPopupMenuWindow menuWindow = new CPopupMenuWindow(getContext());
             menuWindow.addItem(R.string.tools_edit, v1 -> {
-                CEditDialog editDialog = CEditDialog.newInstance(item.text);
+                int titleRes = R.string.tools_edit;
+                if (getArguments() != null) {
+                    titleRes = getArguments().getInt(EXTRA_EDIT_DIALOG_TITLE, R.string.tools_edit);
+                }
+                CEditDialog editDialog = CEditDialog.newInstance(getString(titleRes), item.text);
                 editDialog.setEditListener(text -> {
                     item.text = text;
                     item.value = text;
@@ -116,9 +134,47 @@ public class CListBoxEditFragment extends BottomSheetDialogFragment {
             menuWindow.showAsDropDown(view1);
         });
 
-
         rvList.setLayoutManager(new LinearLayoutManager(getContext()));
         rvList.setAdapter(itemsAdapter);
+        ItemTouchHelper.Callback callback = new ItemTouchHelper.Callback(){
+
+            @Override
+            public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
+                return makeMovementFlags(ItemTouchHelper.DOWN | ItemTouchHelper.UP, ACTION_STATE_IDLE);
+            }
+
+            @Override
+            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
+                if (itemsAdapter != null){
+                    itemsAdapter.onMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
+                }
+                return true;
+            }
+
+            @Override
+            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
+
+            }
+
+            @Override
+            public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
+                if (actionState != 0){
+                    viewHolder.itemView.setAlpha(0.9F);
+                }
+                super.onSelectedChanged(viewHolder, actionState);
+            }
+
+            @Override
+            public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
+                super.clearView(recyclerView, viewHolder);
+                viewHolder.itemView.setAlpha(1.0F);
+                if (itemsAdapter != null){
+                    itemsAdapter.notifyDataSetChanged();
+                }
+            }
+        };
+        ItemTouchHelper helper = new ItemTouchHelper(callback);
+        helper.attachToRecyclerView(rvList);
         toolBar.setBackBtnClickListener(v -> dismiss());
         btnDone.setOnClickListener(v -> {
             if (editListListener != null) {
@@ -140,12 +196,16 @@ public class CListBoxEditFragment extends BottomSheetDialogFragment {
             dismiss();
         });
         fabAdd.setOnClickListener(v -> {
-            if (itemsAdapter.list.size() == 0) {
-                itemsAdapter.addItem(new CPDFWidgetItem("New Item", "New Item"));
-            } else {
-                String value = "New Item - " + UUID.randomUUID().toString().substring(0, 4);
-                itemsAdapter.addItem(new CPDFWidgetItem(value, value));
+            int titleRes = R.string.tools_edit;
+            if (getArguments() != null) {
+                titleRes = getArguments().getInt(EXTRA_ADD_DIALOG_TITLE, R.string.tools_edit);
             }
+            CEditDialog editDialog = CEditDialog.newInstance(getString(titleRes), "");
+            editDialog.setEditListener(text -> {
+                itemsAdapter.addItem(new CPDFWidgetItem(text, text));
+                editDialog.dismiss();
+            });
+            editDialog.show(getChildFragmentManager(), "editDialog");
         });
     }
 

+ 45 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/option/select/CFormOptionListAdapter.java

@@ -0,0 +1,45 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.form.pdfproperties.option.select;
+
+import android.content.Context;
+import android.view.ViewGroup;
+
+import com.compdfkit.core.annotation.form.CPDFWidgetItem;
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.utils.adapter.CBaseQuickAdapter;
+import com.compdfkit.tools.common.utils.adapter.CBaseQuickViewHolder;
+
+
+public class CFormOptionListAdapter extends CBaseQuickAdapter<CPDFWidgetItem, CBaseQuickViewHolder> {
+
+    private CPDFWidgetItem selectItem = null;
+
+    @Override
+    protected CBaseQuickViewHolder onCreateViewHolder(Context context, ViewGroup parent, int viewType) {
+        return new CBaseQuickViewHolder(R.layout.tools_properties_form_option_list_item, parent);
+    }
+
+    @Override
+    protected void onBindViewHolder(CBaseQuickViewHolder holder, int position, CPDFWidgetItem item) {
+        holder.setText(R.id.tv_check_box, item.text);
+        holder.setSelected(R.id.iv_check_box_status, selectItem != null && item.text.equals(selectItem.text));
+    }
+
+
+    public void setSelectItem(CPDFWidgetItem selectItem) {
+        this.selectItem = selectItem;
+        notifyDataSetChanged();
+    }
+
+    public CPDFWidgetItem getSelectItem() {
+        return selectItem;
+    }
+}

+ 142 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/option/select/CFormOptionSelectDialogFragment.java

@@ -0,0 +1,142 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.form.pdfproperties.option.select;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.widget.AppCompatImageView;
+import androidx.appcompat.widget.AppCompatTextView;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.compdfkit.core.annotation.form.CPDFWidgetItem;
+import com.compdfkit.core.annotation.form.CPDFWidgetItems;
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.utils.dialog.CDialogFragmentUtil;
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+
+public class CFormOptionSelectDialogFragment extends BottomSheetDialogFragment {
+
+    private AppCompatTextView tvTitle;
+
+    private AppCompatImageView ivClose;
+
+    private RecyclerView rvOptions;
+
+    private CFormOptionListAdapter optionListAdapter;
+
+    private CPDFWidgetItems pdfWidgetItems;
+
+    private OnSelectOptionListener selectOptionListener;
+
+    public static CFormOptionSelectDialogFragment newInstance() {
+        Bundle args = new Bundle();
+        CFormOptionSelectDialogFragment fragment = new CFormOptionSelectDialogFragment();
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    public void setPdfWidgetItems(CPDFWidgetItems pdfWidgetItems) {
+        this.pdfWidgetItems = pdfWidgetItems;
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setStyle(STYLE_NORMAL, R.style.Tools_Base_Theme_BasicBottomSheetDialogStyle_TopCorners);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        CDialogFragmentUtil.setDimAmount(getDialog(), 0.2F);
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View rootView = inflater.inflate(R.layout.tools_properties_form_option_select_fragment, container, false);
+        tvTitle = rootView.findViewById(R.id.tv_tool_bar_title);
+        ivClose = rootView.findViewById(R.id.iv_tool_bar_close);
+        rvOptions = rootView.findViewById(R.id.rv_options);
+        return rootView;
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        tvTitle.setText(R.string.tools_please_select_option);
+        ivClose.setOnClickListener(v -> {
+            dismiss();
+        });
+        optionListAdapter = new CFormOptionListAdapter();
+        optionListAdapter.setList(getItems());
+        optionListAdapter.setSelectItem(getSelectedItem());
+        optionListAdapter.setOnItemClickListener((adapter, view1, position) -> {
+            if (optionListAdapter != null) {
+                optionListAdapter.setSelectItem(adapter.list.get(position));
+
+                CPDFWidgetItem[] items = new CPDFWidgetItem[optionListAdapter.getItemCount()];
+                optionListAdapter.list.toArray(items);
+                int[] selectedIndexs = null;
+                CPDFWidgetItem selectedItem = optionListAdapter.getSelectItem();
+                if (selectedItem != null){
+                    for (int i = 0; i < items.length; i++) {
+                        CPDFWidgetItem widgetItem = items[i];
+                        if (widgetItem.text.equals(selectedItem.text)){
+                            selectedIndexs = new int[1];
+                            selectedIndexs[0] = i;
+                        }
+                    }
+                }
+                if (selectOptionListener != null) {
+                    selectOptionListener.select(selectedIndexs);
+                }
+            }
+            dismiss();
+        });
+        rvOptions.setLayoutManager(new LinearLayoutManager(getContext()));
+        rvOptions.setAdapter(optionListAdapter);
+    }
+
+    private List<CPDFWidgetItem> getItems(){
+        if (pdfWidgetItems == null || pdfWidgetItems.getOptions() == null){
+            return new ArrayList<>();
+        }
+        return Arrays.asList(pdfWidgetItems.getOptions());
+    }
+
+    private CPDFWidgetItem getSelectedItem(){
+        int[] selectedIndexs = pdfWidgetItems.getSelectedIndexes();
+        CPDFWidgetItem selectedItem = null;
+        if (selectedIndexs != null && selectedIndexs.length > 0){
+            selectedItem = pdfWidgetItems.getOptionByIndex(selectedIndexs[0]);
+        }
+        return selectedItem;
+    }
+
+    public void setSelectOptionListener(OnSelectOptionListener selectOptionListener) {
+        this.selectOptionListener = selectOptionListener;
+    }
+
+    public interface OnSelectOptionListener {
+        void select(int[] selectedIndexs);
+    }
+}

+ 6 - 2
compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdfcheckbox/CheckBoxStyleFragment.java

@@ -99,7 +99,9 @@ public class CheckBoxStyleFragment extends CBasicPropertiesFragment implements V
 
                 @Override
                 public void opacity(int opacity) {
-
+                    if (viewModel != null) {
+                        viewModel.getStyle().setLineColorOpacity(opacity);
+                    }
                 }
             });
         });
@@ -120,7 +122,9 @@ public class CheckBoxStyleFragment extends CBasicPropertiesFragment implements V
 
                 @Override
                 public void opacity(int opacity) {
-
+                    if (viewModel != null) {
+                        viewModel.getStyle().setFillColorOpacity(opacity);
+                    }
                 }
             });
         });

+ 16 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdfcombobox/ComboBoxStyleFragment.java

@@ -0,0 +1,16 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.form.pdfproperties.pdfcombobox;
+
+import com.compdfkit.tools.form.pdfproperties.pdflistbox.CListBoxStyleFragment;
+
+
+public class ComboBoxStyleFragment extends CListBoxStyleFragment {
+}

+ 36 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdfcombobox/CustomComboBoxWidgetImpl.java

@@ -0,0 +1,36 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.form.pdfproperties.pdfcombobox;
+
+import androidx.fragment.app.FragmentActivity;
+
+import com.compdfkit.core.annotation.form.CPDFComboboxWidget;
+import com.compdfkit.tools.form.pdfproperties.option.select.CFormOptionSelectDialogFragment;
+import com.compdfkit.ui.proxy.form.CPDFComboboxWidgetImpl;
+
+
+public class CustomComboBoxWidgetImpl extends CPDFComboboxWidgetImpl {
+
+
+    @Override
+    public void onComboboxFocused(CPDFComboboxWidget cpdfComboboxWidget) {
+        CFormOptionSelectDialogFragment selectDialogFragment = CFormOptionSelectDialogFragment.newInstance();
+        selectDialogFragment.setPdfWidgetItems(cpdfComboboxWidget);
+        selectDialogFragment.setSelectOptionListener((selectedIndexs) -> {
+            cpdfComboboxWidget.setSelectedIndexes(selectedIndexs);
+            cpdfComboboxWidget.updateAp();
+            refresh();
+        });
+        if (readerView.getContext() instanceof FragmentActivity) {
+            FragmentActivity activity = (FragmentActivity) readerView.getContext();
+            selectDialogFragment.show(activity.getSupportFragmentManager(), "optionDialogFragment");
+        }
+    }
+}

+ 275 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdflistbox/CListBoxStyleFragment.java

@@ -0,0 +1,275 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.form.pdfproperties.pdflistbox;
+
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.LinearLayout;
+import android.widget.Spinner;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.widget.AppCompatEditText;
+import androidx.appcompat.widget.AppCompatImageView;
+import androidx.appcompat.widget.AppCompatTextView;
+
+import com.compdfkit.core.annotation.CPDFTextAttribute;
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.common.utils.view.colorpicker.widget.ColorPickerView;
+import com.compdfkit.tools.common.utils.view.sliderbar.CSliderBar;
+import com.compdfkit.tools.common.views.pdfproperties.CPropertiesSwitchView;
+import com.compdfkit.tools.common.views.pdfproperties.basic.CBasicPropertiesFragment;
+import com.compdfkit.tools.common.views.pdfproperties.colorlist.CColorListView;
+import com.compdfkit.tools.common.views.pdfproperties.font.CFontSpinnerAdapter;
+import com.compdfkit.tools.common.views.pdfproperties.textfields.CTextFieldsView;
+import com.compdfkit.tools.common.views.pdfstyle.CAnnotStyle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CListBoxStyleFragment extends CBasicPropertiesFragment implements View.OnClickListener{
+
+    public static CListBoxStyleFragment newInstance() {
+        return new CListBoxStyleFragment();
+    }
+
+    private CTextFieldsView textFieldsView;
+
+    private CColorListView borderColorListView;
+
+    private CColorListView backgroundColorListView;
+
+    private CColorListView textColorListView;
+
+    private AppCompatTextView tvFontType;
+
+    private AppCompatImageView ivFontItalic;
+
+    private AppCompatImageView ivFontBold;
+
+    private CPropertiesSwitchView hideFormSwitch;
+
+    private CSliderBar fontSizeSliderBar;
+
+    private Spinner fontSpinner;
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View rootView = inflater.inflate(R.layout.tools_properties_list_box_style_fragment, container, false);
+        textFieldsView = rootView.findViewById(R.id.text_field_view);
+        borderColorListView = rootView.findViewById(R.id.border_color_list_view);
+        backgroundColorListView = rootView.findViewById(R.id.background_color_list_view);
+        textColorListView = rootView.findViewById(R.id.text_color_list_view);
+        tvFontType = rootView.findViewById(R.id.tv_font_type);
+        ivFontItalic = rootView.findViewById(R.id.iv_font_italic);
+        ivFontBold = rootView.findViewById(R.id.iv_font_bold);
+        fontSizeSliderBar = rootView.findViewById(R.id.font_size_slider_bar);
+        fontSpinner = rootView.findViewById(R.id.spinner_font);
+        hideFormSwitch = rootView.findViewById(R.id.switch_hide_form);
+
+        tvFontType.setOnClickListener(this);
+        ivFontItalic.setOnClickListener(this);
+        ivFontBold.setOnClickListener(this);
+        return rootView;
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        CAnnotStyle annotStyle = viewModel.getStyle();
+        if (annotStyle != null) {
+            List<CPDFTextAttribute.FontNameHelper.FontType> fontTypes = new ArrayList<>();
+            fontTypes.add(CPDFTextAttribute.FontNameHelper.FontType.Unknown);
+            fontTypes.add(CPDFTextAttribute.FontNameHelper.FontType.Courier);
+            fontTypes.add(CPDFTextAttribute.FontNameHelper.FontType.Helvetica);
+            fontTypes.add(CPDFTextAttribute.FontNameHelper.FontType.Times_Roman);
+            CFontSpinnerAdapter fontSpinnerAdapter = new CFontSpinnerAdapter(getContext(), fontTypes);
+            fontSpinner.setAdapter(fontSpinnerAdapter);
+            switch (annotStyle.getFontType()) {
+                case Unknown:
+                    fontSpinner.setSelection(0);
+                    break;
+                case Courier:
+                    fontSpinner.setSelection(1);
+                    break;
+                case Helvetica:
+                    fontSpinner.setSelection(2);
+                    break;
+                case Times_Roman:
+                    fontSpinner.setSelection(3);
+                    break;
+                default:break;
+            }
+            textFieldsView.setText(annotStyle.getFormFieldName());
+            borderColorListView.setSelectColor(annotStyle.getLineColor());
+            backgroundColorListView.setSelectColor(annotStyle.getFillColor());
+            textColorListView.setSelectColor(annotStyle.getTextColor());
+            ivFontBold.setSelected(annotStyle.isFontBold());
+            ivFontItalic.setSelected(annotStyle.isFontItalic());
+            hideFormSwitch.setChecked(annotStyle.isHideForm());
+            fontSizeSliderBar.setProgress(annotStyle.getFontSize());
+        }
+        viewModel.addStyleChangeListener(this);
+        borderColorListView.setOnColorSelectListener(color -> {
+            if (viewModel != null) {
+                viewModel.getStyle().setLineColor(color);
+            }
+        });
+        borderColorListView.setColorPickerClickListener(() -> {
+            CAnnotStyle cAnnotStyle = viewModel.getStyle();
+            showColorPickerFragment(cAnnotStyle.getLineColor(), cAnnotStyle.getLineColorOpacity(), new ColorPickerView.COnColorChangeListener() {
+                @Override
+                public void color(int color) {
+                    if (viewModel != null) {
+                        viewModel.getStyle().setLineColor(color);
+                    }
+                }
+
+                @Override
+                public void opacity(int opacity) {
+
+                }
+            });
+        });
+        backgroundColorListView.setOnColorSelectListener(color -> {
+            if (viewModel != null) {
+                viewModel.getStyle().setFillColor(color);
+            }
+        });
+        backgroundColorListView.setColorPickerClickListener(() -> {
+            CAnnotStyle cAnnotStyle = viewModel.getStyle();
+            showColorPickerFragment(cAnnotStyle.getFillColor(), cAnnotStyle.getFillColorOpacity(), new ColorPickerView.COnColorChangeListener() {
+                @Override
+                public void color(int color) {
+                    if (viewModel != null) {
+                        viewModel.getStyle().setFillColor(color);
+                    }
+                }
+
+                @Override
+                public void opacity(int opacity) {
+
+                }
+            });
+        });
+        textColorListView.setOnColorSelectListener(color -> {
+            if (viewModel != null) {
+                viewModel.getStyle().setTextColor(color);
+            }
+        });
+        textColorListView.setColorPickerClickListener(() -> {
+            CAnnotStyle cAnnotStyle = viewModel.getStyle();
+            showColorPickerFragment(cAnnotStyle.getTextColor(), cAnnotStyle.getTextColorOpacity(), new ColorPickerView.COnColorChangeListener() {
+                @Override
+                public void color(int color) {
+                    if (viewModel != null) {
+                        viewModel.getStyle().setTextColor(color);
+                    }
+                }
+
+                @Override
+                public void opacity(int opacity) {
+
+                }
+            });
+        });
+        fontSizeSliderBar.setChangeListener((progress, percentageValue, isStop) -> {
+            if (isStop) {
+                if (viewModel != null) {
+                    viewModel.getStyle().setFontSize(progress);
+                }
+            }
+        });
+        fontSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+                if (viewModel != null) {
+                    CPDFTextAttribute.FontNameHelper.FontType fontType = (CPDFTextAttribute.FontNameHelper.FontType) fontSpinner.getItemAtPosition(position);
+                    viewModel.getStyle().setFontType(fontType);
+                }
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+
+            }
+        });
+        textFieldsView.setTextChangedListener((s, start, before, count) -> {
+            if (viewModel != null) {
+                if (TextUtils.isEmpty(s)){
+                    viewModel.getStyle().setFormFieldName("");
+                }else {
+                    viewModel.getStyle().setFormFieldName(s.toString());
+                }
+            }
+        });
+        hideFormSwitch.setListener((buttonView, isChecked) -> {
+            if (viewModel != null) {
+                viewModel.getStyle().setHideForm(isChecked);
+            }
+        });
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == R.id.tv_font_type) {
+            showFontTypeFragment(viewModel.getStyle().getFontType(), fontType -> {
+                if (viewModel != null) {
+                    viewModel.getStyle().setFontType(fontType);
+                }
+            });
+        } else if (v.getId() == R.id.iv_font_bold) {
+            ivFontBold.setSelected(!ivFontBold.isSelected());
+            if (viewModel != null) {
+                viewModel.getStyle().setFontBold(ivFontBold.isSelected());
+            }
+        } else if (v.getId() == R.id.iv_font_italic) {
+            ivFontItalic.setSelected(!ivFontItalic.isSelected());
+            if (viewModel != null) {
+                viewModel.getStyle().setFontItalic(ivFontItalic.isSelected());
+            }
+        } else {}
+    }
+
+    @Override
+    public void onChangeTextColor(int textColor) {
+        if (!isOnResume) {
+            if (textColorListView != null) {
+                textColorListView.setSelectColor(textColor);
+            }
+        }
+    }
+
+    @Override
+    public void onChangeLineColor(int color) {
+        if (!isOnResume) {
+            if (borderColorListView != null) {
+                borderColorListView.setSelectColor(color);
+            }
+        }
+    }
+
+    @Override
+    public void onChangeFillColor(int color) {
+        if (!isOnResume) {
+            if (backgroundColorListView != null) {
+                backgroundColorListView.setSelectColor(color);
+            }
+        }
+    }
+}

+ 36 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdflistbox/CustomListBoxWidgetImpl.java

@@ -0,0 +1,36 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.form.pdfproperties.pdflistbox;
+
+
+import androidx.fragment.app.FragmentActivity;
+
+import com.compdfkit.core.annotation.form.CPDFListboxWidget;
+import com.compdfkit.tools.form.pdfproperties.option.select.CFormOptionSelectDialogFragment;
+import com.compdfkit.ui.proxy.form.CPDFListboxWidgetImpl;
+
+public class CustomListBoxWidgetImpl extends CPDFListboxWidgetImpl {
+
+
+    @Override
+    public void onListboxFocused(CPDFListboxWidget cpdfListboxWidget) {
+        CFormOptionSelectDialogFragment selectDialogFragment = CFormOptionSelectDialogFragment.newInstance();
+        selectDialogFragment.setPdfWidgetItems(cpdfListboxWidget);
+        selectDialogFragment.setSelectOptionListener((selectedIndexs) -> {
+            cpdfListboxWidget.setSelectedIndexes(selectedIndexs);
+            cpdfListboxWidget.updateAp();
+            refresh();
+        });
+        if (readerView.getContext() instanceof FragmentActivity) {
+            FragmentActivity activity = (FragmentActivity) readerView.getContext();
+            selectDialogFragment.show(activity.getSupportFragmentManager(), "optionDialogFragment");
+        }
+    }
+}

+ 56 - 0
compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdfsign/CustomSignatureWidgetImpl.java

@@ -0,0 +1,56 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.tools.form.pdfproperties.pdfsign;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.text.TextUtils;
+
+import androidx.fragment.app.FragmentActivity;
+
+import com.compdfkit.core.annotation.CPDFImageScaleType;
+import com.compdfkit.core.annotation.form.CPDFSignatureWidget;
+import com.compdfkit.tools.common.views.pdfstyle.CAnnotStyle;
+import com.compdfkit.tools.common.views.pdfstyle.CStyleDialogFragment;
+import com.compdfkit.tools.common.views.pdfstyle.CStyleType;
+import com.compdfkit.tools.common.views.pdfstyle.CStyleUIParams;
+import com.compdfkit.tools.common.views.pdfstyle.manager.CStyleManager;
+import com.compdfkit.ui.proxy.form.CPDFSignatureWidgetImpl;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+
+
+public class CustomSignatureWidgetImpl extends CPDFSignatureWidgetImpl {
+
+    @Override
+    public void onSignatureWidgetFocused(CPDFSignatureWidget cpdfSignatureWidget) {
+        CStyleManager styleManager = new CStyleManager(this, pageView);
+        CStyleDialogFragment styleDialogFragment = CStyleDialogFragment.newInstance(styleManager.getStyle(CStyleType.FORM_SIGNATURE_FIELDS));
+        CStyleUIParams styleUiParams = CStyleUIParams.defaultStyle(CStyleType.FORM_SIGNATURE_FIELDS);
+        styleDialogFragment.setStyleUiConfig(styleUiParams);
+        styleDialogFragment.setStyleDialogDismissListener(() -> {
+            CAnnotStyle annotStyle = styleDialogFragment.getAnnotStyle();
+            if (!TextUtils.isEmpty(annotStyle.getImagePath())) {
+                try {
+                    FileInputStream fileInputStream = new FileInputStream(annotStyle.getImagePath());
+                    Bitmap bitmap = BitmapFactory.decodeStream(fileInputStream);
+                    ((CPDFSignatureWidget) pdfAnnotation).updateApWithBitmap(bitmap, CPDFImageScaleType.SCALETYPE_fitCenter);
+                    refresh();
+                } catch (FileNotFoundException e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+        if (readerView.getContext() instanceof FragmentActivity) {
+            styleDialogFragment.show(((FragmentActivity) readerView.getContext()).getSupportFragmentManager(), "styleDialog");
+        }
+    }
+}

+ 70 - 2
compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdfstyle/CFormStyle.java

@@ -11,11 +11,13 @@ package com.compdfkit.tools.form.pdfproperties.pdfstyle;
 
 
 import android.graphics.Color;
+import android.util.Log;
 
 import com.compdfkit.core.annotation.CPDFAnnotation;
 import com.compdfkit.core.annotation.CPDFTextAlignment;
 import com.compdfkit.core.annotation.CPDFTextAttribute;
 import com.compdfkit.core.annotation.form.CPDFCheckboxWidget;
+import com.compdfkit.core.annotation.form.CPDFComboboxWidget;
 import com.compdfkit.core.annotation.form.CPDFListboxWidget;
 import com.compdfkit.core.annotation.form.CPDFRadiobuttonWidget;
 import com.compdfkit.core.annotation.form.CPDFTextWidget;
@@ -25,10 +27,12 @@ import com.compdfkit.tools.common.views.pdfstyle.CStyleType;
 import com.compdfkit.tools.common.views.pdfstyle.manager.CStyleProvider;
 import com.compdfkit.ui.proxy.CPDFBaseAnnotImpl;
 import com.compdfkit.ui.proxy.form.CPDFCheckboxWidgetImpl;
+import com.compdfkit.ui.proxy.form.CPDFComboboxWidgetImpl;
 import com.compdfkit.ui.proxy.form.CPDFListboxWidgetImpl;
 import com.compdfkit.ui.proxy.form.CPDFRadiobuttonWidgetImpl;
 import com.compdfkit.ui.proxy.form.CPDFTextWidgetImpl;
 import com.compdfkit.ui.reader.CPDFPageView;
+import com.compdfkit.ui.reader.PageView;
 
 import java.util.LinkedHashSet;
 
@@ -37,9 +41,9 @@ public class CFormStyle implements CStyleProvider {
 
     private CPDFBaseAnnotImpl baseAnnotImpl;
 
-    private CPDFPageView pageView;
+    private PageView pageView;
 
-    public CFormStyle(CPDFBaseAnnotImpl baseAnnotImpl, CPDFPageView pageView) {
+    public CFormStyle(CPDFBaseAnnotImpl baseAnnotImpl, PageView pageView) {
         this.baseAnnotImpl = baseAnnotImpl;
         this.pageView = pageView;
     }
@@ -95,6 +99,8 @@ public class CFormStyle implements CStyleProvider {
                 checkboxWidget.setWidgetBgRGBColor(style.getFillColor());
                 checkboxWidget.setHidden(style.isHideForm());
                 checkboxWidget.setFieldName(style.getFormFieldName());
+                checkboxWidget.setTransparency(0.1F);
+                checkboxWidget.setFilledTransparency(0.1F);
                 checkboxWidget.setChecked(style.isChecked());
                 checkboxWidget.updateAp();
                 baseAnnotImpl.onAnnotAttrChange();
@@ -115,6 +121,44 @@ public class CFormStyle implements CStyleProvider {
                 if (pageView != null) {
                     pageView.invalidate();
                 }
+            } else if (baseAnnotImpl instanceof CPDFListboxWidgetImpl) {
+                CPDFListboxWidget listBoxWidget = (CPDFListboxWidget) pdfAnnotation;
+                listBoxWidget.setFieldName(style.getFormFieldName());
+                listBoxWidget.setHidden(style.isHideForm());
+                listBoxWidget.setBorderWidth(2);
+                listBoxWidget.setFontSize(style.getFontSize());
+                listBoxWidget.setFontRGBColor(style.getTextColor());
+                listBoxWidget.setWidgetBgRGBColor(style.getFillColor());
+                if (style.getLineColor() == Color.TRANSPARENT){
+                    listBoxWidget.setBorderWidth(0);
+                }
+                listBoxWidget.setWidgetBorderRGBColor(style.getLineColor());
+                String fontName = CPDFTextAttribute.FontNameHelper.obtainFontName(style.getFontType(), style.isFontBold(), style.isFontItalic());
+                listBoxWidget.setFontName(fontName);
+                listBoxWidget.updateAp();
+                baseAnnotImpl.onAnnotAttrChange();
+                if (pageView != null) {
+                    pageView.invalidate();
+                }
+            }  else if (baseAnnotImpl instanceof CPDFComboboxWidgetImpl) {
+                CPDFComboboxWidget comboBoxWidget = (CPDFComboboxWidget) pdfAnnotation;
+                comboBoxWidget.setFieldName(style.getFormFieldName());
+                comboBoxWidget.setHidden(style.isHideForm());
+                comboBoxWidget.setBorderWidth(2);
+                comboBoxWidget.setFontSize(style.getFontSize());
+                comboBoxWidget.setFontRGBColor(style.getTextColor());
+                comboBoxWidget.setWidgetBgRGBColor(style.getFillColor());
+                if (style.getLineColor() == Color.TRANSPARENT){
+                    comboBoxWidget.setBorderWidth(0);
+                }
+                comboBoxWidget.setWidgetBorderRGBColor(style.getLineColor());
+                String fontName = CPDFTextAttribute.FontNameHelper.obtainFontName(style.getFontType(), style.isFontBold(), style.isFontItalic());
+                comboBoxWidget.setFontName(fontName);
+                comboBoxWidget.updateAp();
+                baseAnnotImpl.onAnnotAttrChange();
+                if (pageView != null) {
+                    pageView.invalidate();
+                }
             }
         }
     }
@@ -173,6 +217,30 @@ public class CFormStyle implements CStyleProvider {
             style.setChecked(textWidget.isChecked());
         } else if (baseAnnotImpl instanceof CPDFListboxWidgetImpl){
             CPDFListboxWidget listBoxWidget = (CPDFListboxWidget) pdfAnnotation;
+            style.setBorderWidth(2);
+            style.setLineColor(listBoxWidget.getWidgetBorderRGBColor());
+            style.setFillColor(listBoxWidget.getWidgetBgRGBColor());
+            style.setTextColor(listBoxWidget.getFontRGBColor());
+            style.setFontSize((int) listBoxWidget.getFontSize());
+            style.setFormFieldName(listBoxWidget.getFieldName());
+            style.setHideForm(listBoxWidget.isHidden());
+            CPDFTextAttribute.FontNameHelper.FontType fontType = CPDFTextAttribute.FontNameHelper.getFontType(listBoxWidget.getFontName());
+            style.setFontType(fontType);
+            style.setFontBold(CPDFTextAttribute.FontNameHelper.isBold(listBoxWidget.getFontName()));
+            style.setFontItalic(CPDFTextAttribute.FontNameHelper.isItalic(listBoxWidget.getFontName()));
+        } else if (baseAnnotImpl instanceof CPDFComboboxWidgetImpl){
+            CPDFComboboxWidget comboBoxWidget = (CPDFComboboxWidget) pdfAnnotation;
+            style.setBorderWidth(2);
+            style.setLineColor(comboBoxWidget.getWidgetBorderRGBColor());
+            style.setFillColor(comboBoxWidget.getWidgetBgRGBColor());
+            style.setTextColor(comboBoxWidget.getFontRGBColor());
+            style.setFontSize((int) comboBoxWidget.getFontSize());
+            style.setFormFieldName(comboBoxWidget.getFieldName());
+            style.setHideForm(comboBoxWidget.isHidden());
+            CPDFTextAttribute.FontNameHelper.FontType fontType = CPDFTextAttribute.FontNameHelper.getFontType(comboBoxWidget.getFontName());
+            style.setFontType(fontType);
+            style.setFontBold(CPDFTextAttribute.FontNameHelper.isBold(comboBoxWidget.getFontName()));
+            style.setFontItalic(CPDFTextAttribute.FontNameHelper.isItalic(comboBoxWidget.getFontName()));
         }
         return style;
     }

+ 3 - 1
compdfkit-tools/src/main/java/com/compdfkit/tools/form/pdfproperties/pdftextfield/CTextFieldStyleFragment.java

@@ -204,7 +204,9 @@ public class CTextFieldStyleFragment extends CBasicPropertiesFragment implements
 
                 @Override
                 public void opacity(int opacity) {
-
+                    if (viewModel != null) {
+                        viewModel.getStyle().setFillColorOpacity(opacity);
+                    }
                 }
             });
         });

+ 4 - 2
compdfkit-tools/src/main/java/com/compdfkit/tools/viewer/pdfbookmark/CPDFBookmarkFragment.java

@@ -90,7 +90,8 @@ public class CPDFBookmarkFragment extends Fragment {
         });
 
         bookmarkListAdapter.setEditBookmarkClickListener((bookmark, index) -> {
-            CEditDialog editBookmarkDialog = CEditDialog.newInstance(bookmark.getTitle());
+            CEditDialog editBookmarkDialog = CEditDialog.newInstance(getString(R.string.tools_edit_bookmark_title), bookmark.getTitle());
+            editBookmarkDialog.setHint(R.string.tools_bookmark_et_hint);
             editBookmarkDialog.setEditListener(title -> {
                 if (pdfView != null) {
                     pdfView.getCPdfReaderView().getPDFDocument().getBookmarks()
@@ -110,7 +111,8 @@ public class CPDFBookmarkFragment extends Fragment {
                 Toast.makeText(getContext(), getString(R.string.tools_has_bookmark), Toast.LENGTH_SHORT).show();
                 return;
             }
-            CEditDialog editBookmarkDialog = CEditDialog.newInstance("");
+            CEditDialog editBookmarkDialog = CEditDialog.newInstance(getString(R.string.tools_add_bookmark_title), "");
+            editBookmarkDialog.setHint(R.string.tools_bookmark_et_hint);
             editBookmarkDialog.setEditListener(title -> {
                 if (pdfView != null) {
                     int pageIndex = pdfView.currentPageIndex;

+ 1 - 2
compdfkit-tools/src/main/res/layout/tools_bota_bookmark_input_dialog.xml

@@ -22,7 +22,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:gravity="center_vertical|start"
-            android:text="@string/tools_bookmark_title"
+            android:text="@string/tools_add_bookmark_title"
             android:layout_marginHorizontal="24dp"
             android:textColor="@color/tools_text_color_primary"
             android:textSize="16sp"
@@ -36,7 +36,6 @@
             android:layout_marginTop="12dp"
             android:backgroundTint="@color/tools_color_accent"
             android:gravity="center_vertical"
-            android:hint="@string/tools_bookmark_et_hint"
             android:layout_marginHorizontal="24dp"
             android:maxLines="1"
             android:minHeight="45dp"

+ 1 - 1
compdfkit-tools/src/main/res/layout/tools_properties_list_box_edit_fragment.xml

@@ -36,7 +36,7 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"
-        tools:listitem="@layout/tools_properties_list_box_edit_list_item" />
+        tools:listitem="@layout/tools_properties_form_option_edit_list_item" />
 
 
     <com.google.android.material.floatingactionbutton.FloatingActionButton

+ 1 - 0
compdfkit-tools/src/main/res/layout/tools_properties_list_box_edit_list_item.xml

@@ -5,6 +5,7 @@
     android:id="@+id/cl_item"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    android:background="@color/tools_color_background"
     android:foreground="@drawable/tools_common_btn_rectangle_ripple">
 
     <androidx.appcompat.widget.AppCompatImageView

+ 32 - 0
compdfkit-tools/src/main/res/layout/tools_properties_form_option_list_item.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="44dp"
+    android:background="@drawable/tools_common_btn_rectangle_ripple"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <androidx.appcompat.widget.AppCompatImageView
+        android:id="@+id/iv_check_box_status"
+        android:layout_width="24dp"
+        android:layout_height="24dp"
+        android:layout_marginStart="16dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:srcCompat="@drawable/tools_ic_checkbox_radio" />
+
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:layout_constraintStart_toEndOf="@id/iv_check_box_status"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_marginStart="8dp"
+        android:id="@+id/tv_check_box"
+        tools:text="@tools:sample/cities"
+        android:textColor="@color/tools_text_color_primary"
+        />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 26 - 0
compdfkit-tools/src/main/res/layout/tools_properties_form_option_select_fragment.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:background="@drawable/tools_annot_style_dialog_window_bg">
+
+    <include
+        android:id="@+id/cl_tool_bar"
+        layout="@layout/tools_dialog_tool_bar"/>
+
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_options"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginTop="44dp"
+        android:background="@color/tools_style_content_bg"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:paddingBottom="16dp"
+        tools:listitem="@layout/tools_properties_form_option_list_item"
+        />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 136 - 0
compdfkit-tools/src/main/res/layout/tools_properties_list_box_style_fragment.xml

@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_rootView"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:animateLayoutChanges="true">
+
+        <com.compdfkit.tools.common.views.pdfproperties.textfields.CTextFieldsView
+            android:id="@+id/text_field_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <com.compdfkit.tools.common.views.pdfproperties.colorlist.CColorListView
+            android:id="@+id/border_color_list_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/text_field_view"
+            app:tools_title="@string/tools_border_color" />
+
+
+        <com.compdfkit.tools.common.views.pdfproperties.colorlist.CColorListView
+            android:id="@+id/background_color_list_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/border_color_list_view"
+            app:tools_title="@string/tools_background_color" />
+
+        <com.compdfkit.tools.common.views.pdfproperties.colorlist.CColorListView
+            android:id="@+id/text_color_list_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/background_color_list_view"
+            app:tools_title="@string/tools_text_color" />
+
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_font_type"
+            style="@style/tools_style_fragment_sub_title_style"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="24dp"
+            android:text="@string/tools_annot_font_type"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/text_color_list_view" />
+
+        <androidx.appcompat.widget.AppCompatSpinner
+            android:id="@+id/spinner_font"
+            android:layout_width="0dp"
+            android:layout_height="35dp"
+            android:layout_marginStart="20dp"
+            android:layout_marginEnd="16dp"
+            android:dropDownSelector="@color/tools_color_primary"
+            android:popupBackground="@drawable/tools_common_window_bg"
+            app:layout_constraintBottom_toBottomOf="@id/tv_font_type"
+            app:layout_constraintEnd_toStartOf="@id/iv_font_bold"
+            app:layout_constraintStart_toEndOf="@id/tv_font_type"
+            app:layout_constraintTop_toTopOf="@id/tv_font_type" />
+
+        <View
+            android:id="@+id/font_line"
+            style="@style/tools_style_fragment_line"
+            android:layout_width="0dp"
+            android:layout_marginHorizontal="12dp"
+            app:layout_constraintEnd_toEndOf="@id/spinner_font"
+            app:layout_constraintStart_toStartOf="@id/spinner_font"
+            app:layout_constraintTop_toBottomOf="@id/spinner_font" />
+
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_font_italic"
+            android:layout_width="40dp"
+            android:layout_height="32dp"
+            android:layout_marginEnd="16dp"
+            android:background="@drawable/tools_annotation_font_italic_bg"
+            android:gravity="center"
+            android:padding="5dp"
+            app:layout_constraintBottom_toBottomOf="@id/tv_font_type"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="@id/tv_font_type"
+            app:srcCompat="@drawable/tools_ic_font_italic"
+            app:tint="@color/tools_font_style_iv_color" />
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_font_bold"
+            android:layout_width="40dp"
+            android:layout_height="32dp"
+            android:background="@drawable/tools_annotation_font_bold_bg"
+            android:gravity="center"
+            android:padding="5dp"
+            app:layout_constraintBottom_toBottomOf="@id/tv_font_type"
+            app:layout_constraintEnd_toStartOf="@id/iv_font_italic"
+            app:layout_constraintTop_toTopOf="@id/tv_font_type"
+            app:srcCompat="@drawable/tools_ic_font_bold"
+            app:tint="@color/tools_font_style_iv_color" />
+
+        <com.compdfkit.tools.common.utils.view.sliderbar.CSliderBar
+            android:id="@+id/font_size_slider_bar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:max="100"
+            android:progress="1"
+            app:layout_constraintTop_toBottomOf="@id/iv_font_bold"
+            app:tools_slider_bar_value_show_type="source"
+            app:tools_title="@string/tools_annot_font_size" />
+
+
+        <com.compdfkit.tools.common.views.pdfproperties.CPropertiesSwitchView
+            android:id="@+id/switch_hide_form"
+            android:layout_width="match_parent"
+            android:layout_height="48dp"
+            android:layout_marginTop="8dp"
+            android:title="@string/tools_hide_form"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/font_size_slider_bar" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.core.widget.NestedScrollView>
+

+ 6 - 1
compdfkit-tools/src/main/res/values/tools_strings.xml

@@ -72,7 +72,8 @@
     <string name="tools_edit">Edit</string>
     <string name="tools_delete">Delete</string>
     <string name="tools_bookmark_et_hint">Bookmark Title</string>
-    <string name="tools_bookmark_title">Add Bookmark</string>
+    <string name="tools_add_bookmark_title">Add Bookmark</string>
+    <string name="tools_edit_bookmark_title">Edit Bookmark</string>
     <string name="tools_no_bookmark">No Bookmark</string>
     <string name="tools_no_outline">No Outline</string>
     <string name="tools_no_annotation">No Annotation</string>
@@ -269,6 +270,10 @@
     <string name="tools_check_radio_button">Radio Button</string>
     <string name="tools_check_list_box">List Box</string>
     <string name="tools_add_list_box">Add List Box</string>
+    <string name="tools_combo_box">Combo Box</string>
+    <string name="tools_add_combo_box">Add Combo Box</string>
+    <string name="tools_option_list">Option List</string>
+    <string name="tools_please_select_option">Please select your option</string>
     <!-- Form End!!!-->
 
     <string name="tools_page_edit_toolbar_title">Page Edit</string>

+ 15 - 3
form-ctrl-demo/src/main/java/com/compdfkit/demo/form/PDFFormSampleActivity.java

@@ -14,6 +14,9 @@ import androidx.annotation.NonNull;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.content.ContextCompat;
 
+import com.compdfkit.core.annotation.form.CPDFComboboxWidget;
+import com.compdfkit.core.annotation.form.CPDFListboxWidget;
+import com.compdfkit.core.annotation.form.CPDFSignatureWidget;
 import com.compdfkit.core.annotation.form.CPDFWidget;
 import com.compdfkit.demo.form.databinding.FormPdfSampleActivityBinding;
 import com.compdfkit.tools.common.contextmenu.CPDFContextMenuHelper;
@@ -25,6 +28,9 @@ import com.compdfkit.tools.common.views.pdfbota.CPDFBotaDialogFragment;
 import com.compdfkit.tools.common.views.pdfbota.CPDFBotaFragmentTabs;
 import com.compdfkit.tools.common.views.pdfstyle.manager.CStyleManager;
 import com.compdfkit.tools.common.views.pdfview.CPreviewMode;
+import com.compdfkit.tools.form.pdfproperties.pdfcombobox.CustomComboBoxWidgetImpl;
+import com.compdfkit.tools.form.pdfproperties.pdflistbox.CustomListBoxWidgetImpl;
+import com.compdfkit.tools.form.pdfproperties.pdfsign.CustomSignatureWidgetImpl;
 import com.compdfkit.tools.viewer.pdfdisplaysettings.CPDFDisplaySettingDialogFragment;
 import com.compdfkit.tools.viewer.pdfinfo.CPDFDocumentInfoDialogFragment;
 import com.compdfkit.tools.viewer.pdfsearch.CSearchResultDialogFragment;
@@ -84,14 +90,20 @@ public class PDFFormSampleActivity extends AppCompatActivity {
             //Use the CFillScreenManager.class to manage fullscreen switching.
             screenManager.fillScreenChange();
         });
+        binding.pdfView.getCPdfReaderView().getAnnotImplRegistry()
+                .registImpl(CPDFComboboxWidget.class, CustomComboBoxWidgetImpl.class)
+                .registImpl(CPDFListboxWidget.class, CustomListBoxWidgetImpl.class)
+                .registImpl(CPDFSignatureWidget.class, CustomSignatureWidgetImpl.class);
     }
 
     private void initFormAttribute(){
         int bgColor = ContextCompat.getColor(this, R.color.tools_edit_text_bg_select);
        new CStyleManager.Builder()
-               .setTextField(Color.BLACK, Color.TRANSPARENT, Color.BLACK, 25, 1, false)
-               .setCheckBox(Color.BLACK, bgColor, Color.BLACK, 2, CPDFWidget.CheckStyle.CK_Check)
-               .setRadioButton(Color.BLACK, bgColor, Color.BLACK, 2, CPDFWidget.CheckStyle.CK_Circle)
+               .setTextField(Color.TRANSPARENT, Color.RED, Color.BLACK, 25, 2, false)
+               .setCheckBox(Color.BLACK, Color.RED, Color.BLACK, 2, CPDFWidget.CheckStyle.CK_Check)
+               .setRadioButton(Color.BLACK, Color.RED, Color.BLACK, 2, CPDFWidget.CheckStyle.CK_Circle)
+               .setListBox(Color.BLACK, bgColor,  Color.WHITE, 20)
+               .setComboBox(Color.BLACK, bgColor,  Color.BLACK, 20)
                .init(binding.pdfView);
     }