|
30 | 30 | package org.scijava.ui.swing.script;
|
31 | 31 |
|
32 | 32 | import java.awt.Color;
|
| 33 | +import java.awt.Cursor; |
33 | 34 | import java.awt.Dimension;
|
34 | 35 | import java.awt.Font;
|
35 | 36 | import java.awt.GridBagConstraints;
|
|
108 | 109 | import javax.swing.JCheckBoxMenuItem;
|
109 | 110 | import javax.swing.JFileChooser;
|
110 | 111 | import javax.swing.JFrame;
|
| 112 | +import javax.swing.JLabel; |
111 | 113 | import javax.swing.JMenu;
|
112 | 114 | import javax.swing.JMenuBar;
|
113 | 115 | import javax.swing.JMenuItem;
|
|
156 | 158 | import org.scijava.thread.ThreadService;
|
157 | 159 | import org.scijava.ui.CloseConfirmable;
|
158 | 160 | import org.scijava.ui.UIService;
|
| 161 | +import org.scijava.ui.swing.script.autocompletion.ClassUtil; |
159 | 162 | import org.scijava.ui.swing.script.commands.ChooseFontSize;
|
160 | 163 | import org.scijava.ui.swing.script.commands.ChooseTabSize;
|
161 | 164 | import org.scijava.ui.swing.script.commands.GitGrep;
|
@@ -214,7 +217,7 @@ public class TextEditor extends JFrame implements ActionListener,
|
214 | 217 | openMacroFunctions, decreaseFontSize, increaseFontSize, chooseFontSize,
|
215 | 218 | chooseTabSize, gitGrep, openInGitweb, replaceTabsWithSpaces,
|
216 | 219 | replaceSpacesWithTabs, toggleWhiteSpaceLabeling, zapGremlins,
|
217 |
| - savePreferences, toggleAutoCompletionMenu; |
| 220 | + savePreferences, toggleAutoCompletionMenu, openClassOrPackageHelp; |
218 | 221 | private RecentFilesMenuItem openRecent;
|
219 | 222 | private JMenu gitMenu, tabsMenu, fontSizeMenu, tabSizeMenu, toolsMenu,
|
220 | 223 | runMenu, whiteSpaceMenu;
|
@@ -483,6 +486,8 @@ public TextEditor(final Context context) {
|
483 | 486 | openHelp =
|
484 | 487 | addToMenu(toolsMenu, "Open Help for Class (with frames)...", 0, 0);
|
485 | 488 | openHelp.setMnemonic(KeyEvent.VK_P);
|
| 489 | + openClassOrPackageHelp = addToMenu(toolsMenu, "Source or javadoc for class or package...", 0, 0); |
| 490 | + openClassOrPackageHelp.setMnemonic(KeyEvent.VK_S); |
486 | 491 | openMacroFunctions =
|
487 | 492 | addToMenu(toolsMenu, "Open Help on Macro Functions...", 0, 0);
|
488 | 493 | openMacroFunctions.setMnemonic(KeyEvent.VK_H);
|
@@ -988,7 +993,12 @@ public void loadPreferences() {
|
988 | 993 |
|
989 | 994 | final int windowWidth = prefService.getInt(getClass(), WINDOW_WIDTH, dim.width);
|
990 | 995 | final int windowHeight = prefService.getInt(getClass(), WINDOW_HEIGHT, dim.height);
|
991 |
| - setPreferredSize(new Dimension(windowWidth, windowHeight)); |
| 996 | + // Avoid creating a window larger than the desktop |
| 997 | + final Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); |
| 998 | + if (windowWidth > screen.getWidth() || windowHeight > screen.getHeight()) |
| 999 | + setPreferredSize(new Dimension(DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT)); |
| 1000 | + else |
| 1001 | + setPreferredSize(new Dimension(windowWidth, windowHeight)); |
992 | 1002 |
|
993 | 1003 | final int mainDivLocation = prefService.getInt(getClass(), MAIN_DIV_LOCATION, body.getDividerLocation());
|
994 | 1004 | body.setDividerLocation(mainDivLocation);
|
@@ -1395,6 +1405,7 @@ else if (source == savePreferences) {
|
1395 | 1405 | }
|
1396 | 1406 | else if (source == openHelp) openHelp(null);
|
1397 | 1407 | else if (source == openHelpWithoutFrames) openHelp(null, false);
|
| 1408 | + else if (source == openClassOrPackageHelp) openClassOrPackageHelp(null); |
1398 | 1409 | else if (source == openMacroFunctions) try {
|
1399 | 1410 | new MacroFunctions(this).openHelp(getTextArea().getSelectedText());
|
1400 | 1411 | }
|
@@ -2659,6 +2670,87 @@ public void openHelp(String className, final boolean withFrames) {
|
2659 | 2670 | handleException(e);
|
2660 | 2671 | }
|
2661 | 2672 | }
|
| 2673 | + |
| 2674 | + /** |
| 2675 | + * @param text Either a classname, or a partial class name, or package name or any part of the fully qualified class name. |
| 2676 | + */ |
| 2677 | + public void openClassOrPackageHelp(String text) { |
| 2678 | + if (text == null) |
| 2679 | + text = getSelectedClassNameOrAsk(); |
| 2680 | + if (null == text) return; |
| 2681 | + new Thread(new FindClassSourceAndJavadoc(text)).start(); // fork away from event dispatch thread |
| 2682 | + } |
| 2683 | + |
| 2684 | + public class FindClassSourceAndJavadoc implements Runnable { |
| 2685 | + private final String text; |
| 2686 | + public FindClassSourceAndJavadoc(final String text) { |
| 2687 | + this.text = text; |
| 2688 | + } |
| 2689 | + @Override |
| 2690 | + public void run() { |
| 2691 | + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); |
| 2692 | + final HashMap<String, ArrayList<String>> matches; |
| 2693 | + try { |
| 2694 | + matches = ClassUtil.findDocumentationForClass(text); |
| 2695 | + } finally { |
| 2696 | + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
| 2697 | + } |
| 2698 | + if (matches.isEmpty()) { |
| 2699 | + JOptionPane.showMessageDialog(getEditorPane(), "No info found for:\n'" + text +'"'); |
| 2700 | + return; |
| 2701 | + } |
| 2702 | + final JPanel panel = new JPanel(); |
| 2703 | + final GridBagLayout gridbag = new GridBagLayout(); |
| 2704 | + final GridBagConstraints c = new GridBagConstraints(); |
| 2705 | + panel.setLayout(gridbag); |
| 2706 | + panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); |
| 2707 | + final List<String> keys = new ArrayList<String>(matches.keySet()); |
| 2708 | + Collections.sort(keys); |
| 2709 | + c.gridy = 0; |
| 2710 | + for (final String classname: keys) { |
| 2711 | + c.gridx = 0; |
| 2712 | + c.anchor = GridBagConstraints.EAST; |
| 2713 | + final JLabel class_label = new JLabel(classname); |
| 2714 | + gridbag.setConstraints(class_label, c); |
| 2715 | + panel.add(class_label); |
| 2716 | + ArrayList<String> urls = matches.get(classname); |
| 2717 | + if (urls.isEmpty()) { |
| 2718 | + urls = new ArrayList<String>(); |
| 2719 | + urls.add("https://duckduckgo.com/?q=" + classname); |
| 2720 | + } |
| 2721 | + for (final String url: urls) { |
| 2722 | + c.gridx += 1; |
| 2723 | + c.anchor = GridBagConstraints.WEST; |
| 2724 | + String title = "JavaDoc"; |
| 2725 | + if (url.endsWith(".java")) title = "Source"; |
| 2726 | + else if (url.contains("duckduckgo")) title = "Search..."; |
| 2727 | + final JButton link = new JButton(title); |
| 2728 | + gridbag.setConstraints(link, c); |
| 2729 | + panel.add(link); |
| 2730 | + link.addActionListener(new ActionListener() { |
| 2731 | + public void actionPerformed(final ActionEvent event) { |
| 2732 | + try { |
| 2733 | + platformService.open(new URL(url)); |
| 2734 | + } catch (Exception e) { |
| 2735 | + e.printStackTrace(); |
| 2736 | + } |
| 2737 | + } |
| 2738 | + }); |
| 2739 | + } |
| 2740 | + c.gridy += 1; |
| 2741 | + } |
| 2742 | + final JScrollPane jsp = new JScrollPane(panel); |
| 2743 | + //jsp.setPreferredSize(new Dimension(800, 500)); |
| 2744 | + SwingUtilities.invokeLater(new Runnable() { |
| 2745 | + public void run() { |
| 2746 | + final JFrame frame = new JFrame(text); |
| 2747 | + frame.getContentPane().add(jsp); |
| 2748 | + frame.pack(); |
| 2749 | + frame.setVisible(true); |
| 2750 | + } |
| 2751 | + }); |
| 2752 | + } |
| 2753 | + } |
2662 | 2754 |
|
2663 | 2755 | public void extractSourceJar() {
|
2664 | 2756 | final File file = openWithDialog(null);
|
|
0 commit comments