@@ -133,6 +133,10 @@ class PDFThumbnailViewer {
133133
134134 #scrollableContainerHeight = 0 ;
135135
136+ #previousStates = {
137+ hasSelectedPages : false ,
138+ } ;
139+
136140 /**
137141 * @param {PDFThumbnailViewerOptions } options
138142 */
@@ -185,6 +189,23 @@ class PDFThumbnailViewer {
185189
186190 this . #toggleMenuEntries( false ) ;
187191 button . disabled = true ;
192+
193+ this . eventBus . on ( "editingaction" , ( { name } ) => {
194+ switch ( name ) {
195+ case "copyPage" :
196+ this . #copyPages( ) ;
197+ break ;
198+ case "cutPage" :
199+ this . #cutPages( ) ;
200+ break ;
201+ case "deletePage" :
202+ this . #deletePages( ) ;
203+ break ;
204+ case "savePage" :
205+ this . #saveExtractedPages( ) ;
206+ break ;
207+ }
208+ } ) ;
188209 } else {
189210 manageMenu . button . hidden = true ;
190211 }
@@ -198,6 +219,24 @@ class PDFThumbnailViewer {
198219 this . #addEventListeners( ) ;
199220 }
200221
222+ /**
223+ * Update the different possible states of this manager, e.g. is there
224+ * something to copy, paste, ...
225+ * @param {Object } details
226+ */
227+ #dispatchUpdateStates( details ) {
228+ const hasChanged = Object . entries ( details ) . some (
229+ ( [ key , value ] ) => this . #previousStates[ key ] !== value
230+ ) ;
231+
232+ if ( hasChanged ) {
233+ this . eventBus . dispatch ( "editingstateschanged" , {
234+ source : this ,
235+ details : Object . assign ( this . #previousStates, details ) ,
236+ } ) ;
237+ }
238+ }
239+
201240 #scrollUpdated( ) {
202241 this . renderingQueue . renderHighestPriority ( ) ;
203242 }
@@ -730,6 +769,9 @@ class PDFThumbnailViewer {
730769 this . #manageCopyButton. disabled =
731770 this . #manageCutButton. disabled =
732771 ! this . #selectedPages?. size ;
772+ this . #dispatchUpdateStates( {
773+ hasSelectedPages : ! ! this . #selectedPages?. size ,
774+ } ) ;
733775 }
734776
735777 #toggleMenuEntries( enable ) {
@@ -895,6 +937,16 @@ class PDFThumbnailViewer {
895937 this . #computeThumbnailsPosition( ) ;
896938 }
897939 } ) ;
940+ this . container . addEventListener ( "focusout" , ( ) => {
941+ this . #dispatchUpdateStates( {
942+ hasSelectedPages : false ,
943+ } ) ;
944+ } ) ;
945+ this . container . addEventListener ( "focusin" , ( ) => {
946+ this . #dispatchUpdateStates( {
947+ hasSelectedPages : ! ! this . #selectedPages?. size ,
948+ } ) ;
949+ } ) ;
898950 this . container . addEventListener ( "keydown" , e => {
899951 const { target } = e ;
900952 const isCheckbox =
0 commit comments