@@ -48,31 +48,25 @@ This file is part of the iText (R) project.
4848import com .itextpdf .kernel .pdf .PdfObject ;
4949import com .itextpdf .kernel .pdf .PdfStream ;
5050import com .itextpdf .kernel .utils .CompareTool ;
51+ import com .itextpdf .kernel .utils .CompareTool .CompareResult ;
5152import com .itextpdf .kernel .utils .objectpathitems .ArrayPathItem ;
5253import com .itextpdf .kernel .utils .objectpathitems .DictPathItem ;
5354import com .itextpdf .kernel .utils .objectpathitems .IndirectPathItem ;
5455import com .itextpdf .kernel .utils .objectpathitems .LocalPathItem ;
5556import com .itextpdf .kernel .utils .objectpathitems .ObjectPath ;
56- import com .itextpdf .rups .event .NodeAddArrayChildEvent ;
57- import com .itextpdf .rups .event .NodeAddDictChildEvent ;
58- import com .itextpdf .rups .event .NodeDeleteArrayChildEvent ;
59- import com .itextpdf .rups .event .NodeDeleteDictChildEvent ;
60- import com .itextpdf .rups .event .OpenPlainTextEvent ;
61- import com .itextpdf .rups .event .OpenStructureEvent ;
62- import com .itextpdf .rups .event .RupsEvent ;
6357import com .itextpdf .rups .io .listeners .PdfTreeNavigationListener ;
64- import com .itextpdf .rups .model .IPdfFile ;
6558import com .itextpdf .rups .model .ObjectLoader ;
6659import com .itextpdf .rups .model .PdfSyntaxParser ;
6760import com .itextpdf .rups .model .TreeNodeFactory ;
6861import com .itextpdf .rups .view .DebugView ;
69- import com .itextpdf .rups .view . IRupsEventHandler ;
62+ import com .itextpdf .rups .model . IRupsEventListener ;
7063import com .itextpdf .rups .view .Language ;
7164import com .itextpdf .rups .view .PageSelectionListener ;
7265import com .itextpdf .rups .view .contextmenu .PdfTreeContextMenu ;
7366import com .itextpdf .rups .view .contextmenu .PdfTreeContextMenuMouseListener ;
7467import com .itextpdf .rups .view .icons .IconTreeNode ;
7568import com .itextpdf .rups .view .itext .FormTree ;
69+ import com .itextpdf .rups .view .itext .IPdfObjectPanelEventListener ;
7670import com .itextpdf .rups .view .itext .OutlineTree ;
7771import com .itextpdf .rups .view .itext .PagesTable ;
7872import com .itextpdf .rups .view .itext .PdfObjectPanel ;
@@ -82,27 +76,23 @@ This file is part of the iText (R) project.
8276import com .itextpdf .rups .view .itext .SyntaxHighlightedStreamPane ;
8377import com .itextpdf .rups .view .itext .XRefTable ;
8478import com .itextpdf .rups .view .itext .treenodes .PdfObjectTreeNode ;
85- import com .itextpdf .rups .view .itext .treenodes .PdfTrailerTreeNode ;
8679
8780import java .awt .Color ;
8881import java .awt .event .KeyListener ;
89- import java .util .Observable ;
90- import java .util .Observer ;
9182import java .util .Stack ;
9283import java .util .function .Consumer ;
9384import javax .swing .JPanel ;
9485import javax .swing .JScrollPane ;
9586import javax .swing .JTabbedPane ;
9687import javax .swing .event .ChangeEvent ;
97- import javax .swing .event .ChangeListener ;
9888import javax .swing .event .TreeSelectionListener ;
9989import javax .swing .tree .DefaultTreeModel ;
10090import javax .swing .tree .TreePath ;
10191
10292/**
10393 * Controls the components that get their content from iText's PdfReader.
10494 */
105- public class PdfReaderController extends Observable implements Observer {
95+ public class PdfReaderController implements IPdfObjectPanelEventListener , IRupsEventListener {
10696
10797 /**
10898 * Treeview of the PDF file.
@@ -155,9 +145,9 @@ public class PdfReaderController extends Observable implements Observer {
155145 */
156146 protected PlainText text ;
157147
158- private Stack <IconTreeNode > highlights = new Stack <>();
148+ private final Stack <IconTreeNode > highlights = new Stack <>();
159149
160- private PdfSyntaxParser parser = new PdfSyntaxParser ();
150+ private final PdfSyntaxParser parser = new PdfSyntaxParser ();
161151
162152 /**
163153 * Constructs the PdfReaderController.
@@ -175,20 +165,13 @@ public PdfReaderController(TreeSelectionListener treeSelectionListener,
175165 final PdfTreeContextMenu menu = new PdfTreeContextMenu (pdfTree );
176166 pdfTree .setComponentPopupMenu (menu );
177167 pdfTree .addMouseListener (new PdfTreeContextMenuMouseListener (menu , pdfTree ));
178- addObserver (pdfTree );
179168
180169 pages = new PagesTable (this , pageSelectionListener );
181- addObserver (pages );
182170 outlines = new OutlineTree (this );
183- addObserver (outlines );
184171 structure = new StructureTree (this );
185- addObserver (structure );
186172 form = new FormTree (this );
187- addObserver (form );
188173 xref = new XRefTable (this );
189- addObserver (xref );
190174 text = new PlainText ();
191- addObserver (text );
192175
193176 navigationTabs = new JTabbedPane ();
194177 final String pagesString = Language .PAGES .getString ();
@@ -205,27 +188,22 @@ public PdfReaderController(TreeSelectionListener treeSelectionListener,
205188 Language .XREF_DESCRIPTION .getString ());
206189 navigationTabs .addTab (Language .PLAINTEXT .getString (), null , new JScrollPane (text ),
207190 Language .PLAINTEXT_DESCRIPTION .getString ());
208- navigationTabs .addChangeListener (new ChangeListener () {
209- public void stateChanged (ChangeEvent e ) {
210- if (navigationTabs .getSelectedIndex () != -1 ) {
211- final String title = navigationTabs .getTitleAt (navigationTabs .getSelectedIndex ());
212-
213- if (Language .STRUCTURE .getString ().equals (title )) {
214- structure .update (PdfReaderController .this , new OpenStructureEvent ());
215- } else if (Language .PLAINTEXT .getString ().equals (title )) {
216- text .update (PdfReaderController .this , new OpenPlainTextEvent ());
217- } else {
218- // Intentionally empty
219- }
191+ navigationTabs .addChangeListener ((ChangeEvent e ) -> {
192+ if (navigationTabs .getSelectedIndex () != -1 ) {
193+ final String title = navigationTabs .getTitleAt (navigationTabs .getSelectedIndex ());
194+
195+ if (Language .STRUCTURE .getString ().equals (title )) {
196+ structure .openStructure ();
197+ } else if (Language .PLAINTEXT .getString ().equals (title )) {
198+ text .openPlainText ();
220199 }
200+ // No special handling for other tabs
221201 }
222202 });
223203
224204 objectPanel = new PdfObjectPanel ();
225- addObserver (objectPanel );
226- objectPanel .addObserver (this );
205+ objectPanel .addEventListener (this );
227206 streamPane = new SyntaxHighlightedStreamPane (this );
228- addObserver (streamPane );
229207 JScrollPane debug = new JScrollPane (DebugView .getInstance ().getTextArea ());
230208 editorTabs = new JTabbedPane ();
231209 editorTabs .addTab (Language .STREAM .getString (), null , streamPane , Language .STREAM .getString ());
@@ -289,79 +267,6 @@ public PdfSyntaxParser getParser() {
289267 return parser ;
290268 }
291269
292- /**
293- * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
294- */
295- public void update (Observable observable , Object obj ) {
296- if (observable != null && obj instanceof RupsEvent ) {
297- RupsEvent event = (RupsEvent ) obj ;
298- switch (event .getType ()) {
299- case RupsEvent .COMPARE_POST_EVENT :
300- highlightChanges ((CompareTool .CompareResult ) event .getContent ());
301- pdfTree .repaint ();
302- break ;
303- case RupsEvent .OPEN_DOCUMENT_POST_EVENT :
304- final ObjectLoader loader = (ObjectLoader ) event .getContent ();
305- final IPdfFile pdfFile = loader .getFile ();
306- nodes = loader .getNodes ();
307- final PdfTrailerTreeNode root = pdfTree .getRoot ();
308- root .setTrailer (pdfFile .getPdfDocument ().getTrailer ());
309- root .setUserObject (String .format (Language .PDF_OBJECT_TREE .getString (), loader .getLoaderName ()));
310- nodes .expandNode (root );
311- navigationTabs .setSelectedIndex (0 );
312- streamPane .setEditable (pdfFile .isOpenedAsOwner ());
313- objectPanel .setEditable (pdfFile .isOpenedAsOwner ());
314- setChanged ();
315- super .notifyObservers (event );
316- break ;
317- case RupsEvent .TREE_NODE_CLICKED_EVENT :
318- PdfObjectTreeNode node = (PdfObjectTreeNode ) event .getContent ();
319- nodes .expandNode (node );
320-
321- if (node .isRecursive ()) {
322- boolean keyboardNav = false ;
323-
324- KeyListener [] listeners = pdfTree .getKeyListeners ();
325-
326- for (KeyListener listener : listeners ) {
327- if (listener instanceof PdfTreeNavigationListener ) {
328- keyboardNav = ((PdfTreeNavigationListener ) listener ).isLastActionKeyboardNavigation ();
329- }
330- }
331-
332- if (!keyboardNav ) {
333- pdfTree .selectNode (node .getAncestor ());
334- return ;
335- }
336- }
337- render (node );
338- break ;
339- case RupsEvent .NODE_DELETE_DICT_CHILD_EVENT :
340- deleteTreeNodeDictChild (((NodeDeleteDictChildEvent .Content ) event .getContent ()).parent ,
341- ((NodeDeleteDictChildEvent .Content ) event .getContent ()).key );
342- break ;
343- case RupsEvent .NODE_ADD_DICT_CHILD_EVENT :
344- addTreeNodeDictChild (((NodeAddDictChildEvent .Content ) event .getContent ()).parent ,
345- ((NodeAddDictChildEvent .Content ) event .getContent ()).key ,
346- ((NodeAddDictChildEvent .Content ) event .getContent ()).index );
347- break ;
348- case RupsEvent .NODE_ADD_ARRAY_CHILD_EVENT :
349- addTreeNodeArrayChild (((NodeAddArrayChildEvent .Content ) event .getContent ()).parent ,
350- ((NodeAddArrayChildEvent .Content ) event .getContent ()).index );
351- break ;
352- case RupsEvent .NODE_DELETE_ARRAY_CHILD_EVENT :
353- deleteTreeChild (((NodeDeleteArrayChildEvent .Content ) event .getContent ()).parent ,
354- ((NodeDeleteArrayChildEvent .Content ) event .getContent ()).index );
355- break ;
356- case RupsEvent .POST_NEW_INDIRECT_OBJECT_EVENT :
357- nodes .addNewIndirectObject ((PdfObject ) event .getContent ());
358- setChanged ();
359- notifyObservers (event );
360- break ;
361- }
362- }
363- }
364-
365270 /**
366271 * Selects a node in the PdfTree.
367272 *
@@ -491,13 +396,75 @@ public int addTreeNodeChild(PdfObjectTreeNode parent, PdfObjectTreeNode child, i
491396 return index ;
492397 }
493398
494- public void reset () {
399+ @ Override
400+ public void handleCloseDocument () {
495401 nodes = null ;
496- setChanged ();
497- forAllComponents (IRupsEventHandler ::handleCloseDocument );
402+ forAllComponents (IRupsEventListener ::handleCloseDocument );
403+ }
404+
405+ @ Override
406+ public void handleOpenDocument (ObjectLoader loader ) {
407+ nodes = loader .getNodes ();
408+ navigationTabs .setSelectedIndex (0 );
409+ forAllComponents (c -> c .handleOpenDocument (loader ));
410+ }
411+
412+ @ Override
413+ public void handleNewIndirectObject (PdfObject object ) {
414+ nodes .addNewIndirectObject (object );
415+ forAllComponents (c -> c .handleNewIndirectObject (object ));
416+ }
417+
418+ @ Override
419+ public void handleCompare (CompareResult result ) {
420+ highlightChanges (result );
421+ pdfTree .repaint ();
422+ }
423+
424+ @ Override
425+ public void handlePdfTreeNodeClicked (PdfObjectTreeNode node ) {
426+ nodes .expandNode (node );
427+
428+ if (node .isRecursive ()) {
429+ boolean keyboardNav = false ;
430+
431+ KeyListener [] listeners = pdfTree .getKeyListeners ();
432+
433+ for (KeyListener listener : listeners ) {
434+ if (listener instanceof PdfTreeNavigationListener ) {
435+ keyboardNav = ((PdfTreeNavigationListener ) listener ).isLastActionKeyboardNavigation ();
436+ }
437+ }
438+
439+ if (!keyboardNav ) {
440+ pdfTree .selectNode (node .getAncestor ());
441+ return ;
442+ }
443+ }
444+ render (node );
445+ }
446+
447+ @ Override
448+ public void handleArrayChildAdded (PdfObject value , PdfObjectTreeNode parent , int index ) {
449+ addTreeNodeArrayChild (parent , index );
450+ }
451+
452+ @ Override
453+ public void handleArrayChildDeleted (PdfObjectTreeNode parent , int index ) {
454+ deleteTreeChild (parent , index );
455+ }
456+
457+ @ Override
458+ public void handleDictChildAdded (PdfObject value , PdfObjectTreeNode parent , PdfName key , int index ) {
459+ addTreeNodeDictChild (parent , key , index );
460+ }
461+
462+ @ Override
463+ public void handleDictChildDeleted (PdfObjectTreeNode parent , PdfName key ) {
464+ deleteTreeNodeDictChild (parent , key );
498465 }
499466
500- private void forAllComponents (Consumer <IRupsEventHandler > func ) {
467+ private void forAllComponents (Consumer <IRupsEventListener > func ) {
501468 func .accept (pdfTree );
502469 func .accept (pages );
503470 func .accept (outlines );
0 commit comments