From 6ef565f7c306f752f04352693bb4d8a0c3d050fd Mon Sep 17 00:00:00 2001 From: Ben Fry Date: Tue, 22 Sep 2015 15:31:50 -0400 Subject: [PATCH] deeper into the contrib manager rabbit hole --- app/src/processing/app/Base.java | 5 +- app/src/processing/app/Mode.java | 4 +- app/src/processing/app/UpdateCheck.java | 2 +- .../app/contrib/ContributionManager.java | 44 ++-- .../processing/app/contrib/ManagerFrame.java | 207 ++++++++++-------- .../processing/app/contrib/ManagerTabs.java | 52 +++-- .../app/contrib/UpdateListPanel.java | 15 +- app/src/processing/app/ui/Editor.java | 2 +- app/src/processing/app/ui/ExamplesFrame.java | 2 +- 9 files changed, 187 insertions(+), 146 deletions(-) diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index a6576d685..1b5729a66 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -268,7 +268,8 @@ public class Base { public Base(String[] args) throws Exception { - ContributionManager.cleanup(this); + ContributionManager.init(this); + buildCoreModes(); rebuildContribModes(); rebuildContribExamples(); @@ -686,7 +687,7 @@ public class Base { JMenuItem item = new JMenuItem(Language.text("menu.tools.add_tool")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - ContributionManager.openToolManager(getActiveEditor()); + ContributionManager.openTools(); } }); toolsMenu.add(item); diff --git a/app/src/processing/app/Mode.java b/app/src/processing/app/Mode.java index 99ec1e6ee..06b7bb057 100644 --- a/app/src/processing/app/Mode.java +++ b/app/src/processing/app/Mode.java @@ -416,7 +416,7 @@ public abstract class Mode { item = new JMenuItem(Language.text("examples.add_examples")); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - ContributionManager.openExampleManager(base.getActiveEditor()); + ContributionManager.openExamples(); } }); toolbarMenu.add(item); @@ -492,7 +492,7 @@ public abstract class Mode { JMenuItem addLib = new JMenuItem(Language.text("menu.library.add_library")); addLib.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - ContributionManager.openLibraryManager(base.getActiveEditor()); + ContributionManager.openLibraries(); } }); importMenu.add(addLib); diff --git a/app/src/processing/app/UpdateCheck.java b/app/src/processing/app/UpdateCheck.java index 4c8d2d5a1..fd43088ab 100644 --- a/app/src/processing/app/UpdateCheck.java +++ b/app/src/processing/app/UpdateCheck.java @@ -180,7 +180,7 @@ public class UpdateCheck { options, options[0]); if (result == JOptionPane.YES_OPTION) { - ContributionManager.openUpdates(base.getActiveEditor()); + ContributionManager.openUpdates(); return true; } diff --git a/app/src/processing/app/contrib/ContributionManager.java b/app/src/processing/app/contrib/ContributionManager.java index e711eb4c7..aae213540 100644 --- a/app/src/processing/app/contrib/ContributionManager.java +++ b/app/src/processing/app/contrib/ContributionManager.java @@ -30,7 +30,6 @@ import javax.swing.SwingWorker; import processing.app.Base; import processing.app.Language; import processing.app.Messages; -import processing.app.Settings; import processing.app.Util; import processing.app.ui.Editor; import processing.core.PApplet; @@ -481,7 +480,7 @@ public class ContributionManager { * and remove any "requires restart" flags. * Also updates all entries previously marked for update. */ - static public void cleanup(final Base base) throws Exception { + static private void cleanup(final Base base) throws Exception { deleteTemp(Base.getSketchbookModesFolder()); deleteTemp(Base.getSketchbookToolsFolder()); @@ -649,47 +648,52 @@ public class ContributionManager { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - static ManagerFrame managerDialog = - new ManagerFrame(); + static ManagerFrame managerDialog; + + + static public void init(Base base) throws Exception { + managerDialog = new ManagerFrame(base); + cleanup(base); + } /** * Show the Library installer window. */ - static public void openLibraryManager(Editor editor) { - managerDialog.showFrame(editor, ContributionType.LIBRARY); - } - - - /** - * Show the Tool installer window. - */ - static public void openToolManager(Editor editor) { - managerDialog.showFrame(editor, ContributionType.TOOL); + static public void openLibraries() { + managerDialog.showFrame(ContributionType.LIBRARY); } /** * Show the Mode installer window. */ - static public void openModeManager(Editor editor) { - managerDialog.showFrame(editor, ContributionType.MODE); + static public void openModes() { + managerDialog.showFrame(ContributionType.MODE); + } + + + /** + * Show the Tool installer window. + */ + static public void openTools() { + managerDialog.showFrame(ContributionType.TOOL); } /** * Show the Examples installer window. */ - static public void openExampleManager(Editor editor) { - managerDialog.showFrame(editor, ContributionType.EXAMPLES); + static public void openExamples() { + managerDialog.showFrame(ContributionType.EXAMPLES); } /** * Open the updates panel. */ - static public void openUpdates(Editor editor) { - managerDialog.showFrame(editor, null); + static public void openUpdates() { + managerDialog.showFrame(null); } diff --git a/app/src/processing/app/contrib/ManagerFrame.java b/app/src/processing/app/contrib/ManagerFrame.java index a714191da..914160e55 100644 --- a/app/src/processing/app/contrib/ManagerFrame.java +++ b/app/src/processing/app/contrib/ManagerFrame.java @@ -3,7 +3,7 @@ /* Part of the Processing project - http://processing.org - Copyright (c) 2013 The Processing Foundation + Copyright (c) 2013-15 The Processing Foundation Copyright (c) 2011-12 Ben Fry and Casey Reas This program is free software; you can redistribute it and/or modify @@ -25,10 +25,6 @@ import java.awt.*; import java.awt.event.*; import javax.swing.*; -import javax.swing.border.EmptyBorder; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.plaf.basic.BasicTabbedPaneUI; import processing.app.*; import processing.app.ui.Editor; @@ -46,30 +42,33 @@ public class ManagerFrame { static final int TAB_HEIGHT = 34; static final int AUTHOR_WIDTH = 240; static final int STATUS_WIDTH = 66; - static final int BORDER = 8; static final String title = "Manager"; + Base base; JFrame frame; - JTabbedPane tabbedPane; +// JTabbedPane tabbedPane; + ManagerTabs tabs; // the calling editor, so updates can be applied - Editor editor; +// Editor editor; ContributionTab librariesTab; ContributionTab modesTab; ContributionTab toolsTab; ContributionTab examplesTab; UpdateContributionTab updatesTab; - JLabel numberLabel; +// JLabel numberLabel; - private JLabel[] tabLabels; - private JPanel updateTabPanel; - private JLabel updateTabLabel; +// private JLabel[] tabLabels; +// private JPanel updateTabPanel; +// private JLabel updateTabLabel; - public ManagerFrame() { - numberLabel = new JLabel(Toolkit.getLibIconX("manager/notification")); + public ManagerFrame(Base base) { + this.base = base; + +// numberLabel = new JLabel(Toolkit.getLibIconX("manager/notification")); librariesTab = new ContributionTab(ContributionType.LIBRARY, this); modesTab = new ContributionTab(ContributionType.MODE, this); toolsTab = new ContributionTab(ContributionType.TOOL, this); @@ -78,53 +77,54 @@ public class ManagerFrame { } - public void showFrame(Editor editor, ContributionType contributionType) { - this.editor = editor; + // TODO remove this Editor... need to use Base.getActiveEditor() + // The editor may be closed while still running the contrib manager + public void showFrame(ContributionType contributionType) { +// this.editor = editor; + + ContributionTab showTab = getTab(contributionType); // Calculating index to switch to the required tab - int index = ContributionManager.getTypeIndex(contributionType); + //int index = ContributionManager.getTypeIndex(contributionType); if (frame == null) { - makeFrame(editor); + makeFrame(); // done before as downloadAndUpdateContributionListing() // requires the current selected tab - tabbedPane.setSelectedIndex(index); - downloadAndUpdateContributionListing(editor.getBase()); - if (index != 4) { - Component selected = - tabbedPane.getTabComponentAt(tabbedPane.getSelectedIndex()); +// tabbedPane.setSelectedIndex(index); + tabs.setPanel(showTab); + downloadAndUpdateContributionListing(base); + if (showTab != updatesTab) { +// Component selected = +// tabbedPane.getTabComponentAt(tabbedPane.getSelectedIndex()); + Component selected = showTab; // what the.. ? [fry] selected.setBackground(new Color(0xe0fffd)); selected.setForeground(Color.BLACK); } else { - updateTabPanel.setBackground(new Color(0xe0fffd)); - updateTabLabel.setForeground(Color.BLACK); +// updateTabPanel.setBackground(new Color(0xe0fffd)); +// updateTabLabel.setForeground(Color.BLACK); } + } else { +// tabbedPane.setSelectedIndex(index); + tabs.setPanel(showTab); } - tabbedPane.setSelectedIndex(index); frame.setVisible(true); } - protected ContributionTab getTab(ContributionType contributionType) { - if (contributionType == ContributionType.LIBRARY) { - return librariesTab; - } else if (contributionType == ContributionType.MODE) { - return modesTab; - } else if (contributionType == ContributionType.TOOL) { - return toolsTab; - } else if (contributionType == ContributionType.EXAMPLES) { - return examplesTab; - } - return updatesTab; - } - - - private void makeFrame(final Editor editor) { + private void makeFrame() { frame = new JFrame(title); frame.setMinimumSize(new Dimension(750, 500)); - tabbedPane = new JTabbedPane(); + tabs = new ManagerTabs(base); makeAndShowTab(false, true); + tabs.add(librariesTab); + tabs.add(modesTab); + tabs.add(toolsTab); + tabs.add(examplesTab); + tabs.add(updatesTab); + + /* tabbedPane.addTab("Libraries", null, librariesTab, "Libraries"); tabbedPane.setMnemonicAt(0, KeyEvent.VK_1); @@ -147,47 +147,9 @@ public class ManagerFrame { for (int i = 0; i < 5; i++) { tabbedPane.setToolTipTextAt(i, null); } + */ - makeAndSetTabComponents(); - - tabbedPane.addChangeListener(new ChangeListener() { - - @Override - public void stateChanged(ChangeEvent e) { - for(int i = 0 ; i < 4; i++){ - tabLabels[i].setBackground(new Color(0x2d4251)); - tabLabels[i].setForeground(Color.WHITE); - } - updateTabPanel.setBackground(new Color(0x2d4251)); - updateTabLabel.setForeground(Color.WHITE); - int currentIndex = tabbedPane.getSelectedIndex(); - if(currentIndex != 4){ - tabbedPane.getTabComponentAt(tabbedPane.getSelectedIndex()).setBackground(new Color(0xe0fffd)); - tabbedPane.getTabComponentAt(tabbedPane.getSelectedIndex()).setForeground(Color.BLACK); - }else{ - updateTabPanel.setBackground(new Color(0xe0fffd)); - updateTabLabel.setForeground(Color.BLACK); - } - getActiveTab().contributionListPanel.scrollPane.requestFocusInWindow(); - } - }); - - frame.setResizable(true); - tabbedPane.setBorder(new EmptyBorder(BORDER, BORDER, BORDER, BORDER)); - frame.getContentPane().add(tabbedPane); - frame.getContentPane().setBackground(new Color(0x132638)); - frame.validate(); - frame.repaint(); - - Toolkit.setIcon(frame); - registerDisposeListeners(); - - frame.pack(); - frame.setLocationRelativeTo(null); - } - - - private void makeAndSetTabComponents() { + /* final String[] tabTitles = { "Libraries", "Modes", "Tools", "Examples", "Updates" }; @@ -215,7 +177,9 @@ public class ManagerFrame { tabLabels[i].setFont(Toolkit.getSansFont(14, Font.BOLD)); tabbedPane.setTabComponentAt(i, tabLabels[i]); } + */ + /* updateTabPanel = new JPanel() { @Override protected void paintComponent(Graphics g) { @@ -236,7 +200,9 @@ public class ManagerFrame { updateTabPanel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); updateTabPanel.setPreferredSize(new Dimension(TAB_WIDTH, TAB_HEIGHT)); tabbedPane.setTabComponentAt(4, updateTabPanel); + */ + /* GroupLayout tabLayout = new GroupLayout(updateTabPanel); tabLayout.setAutoCreateGaps(true); updateTabPanel.setLayout(tabLayout); @@ -253,13 +219,60 @@ public class ManagerFrame { .addComponent(numberLabel).addComponent(updateTabLabel)); numberLabel.setVisible(false); + */ + + /* + tabbedPane.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent e) { + for(int i = 0 ; i < 4; i++){ + tabLabels[i].setBackground(new Color(0x2d4251)); + tabLabels[i].setForeground(Color.WHITE); + } + updateTabPanel.setBackground(new Color(0x2d4251)); + updateTabLabel.setForeground(Color.WHITE); + int currentIndex = tabbedPane.getSelectedIndex(); + if(currentIndex != 4){ + tabbedPane.getTabComponentAt(tabbedPane.getSelectedIndex()).setBackground(new Color(0xe0fffd)); + tabbedPane.getTabComponentAt(tabbedPane.getSelectedIndex()).setForeground(Color.BLACK); + }else{ + updateTabPanel.setBackground(new Color(0xe0fffd)); + updateTabLabel.setForeground(Color.BLACK); + } + getActiveTab().contributionListPanel.scrollPane.requestFocusInWindow(); + } + }); + */ + + frame.setResizable(true); +// tabbedPane.setBorder(new EmptyBorder(BORDER, BORDER, BORDER, BORDER)); + frame.getContentPane().add(tabs); + frame.validate(); + frame.repaint(); + + Toolkit.setIcon(frame); + registerDisposeListeners(); + + frame.pack(); + frame.setLocationRelativeTo(null); + } + + + /** + * Close the window after an OK or Cancel. + */ + protected void disposeFrame() { + frame.dispose(); +// editor = null; } // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - public class SpacedTabbedPaneUI extends BasicTabbedPaneUI { + /* + private class SpacedTabbedPaneUI extends BasicTabbedPaneUI { @Override protected void installDefaults() { @@ -317,20 +330,12 @@ public class ManagerFrame { }; } } + */ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - /** - * Close the window after an OK or Cancel. - */ - protected void disposeFrame() { - frame.dispose(); - editor = null; - } - - private void registerDisposeListeners() { frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { @@ -399,6 +404,7 @@ public class ManagerFrame { void makeAndShowTab(boolean error, boolean loading) { + Editor editor = base.getActiveEditor(); librariesTab.showFrame(editor, error, loading); modesTab.showFrame(editor, error, loading); toolsTab.showFrame(editor, error, loading); @@ -407,7 +413,23 @@ public class ManagerFrame { } + protected ContributionTab getTab(ContributionType contributionType) { + if (contributionType == ContributionType.LIBRARY) { + return librariesTab; + } else if (contributionType == ContributionType.MODE) { + return modesTab; + } else if (contributionType == ContributionType.TOOL) { + return toolsTab; + } else if (contributionType == ContributionType.EXAMPLES) { + return examplesTab; + } + return updatesTab; + } + + ContributionTab getActiveTab() { + return (ContributionTab) tabs.getPanel(); + /* switch (tabbedPane.getSelectedIndex()) { case 0: return librariesTab; @@ -420,5 +442,6 @@ public class ManagerFrame { default: return updatesTab; } + */ } } diff --git a/app/src/processing/app/contrib/ManagerTabs.java b/app/src/processing/app/contrib/ManagerTabs.java index d84bfeace..bf1818b12 100644 --- a/app/src/processing/app/contrib/ManagerTabs.java +++ b/app/src/processing/app/contrib/ManagerTabs.java @@ -36,9 +36,10 @@ import java.util.ArrayList; import java.util.List; import javax.swing.*; +import javax.swing.border.EmptyBorder; +import processing.app.Base; import processing.app.Mode; -import processing.app.Sketch; import processing.app.ui.Editor; import processing.app.ui.Toolkit; @@ -50,6 +51,9 @@ public class ManagerTabs extends Box { // height of this tab bar static final int HIGH = 32; + // amount of space around the entire window + static final int BORDER = 8; + static final int CURVE_RADIUS = 6; static final int TAB_TOP = 2; @@ -70,9 +74,9 @@ public class ManagerTabs extends Box { Color[] textColor = new Color[2]; Color[] tabColor = new Color[2]; - Editor editor; + List tabList = new ArrayList<>(); - List tabs = new ArrayList<>(); + Mode mode; Font font; int fontAscent; @@ -87,14 +91,15 @@ public class ManagerTabs extends Box { CardLayout cardLayout; Controller controller; + Component currentPanel; - public ManagerTabs(Editor eddie) { + + public ManagerTabs(Base base) { super(BoxLayout.Y_AXIS); - this.editor = eddie; // A mode shouldn't actually override these, they're coming from theme.txt. // But use the default (Java) mode settings just in case. - Mode mode = editor.getBase().getDefaultMode(); + mode = base.getDefaultMode(); textColor[SELECTED] = mode.getColor("manager.tab.text.selected.color"); textColor[UNSELECTED] = mode.getColor("manager.tab.text.unselected.color"); @@ -105,6 +110,9 @@ public class ManagerTabs extends Box { gradient = mode.makeGradient("manager.tab", 400, HIGH); + setBackground(mode.getColor("manager.tab.background")); + setBorder(new EmptyBorder(BORDER, BORDER, BORDER, BORDER)); + controller = new Controller(); add(controller); @@ -127,7 +135,10 @@ public class ManagerTabs extends Box { * @param icon Prefix of the file name for the icon */ public void addPanel(Component comp, String name, String icon) { - tabs.add(new Tab(comp, name, icon)); + if (tabList.isEmpty()) { + currentPanel = comp; + } + tabList.add(new Tab(comp, name, icon)); cardPanel.add(name, comp); } @@ -138,8 +149,9 @@ public class ManagerTabs extends Box { public void setPanel(Component comp) { - for (Tab tab : tabs) { + for (Tab tab : tabList) { if (tab.comp == comp) { + currentPanel = comp; cardLayout.show(cardPanel, tab.name); repaint(); } @@ -147,8 +159,13 @@ public class ManagerTabs extends Box { } + public Component getPanel() { + return currentPanel; + } + + public void setNotification(Component comp, boolean note) { - for (Tab tab : tabs) { + for (Tab tab : tabList) { if (tab.comp == comp) { tab.notification = note; repaint(); @@ -166,10 +183,10 @@ public class ManagerTabs extends Box { addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { int x = e.getX(); - for (Tab tab : tabs) { + for (Tab tab : tabList) { if (tab.contains(x)) { - //editor.setFooterPanel(tab.index); - cardLayout.show(cardPanel, tab.name); + //cardLayout.show(cardPanel, tab.name); + setPanel(tab.comp); repaint(); } } @@ -179,8 +196,6 @@ public class ManagerTabs extends Box { public void paintComponent(Graphics screen) { if (screen == null) return; - Sketch sketch = editor.getSketch(); - if (sketch == null) return; // possible? Dimension size = getSize(); if ((size.width != sizeW) || (size.height != sizeH)) { @@ -223,7 +238,7 @@ public class ManagerTabs extends Box { g.drawImage(gradient, 0, 2, imageW, imageH, this); // reset all tab positions - for (Tab tab : tabs) { + for (Tab tab : tabList) { tab.textWidth = (int) font.getStringBounds(tab.name, g2.getFontRenderContext()).getWidth(); } @@ -248,7 +263,7 @@ public class ManagerTabs extends Box { private void placeTabs(int left, Graphics2D g) { int x = left; - for (Tab tab : tabs) { + for (Tab tab : tabList) { tab.left = x; x += MARGIN; if (tab.hasIcon()) { @@ -332,7 +347,6 @@ public class ManagerTabs extends Box { this.name = name; if (icon != null) { - Mode mode = editor.getMode(); enabledIcon = mode.loadImageX(icon + "-enabled"); selectedIcon = mode.loadImageX(icon + "-selected"); if (selectedIcon == null) { @@ -350,11 +364,11 @@ public class ManagerTabs extends Box { } boolean isFirst() { - return tabs.get(0) == this; + return tabList.get(0) == this; } boolean isLast() { - return tabs.get(tabs.size() - 1) == this; + return tabList.get(tabList.size() - 1) == this; } int getTextLeft() { diff --git a/app/src/processing/app/contrib/UpdateListPanel.java b/app/src/processing/app/contrib/UpdateListPanel.java index 2841535a2..ebc8d01f1 100644 --- a/app/src/processing/app/contrib/UpdateListPanel.java +++ b/app/src/processing/app/contrib/UpdateListPanel.java @@ -12,7 +12,6 @@ import javax.swing.BorderFactory; import javax.swing.GroupLayout; import javax.swing.Icon; import javax.swing.JComponent; -import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; @@ -148,13 +147,13 @@ public class UpdateListPanel extends ListPanel { @Override void updatePanelOrdering(Set contributionsSet) { - JLabel label = contributionTab.contribDialog.numberLabel; - if (getNoOfRows() == 0) { - label.setVisible(false); - } else { - label.setVisible(true); - label.setText(Integer.toString(panelByContribution.size())); - } +// JLabel label = contributionTab.contribDialog.numberLabel; +// if (getNoOfRows() == 0) { +// label.setVisible(false); +// } else { +// label.setVisible(true); +// label.setText(Integer.toString(panelByContribution.size())); +// } model.getDataVector().removeAllElements(); model.fireTableDataChanged(); ContributionType temp = null; diff --git a/app/src/processing/app/ui/Editor.java b/app/src/processing/app/ui/Editor.java index 553804096..4b3469d5e 100644 --- a/app/src/processing/app/ui/Editor.java +++ b/app/src/processing/app/ui/Editor.java @@ -501,7 +501,7 @@ public abstract class Editor extends JFrame implements RunnerListener { JMenuItem addLib = new JMenuItem(Language.text("toolbar.add_mode")); addLib.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - ContributionManager.openModeManager(Editor.this); + ContributionManager.openModes(); } }); modePopup.add(addLib); diff --git a/app/src/processing/app/ui/ExamplesFrame.java b/app/src/processing/app/ui/ExamplesFrame.java index ecd531476..de13a4c24 100644 --- a/app/src/processing/app/ui/ExamplesFrame.java +++ b/app/src/processing/app/ui/ExamplesFrame.java @@ -108,7 +108,7 @@ public class ExamplesFrame extends JFrame { addExamplesButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - ContributionManager.openExampleManager(base.getActiveEditor()); + ContributionManager.openExamples(); } });