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

PDFTool(Android) - 1.内容编辑替换功能UI优化

liuxiaolong 1 рік тому
батько
коміт
9a5613c0fe

+ 61 - 0
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/utils/dialog/CLoadingDialog.java

@@ -0,0 +1,61 @@
+package com.compdfkit.tools.common.utils.dialog;
+
+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.annotation.StringRes;
+import androidx.appcompat.widget.AppCompatTextView;
+import androidx.fragment.app.DialogFragment;
+
+import com.compdfkit.tools.R;
+
+
+public class CLoadingDialog  extends DialogFragment {
+
+    private AppCompatTextView tvTitle;
+
+    public static CLoadingDialog newInstance(@StringRes int titleResId) {
+        Bundle args = new Bundle();
+        args.putInt("extra_title", titleResId);
+        CLoadingDialog fragment = new CLoadingDialog();
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setStyle(STYLE_NO_TITLE, R.style.tools_dialog_theme);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        getDialog().setCancelable(false);
+        getDialog().setCanceledOnTouchOutside(false);
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        View rootView = inflater.inflate(R.layout.tools_layout_loading_dialog, container, false);
+        tvTitle = rootView.findViewById(R.id.tv_title);
+        return rootView;
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        if (getArguments() != null) {
+            int titleResId = getArguments().getInt("extra_title", -1);
+            if (titleResId != -1) {
+                tvTitle.setText(titleResId);
+            }
+        }
+    }
+
+}

+ 0 - 14
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/common/views/CToolBar.java

