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