1 /*
2  * Copyright (c) 2008-2019 Emmanuel Dupuy.
3  * This project is distributed under the GPLv3 license.
4  * This is a Copyleft license that gives the user the right to use,
5  * copy and modify the code freely for non-commercial purposes.
6  */
7 
8 package org.jd.gui.controller;
9 
10 import org.jd.gui.api.API;
11 import org.jd.gui.api.feature.IndexesChangeListener;
12 import org.jd.gui.api.model.Container;
13 import org.jd.gui.api.model.Indexes;
14 import org.jd.gui.util.net.UriUtil;
15 import org.jd.gui.view.OpenTypeHierarchyView;
16 
17 import javax.swing.*;
18 import java.awt.*;
19 import java.net.URI;
20 import java.util.Collection;
21 import java.util.concurrent.Future;
22 import java.util.concurrent.ScheduledExecutorService;
23 import java.util.function.Consumer;
24 
25 public class OpenTypeHierarchyController implements IndexesChangeListener {
26     protected API api;
27     private ScheduledExecutorService executor;
28 
29     protected JFrame mainFrame;
30     protected OpenTypeHierarchyView openTypeHierarchyView;
31     protected SelectLocationController selectLocationController;
32 
33     protected Collection<Future<Indexes>> collectionOfFutureIndexes;
34     protected Consumer<URI> openCallback;
35 
OpenTypeHierarchyController(API api, ScheduledExecutorService executor, JFrame mainFrame)36     public OpenTypeHierarchyController(API api, ScheduledExecutorService executor, JFrame mainFrame) {
37         this.api = api;
38         this.executor = executor;
39         this.mainFrame = mainFrame;
40         // Create UI
41         openTypeHierarchyView = new OpenTypeHierarchyView(api, mainFrame, this::onTypeSelected);
42         selectLocationController = new SelectLocationController(api, mainFrame);
43     }
44 
show(Collection<Future<Indexes>> collectionOfFutureIndexes, Container.Entry entry, String typeName, Consumer<URI> openCallback)45     public void show(Collection<Future<Indexes>> collectionOfFutureIndexes, Container.Entry entry, String typeName, Consumer<URI> openCallback) {
46         // Init attributes
47         this.collectionOfFutureIndexes = collectionOfFutureIndexes;
48         this.openCallback = openCallback;
49         executor.execute(() -> {
50             // Waiting the end of indexation...
51             openTypeHierarchyView.showWaitCursor();
52             SwingUtilities.invokeLater(() -> {
53                 openTypeHierarchyView.hideWaitCursor();
54                 // Show
55                 openTypeHierarchyView.show(collectionOfFutureIndexes, entry, typeName);
56             });
57         });
58     }
59 
onTypeSelected(Point leftBottom, Collection<Container.Entry> entries, String typeName)60     protected void onTypeSelected(Point leftBottom, Collection<Container.Entry> entries, String typeName) {
61         if (entries.size() == 1) {
62             // Open the single entry uri
63             openCallback.accept(UriUtil.createURI(api, collectionOfFutureIndexes, entries.iterator().next(), null, typeName));
64         } else {
65             // Multiple entries -> Open a "Select location" popup
66             selectLocationController.show(
67                 new Point(leftBottom.x+(16+2), leftBottom.y+2),
68                 entries,
69                 (entry) -> openCallback.accept(UriUtil.createURI(api, collectionOfFutureIndexes, entry, null, typeName)), // entry selected
70                 () -> openTypeHierarchyView.focus());                                                               // popup closeClosure
71         }
72     }
73 
74     // --- IndexesChangeListener --- //
indexesChanged(Collection<Future<Indexes>> collectionOfFutureIndexes)75     public void indexesChanged(Collection<Future<Indexes>> collectionOfFutureIndexes) {
76         if (openTypeHierarchyView.isVisible()) {
77             // Update the list of containers
78             this.collectionOfFutureIndexes = collectionOfFutureIndexes;
79             // And refresh
80             openTypeHierarchyView.updateTree(collectionOfFutureIndexes);
81         }
82     }
83 }
84