@@ -60,11 +60,9 @@ import com.compdfkit.ui.reader.CPDFReaderView;
  * @see CToolBar#setBackBtnClickListener(OnClickListener)
  */
 public class CToolBar extends FrameLayout {
-    private AppCompatTextView tvToolBarReplace;
     private AppCompatTextView tvToolBarTitle;
 
     private AppCompatImageView ivToolBarBackBtn;
-    CPDFViewCtrl pdfView;
 
     public CToolBar(@NonNull Context context) {
         this(context, null);
@@ -81,7 +79,6 @@ public class CToolBar extends FrameLayout {
 
     private void initToolBar(Context context, @Nullable AttributeSet attrs) {
         LayoutInflater.from(getContext()).inflate(R.layout.tools_ctool_bar, this);
-        tvToolBarReplace = findViewById(R.id.tv_tool_bar_replace);
         tvToolBarTitle = findViewById(R.id.tv_tool_bar_title);
         ivToolBarBackBtn = findViewById(R.id.iv_tool_bar_back);
         initAttributes(context, attrs);
@@ -109,17 +106,6 @@ public class CToolBar extends FrameLayout {
         ivToolBarBackBtn.setOnClickListener(clickListener);
     }
 
-    public void initWithPDFView(CPDFViewCtrl pdfView) {
-        this.pdfView = pdfView;
-        if (this.pdfView.getCPdfReaderView().getViewMode() == CPDFReaderView.ViewMode.PDFEDIT) {
-            tvToolBarReplace.setVisibility(View.VISIBLE);
-        }
-    }
-
-    public void setReplaceClickListener(OnClickListener clickListener) {
-        tvToolBarReplace.setOnClickListener(clickListener);
-    }
-
     public void setTitle(@StringRes int titleResId) {
         tvToolBarTitle.setText(titleResId);
     }

+ 44 - 59
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/viewer/pdfsearch/CSearchResultDialogFragment.java

@@ -17,6 +17,10 @@ import com.compdfkit.core.edit.CPDFEditFindSelection;
 import com.compdfkit.core.edit.CPDFEditManager;
 import com.compdfkit.tools.R;
 import com.compdfkit.tools.common.basic.fragment.CBasicBottomSheetDialogFragment;
+import com.compdfkit.tools.common.utils.dialog.CCommonInputDialog;
+import com.compdfkit.tools.common.utils.dialog.CEditDialog;
+import com.compdfkit.tools.common.utils.dialog.CLoadingDialog;
+import com.compdfkit.tools.common.utils.threadpools.CThreadPoolUtils;
 import com.compdfkit.tools.common.utils.viewutils.CViewUtils;
 import com.compdfkit.tools.common.views.CToolBar;
 import com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl;
@@ -37,6 +41,8 @@ public class CSearchResultDialogFragment extends CBasicBottomSheetDialogFragment
 
     private ConstraintLayout clSearchResultEmpty;
 
+    private AppCompatTextView tvReplaceAll;
+
     private List<CSearchTextInfo> searchTextInfos = null;
 
     private CSearchPDFTextRecyclerviewAdapter searchTextAdapter;
@@ -46,9 +52,11 @@ public class CSearchResultDialogFragment extends CBasicBottomSheetDialogFragment
     Context context;
 
     ReplaceListener replaceListener = null;
-    public  void setReplaceListener(ReplaceListener listener) {
+
+    public void setReplaceListener(ReplaceListener listener) {
         replaceListener = listener;
     }
+
     @Override
     protected float dimAmount() {
         return CViewUtils.isLandScape(getContext()) ? 0.2F : 0F;
@@ -84,53 +92,44 @@ public class CSearchResultDialogFragment extends CBasicBottomSheetDialogFragment
     }
 
     void createDialog() {
-        AlertDialog.Builder builder = new AlertDialog.Builder(pdfView.getContext());
-        EditText editText = new EditText(pdfView.getContext());
-        builder.setMessage("全部替换为");
-        editText.setHint("pdf");
-        builder.setView(editText);
-
-        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialogInterface, int i) {
+        CEditDialog editDialog = CEditDialog.newInstance(getString(R.string.tools_replace_all_with), "");
+        editDialog.setHint(R.string.tools_replace_hint);
+        editDialog.setEditListener(content -> {
+            editDialog.dismiss();
+            CLoadingDialog loadingDialog = CLoadingDialog.newInstance(R.string.tools_progressing);
+            loadingDialog.show(getChildFragmentManager(), "loading");
+            CThreadPoolUtils.getInstance().executeIO(() -> {
                 if (searchTextInfos != null && searchTextInfos.size() > 1) {
                     CSearchTextInfo info = searchTextInfos.get(1);
-                    if (info == null) return;
+                    if (info == null) {
+                        return;
+                    }
                     CPDFReaderView readerView = pdfView.getCPdfReaderView();
-                    if (readerView == null) return;
+                    if (readerView == null) {
+                        return;
+                    }
                     CPDFEditTextSearchReplace searchReplace = readerView.getEditTextSearchReplace();
-                    if (searchReplace == null) return;
+                    if (searchReplace == null) {
+                        return;
+                    }
                     searchReplace.setSearchConfig(info.keyword, 0);
                     CPDFEditManager editManager = readerView.getEditManager();
-                    if (editManager == null) return;
- //                   editManager.beginEdit(3);
-                    searchReplace.findSelections();
-                    searchReplace.replaceAll(editText.getText().toString());
-
-//                for (int i = 0; i < searchTextInfos.size(); i++) {
-//                    CSearchTextInfo info = searchTextInfos.get(i);
-//                    if (info == null) continue;
-//                    if (info.isHeader) {
-//                        searchReplace.findEditString(i);
-//                        searchReplace.replaceAll("ABCD");
-//                    }
-//                }
- //                   editManager.endEdit();
-                    dismiss();
-                    if (replaceListener != null) {
-                        replaceListener.onReplaceEnd();
+                    if (editManager == null) {
+                        return;
                     }
+                    searchReplace.findSelections();
+                    searchReplace.replaceAll(content);
+                    CThreadPoolUtils.getInstance().executeMain(() -> {
+                        loadingDialog.dismiss();
+                        dismiss();
+                        if (replaceListener != null) {
+                            replaceListener.onReplaceEnd();
+                        }
+                    });
                 }
-            }
-        });
-        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialogInterface, int i) {
-                dismiss();
-            }
+            });
         });
-        AlertDialog dialog = builder.create();
-        dialog.show();
+        editDialog.show(getChildFragmentManager(), "inputDialog");
     }
 
 
@@ -139,7 +138,10 @@ public class CSearchResultDialogFragment extends CBasicBottomSheetDialogFragment
         recyclerView = mContentView.findViewById(R.id.id_reader_search_recyclerView);
         clSearchResultEmpty = mContentView.findViewById(R.id.cl_search_result_empty_view);
         AppCompatTextView tvResultInfo = mContentView.findViewById(R.id.tv_search_result);
-        toolBar.initWithPDFView(pdfView);
+        tvReplaceAll = mContentView.findViewById(R.id.tv_tool_bar_replace);
+        if (pdfView != null && pdfView.getCPdfReaderView().getViewMode() == CPDFReaderView.ViewMode.PDFEDIT) {
+            tvReplaceAll.setVisibility(View.VISIBLE);
+        }
         if (searchTextInfos != null) {
             tvResultInfo.setText(getContext().getString(R.string.tools_search_result_found, searchTextInfos.size()));
         }
@@ -151,33 +153,16 @@ public class CSearchResultDialogFragment extends CBasicBottomSheetDialogFragment
             searchTextAdapter.clearList();
             searchTextAdapter.addList(searchTextInfos);
             searchTextAdapter.notifyDataSetChanged();
-        }else {
+        } else {
             clSearchResultEmpty.setVisibility(View.VISIBLE);
         }
         toolBar.setBackBtnClickListener(view -> {
             dismiss();
         });
-        toolBar.setReplaceClickListener(view -> {
+        tvReplaceAll.setOnClickListener(v -> {
             if (searchTextInfos != null) {
-//                Log.e("ss","ttttttt1");
-//                CPDFReaderView readerView = pdfView.getCPdfReaderView();
-//                if (readerView == null) return;
-//                CPDFEditTextSearchReplace searchReplace = readerView.getEditTextSearchReplace();
-//                searchReplace.setSearchConfig("pdf", 0);
-//                if (searchReplace == null) return;
-//                CPDFEditManager editManager = readerView.getEditManager();
-//                if (editManager == null) return;
-// //               editManager.beginEdit(3);
-//                Log.e("ss","ttttttt2");
-//                SparseArray<ArrayList<CPDFEditFindSelection>> ss = searchReplace.findSelections();
-//                Log.e("ss","ttttttt3");
-//                Log.e("ssss","bbbbbb find:ss="+(ss==null?"null":"not null"));
-//                Log.e("ss","bbbbb:n="+ss.size());
-//                searchReplace.replaceAll("ABCD");
-  //              editManager.endEdit();
                 createDialog();
             }
-
         });
         searchTextAdapter.setOnClickSearchItemListener(onClickSearchItemListener);
     }

+ 5 - 5
ComPDFKit_Tools/src/main/java/com/compdfkit/tools/viewer/pdfsearch/CSearchToolbar.java

@@ -78,7 +78,7 @@ public class CSearchToolbar extends RelativeLayout implements View.OnClickListen
 
         etSearchKeywords.setOnEditorActionListener((v, actionId, event) -> {
             if (actionId == EditorInfo.IME_ACTION_SEARCH){
-                startSearch(etSearchKeywords.getText().toString(), 1, list -> {
+                startSearch(etSearchKeywords.getText().toString(), 1,false, list -> {
                     searchTextInfos = list;
                     boolean hasResult = list.size() > 0;
                     ivPrevious.setVisibility(hasResult ? VISIBLE : INVISIBLE);
@@ -116,7 +116,7 @@ public class CSearchToolbar extends RelativeLayout implements View.OnClickListen
         }
     }
 
-    private void startSearch(String keywords, int searchCount, OnSearchResultListener searchResultListener) {
+    private void startSearch(String keywords, int searchCount,boolean showLoading, OnSearchResultListener searchResultListener) {
         if (TextUtils.isEmpty(keywords)) {
             resetSearch();
             cancelTask();
@@ -128,7 +128,7 @@ public class CSearchToolbar extends RelativeLayout implements View.OnClickListen
             protected void onPreExecute() {
                 super.onPreExecute();
                 if (onSearchListener != null) {
-                    onSearchListener.onStartSearch();
+                    onSearchListener.onStartSearch(showLoading);
                 }
             }
 
@@ -196,7 +196,7 @@ public class CSearchToolbar extends RelativeLayout implements View.OnClickListen
             previous();
         } else if (id == R.id.iv_search_list) {
             hideKeyboard();
-            startSearch(etSearchKeywords.getText().toString(), Integer.MAX_VALUE, list -> {
+            startSearch(etSearchKeywords.getText().toString(), Integer.MAX_VALUE,true, list -> {
                 if (null == list || list.size() <= 0) {
                     Toast.makeText(getContext(), getContext().getString(R.string.tools_sorry_no_contents), Toast.LENGTH_SHORT).show();
                     return;
@@ -251,7 +251,7 @@ public class CSearchToolbar extends RelativeLayout implements View.OnClickListen
     }
 
     public interface OnSearchListener {
-        void onStartSearch();
+        void onStartSearch(boolean showLoading);
         void onEndSearch();
     }
 }

+ 3 - 19
ComPDFKit_Tools/src/main/res/layout/tools_ctool_bar.xml

@@ -6,24 +6,7 @@
     android:layout_height="match_parent"
     tools:layout_height="?android:attr/actionBarSize">
 
-    <androidx.appcompat.widget.AppCompatTextView
-        android:id="@+id/tv_tool_bar_replace"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="10dp"
-        android:layout_marginEnd="24dp"
-        android:fontFamily="sans-serif-medium"
-        android:textColor="@color/tools_error"
-        android:textSize="22sp"
-        android:visibility="gone"
-        android:text="全部替换"
-        app:layout_constrainedWidth="true"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toStartOf="@id/tv_tool_bar_title"
-        app:layout_constraintHorizontal_bias="0"
-        app:layout_constraintStart_toEndOf="@id/iv_tool_bar_back"
-        app:layout_constraintTop_toTopOf="parent"
-        />
+
 
     <androidx.appcompat.widget.AppCompatTextView
         android:id="@+id/tv_tool_bar_title"
@@ -34,11 +17,12 @@
         android:fontFamily="sans-serif-medium"
         android:textColor="@color/tools_text_color_primary"
         android:textSize="22sp"
+        tools:text="@string/tools_result"
         app:layout_constrainedWidth="true"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintHorizontal_bias="0"
-        app:layout_constraintStart_toEndOf="@id/tv_tool_bar_replace"
+        app:layout_constraintStart_toEndOf="@id/iv_tool_bar_back"
         app:layout_constraintTop_toTopOf="parent"
         />
 

+ 30 - 0
ComPDFKit_Tools/src/main/res/layout/tools_layout_loading_dialog.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:paddingVertical="12dp"
+    android:paddingHorizontal="16dp"
+    android:orientation="horizontal"
+    android:gravity="center"
+    android:layout_gravity="center"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <ProgressBar
+        android:layout_width="35dp"
+        android:layout_height="35dp"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        tools:text="loading..."
+        android:textColor="@color/tools_text_color_primary"
+        android:layout_marginStart="8dp"
+        />
+
+</LinearLayout>

+ 24 - 1
ComPDFKit_Tools/src/main/res/layout/tools_search_keywords_list_dialog_fragment.xml

@@ -12,7 +12,30 @@
         android:elevation="4dp"
         app:tools_toolbar_back_icon="@drawable/tools_ic_back"
         android:title="@string/tools_result"
-        />
+        >
+
+        <androidx.appcompat.widget.AppCompatTextView
+            android:id="@+id/tv_tool_bar_replace"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="10dp"
+            android:layout_marginEnd="16dp"
+            android:fontFamily="sans-serif-medium"
+            android:textSize="14sp"
+            android:visibility="gone"
+            android:text="@string/tools_replace_all"
+            android:padding="4dp"
+            tools:visibility="visible"
+            android:textColor="@color/tools_color_accent"
+            app:layout_constrainedWidth="true"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintHorizontal_bias="0"
+            app:layout_constraintTop_toTopOf="parent"
+            android:layout_gravity="end|center_vertical"
+
+            />
+
+    </com.compdfkit.tools.common.views.CToolBar>
     
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/cl_head"

+ 4 - 0
ComPDFKit_Tools/src/main/res/values-zh-rCN/tools_strings.xml

@@ -450,6 +450,10 @@
     <string name="tools_enter_owner_pwd_title">输入权限密码进行安全设置</string>
     <string name="tools_password_error">密码错误,请重试</string>
     <string name="tools_text_watermark">文字水印</string>
+    <string name="tools_replace_all_with">全部替换为</string>
+    <string name="tools_replace_all">全部替换</string>
+    <string name="tools_progressing">处理中…</string>
+
 
 
 </resources>

+ 4 - 1
ComPDFKit_Tools/src/main/res/values/tools_strings.xml

@@ -458,5 +458,8 @@
 
     <!--    Security Mode End-->
     <string name="tools_also_entrypts_the_followint_fuctions">Also Encrypts the following functions</string>
-
+    <string name="tools_replace_all_with">Replace all with</string>
+    <string name="tools_replace_all">Replace all</string>
+    <string name="tools_replace_hint">pdf</string>
+    <string name="tools_progressing">Processing…</string>
 </resources>

+ 19 - 10
ContentEditor/src/main/java/com/compdfkit/contenteditor/PDFEditSampleActivity.java

@@ -22,6 +22,7 @@ import android.widget.Toast;
 
 import androidx.activity.result.ActivityResultLauncher;
 import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
 
 import com.compdfkit.contenteditor.databinding.EditPdfSampleActivityBinding;
 import com.compdfkit.core.edit.CPDFEditManager;
@@ -32,6 +33,7 @@ import com.compdfkit.tools.common.utils.CPermissionUtil;
 import com.compdfkit.tools.common.utils.CToastUtil;
 import com.compdfkit.tools.common.utils.activitycontracts.CSelectPDFDocumentResultContract;
 import com.compdfkit.tools.common.utils.dialog.CAlertDialog;
+import com.compdfkit.tools.common.utils.dialog.CLoadingDialog;
 import com.compdfkit.tools.common.utils.task.CExtractAssetFileTask;
 import com.compdfkit.tools.common.utils.window.CPopupMenuWindow;
 import com.compdfkit.tools.common.views.pdfbota.CPDFBOTA;
@@ -217,13 +219,10 @@ public class PDFEditSampleActivity extends CBasicPDFActivity {
                 searchResultDialog.dismiss();
             });
             
-            searchResultDialog.setReplaceListener(new CSearchResultDialogFragment.ReplaceListener() {
-                @Override
-                public void onReplaceEnd() {
-                    binding.pdfSearchToolBar.exitSearch();
-                    setPreviewMode(CPreviewMode.Viewer);
-                    //setPreviewMode(CPreviewMode.Edit);
-                }
+            searchResultDialog.setReplaceListener(() -> {
+                binding.pdfSearchToolBar.exitSearch();
+                setPreviewMode(CPreviewMode.Viewer);
+                //setPreviewMode(CPreviewMode.Edit);
             });
 
         });
@@ -239,17 +238,27 @@ public class PDFEditSampleActivity extends CBasicPDFActivity {
         });
         binding.pdfSearchToolBar.setOnExitSearchListener(new CSearchToolbar.OnSearchListener() {
             @Override
-            public void onStartSearch() {
-                binding.pdfEditProgressbar.setVisibility(View.VISIBLE);
+            public void onStartSearch(boolean showLoading) {
+                if (showLoading){
+                    showLoadingDialog();
+                }
             }
 
             @Override
             public void onEndSearch() {
-                binding.pdfEditProgressbar.setVisibility(View.GONE);
+                Fragment fragment = getSupportFragmentManager().findFragmentByTag("searchLoadingDialog");
+                if (fragment != null && fragment instanceof CLoadingDialog){
+                    ((CLoadingDialog) fragment).dismiss();
+                }
             }
         });
     }
 
+    private void showLoadingDialog(){
+        CLoadingDialog loadingDialog = CLoadingDialog.newInstance(R.string.tools_progressing);
+        loadingDialog.show(getSupportFragmentManager(), "searchLoadingDialog");
+    }
+
     private void initEditBar() {
         if (binding.pdfView == null || binding.pdfView.getCPdfReaderView() == null) {
             return;

+ 0 - 10
ContentEditor/src/main/res/layout/edit_pdf_sample_activity.xml

@@ -71,15 +71,5 @@
             app:layout_constraintStart_toStartOf="parent" />
     </FrameLayout>
 
-    <ProgressBar
-        android:id="@+id/pdf_edit_progressbar"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:indeterminate="true"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        android:visibility="gone" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 35 - 0
PDFViewer/src/main/java/com/compdfkit/pdfviewer/MainActivity.java

@@ -25,6 +25,7 @@ import android.widget.Toast;
 
 import androidx.activity.result.ActivityResultLauncher;
 import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
 
 import com.compdfkit.core.annotation.CPDFAnnotation;
@@ -43,6 +44,7 @@ import com.compdfkit.tools.common.utils.activitycontracts.CSelectPDFDocumentResu
 import com.compdfkit.tools.common.utils.annotation.CPDFAnnotationManager;
 import com.compdfkit.tools.common.utils.dialog.CAlertDialog;
 import com.compdfkit.tools.common.utils.dialog.CEditDialog;
+import com.compdfkit.tools.common.utils.dialog.CLoadingDialog;
 import com.compdfkit.tools.common.utils.task.CExtractAssetFileTask;
 import com.compdfkit.tools.common.utils.threadpools.CThreadPoolUtils;
 import com.compdfkit.tools.common.utils.window.CPopupMenuWindow;
@@ -65,6 +67,7 @@ import com.compdfkit.tools.signature.CertificateDigitalDatas;
 import com.compdfkit.tools.signature.bean.CPDFDocumentSignInfo;
 import com.compdfkit.tools.signature.info.signlist.CPDFCertDigitalSignListDialog;
 import com.compdfkit.tools.viewer.pdfsearch.CSearchResultDialogFragment;
+import com.compdfkit.tools.viewer.pdfsearch.CSearchToolbar;
 import com.compdfkit.ui.contextmenu.IContextMenuShowListener;
 import com.compdfkit.ui.proxy.form.CPDFComboboxWidgetImpl;
 import com.compdfkit.ui.proxy.form.CPDFListboxWidgetImpl;
@@ -398,6 +401,7 @@ public class MainActivity extends CBasicPDFActivity {
         binding.pdfSearchToolBar.initWithPDFView(binding.pdfView);
         binding.pdfSearchToolBar.onSearchQueryResults(list -> {
             CSearchResultDialogFragment searchResultDialog = new CSearchResultDialogFragment();
+            searchResultDialog.initWithPDFView(binding.pdfView);
             searchResultDialog.show(getSupportFragmentManager(), "searchResultDialogFragment");
             searchResultDialog.setSearchTextInfos(list);
             searchResultDialog.setOnClickSearchItemListener(clickItem -> {
@@ -405,6 +409,26 @@ public class MainActivity extends CBasicPDFActivity {
                 binding.pdfView.getCPdfReaderView().getTextSearcher().searchBegin(clickItem.page, clickItem.textRangeIndex);
                 searchResultDialog.dismiss();
             });
+            searchResultDialog.setReplaceListener(()->{
+                binding.pdfSearchToolBar.exitSearch();
+                setPreviewMode(CPreviewMode.Viewer);
+            });
+        });
+        binding.pdfSearchToolBar.setOnExitSearchListener(new CSearchToolbar.OnSearchListener() {
+            @Override
+            public void onStartSearch(boolean showLoading) {
+                if (showLoading) {
+                    showLoadingDialog();
+                }
+            }
+
+            @Override
+            public void onEndSearch() {
+                Fragment fragment = getSupportFragmentManager().findFragmentByTag("searchLoadingDialog");
+                if (fragment != null && fragment instanceof CLoadingDialog){
+                    ((CLoadingDialog) fragment).dismiss();
+                }
+            }
         });
         binding.pdfSearchToolBar.setExitSearchListener(() -> {
             if (curEditMode > 0) {
@@ -418,6 +442,17 @@ public class MainActivity extends CBasicPDFActivity {
         });
     }
 
+
+    private void showLoadingDialog(){
+        Fragment fragment = getSupportFragmentManager().findFragmentByTag("searchLoadingDialog");
+        if (fragment != null && fragment.isVisible()){
+            return;
+        }
+        CLoadingDialog loadingDialog = CLoadingDialog.newInstance(R.string.tools_progressing);
+        loadingDialog.show(getSupportFragmentManager(), "searchLoadingDialog");
+    }
+
+
     private void initEditBar() {
         if (binding.pdfView == null || binding.pdfView.getCPdfReaderView() == null) {
             return;