/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
Part of the Processing project - http://processing.org
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
it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package processing.app.contrib;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import processing.app.*;
import processing.app.ui.Editor;
import processing.app.ui.Toolkit;
/**
* This class is the main Contribution Manager Dialog.
* It contains all the contributions tab and the update tab.
*/
public class ManagerFrame {
static final String ANY_CATEGORY = Language.text("contrib.all");
static final int AUTHOR_WIDTH = Toolkit.zoom(240);
static final int STATUS_WIDTH = Toolkit.zoom(66);
static final String title = "Contribution Manager";
Base base;
JFrame frame;
ManagerTabs tabs;
ContributionTab librariesTab;
ContributionTab modesTab;
ContributionTab toolsTab;
ContributionTab examplesTab;
UpdateContributionTab updatesTab;
static Font SMALL_PLAIN;
static Font SMALL_BOLD;
static Font NORMAL_PLAIN;
static Font NORMAL_BOLD;
public ManagerFrame(Base base) {
this.base = base;
final int smallSize = Toolkit.zoom(12);
final int normalSize = Toolkit.zoom(14);
SMALL_PLAIN = Toolkit.getSansFont(smallSize, Font.PLAIN);
SMALL_BOLD = Toolkit.getSansFont(smallSize, Font.BOLD);
NORMAL_PLAIN = Toolkit.getSansFont(normalSize, Font.PLAIN);
NORMAL_BOLD = Toolkit.getSansFont(normalSize, Font.BOLD);
librariesTab = new ContributionTab(this, ContributionType.LIBRARY);
modesTab = new ContributionTab(this, ContributionType.MODE);
toolsTab = new ContributionTab(this, ContributionType.TOOL);
examplesTab = new ContributionTab(this, ContributionType.EXAMPLES);
updatesTab = new UpdateContributionTab(this, null);
}
public void showFrame(ContributionType contributionType) {
ContributionTab showTab = getTab(contributionType);
if (frame == null) {
makeFrame();
// done before as downloadAndUpdateContributionListing()
// requires the current selected tab
tabs.setPanel(showTab);
downloadAndUpdateContributionListing(base);
} else {
tabs.setPanel(showTab);
}
frame.setVisible(true);
// Avoid the search box taking focus and hiding the 'search' text
tabs.requestFocusInWindow();
}
private void makeFrame() {
frame = new JFrame(title);
frame.setMinimumSize(Toolkit.zoom(750, 500));
tabs = new ManagerTabs(base);
makeAndShowTab(false, true);
tabs.addPanel(librariesTab, "Libraries");
tabs.addPanel(modesTab, "Modes");
tabs.addPanel(toolsTab, "Tools");
tabs.addPanel(examplesTab, "Examples");
tabs.addPanel(updatesTab, "Updates");
frame.setResizable(true);
Container c = frame.getContentPane();
c.add(tabs);
c.setBackground(base.getDefaultMode().getColor("manager.tab.background"));
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();
}
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
private void registerDisposeListeners() {
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
disposeFrame();
}
});
// handle window closing commands for ctrl/cmd-W or hitting ESC.
Toolkit.registerWindowCloseKeys(frame.getRootPane(), new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
disposeFrame();
}
});
frame.getContentPane().addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
//System.out.println(e);
KeyStroke wc = Toolkit.WINDOW_CLOSE_KEYSTROKE;
if ((e.getKeyCode() == KeyEvent.VK_ESCAPE)
|| (KeyStroke.getKeyStrokeForEvent(e).equals(wc))) {
disposeFrame();
}
}
});
}
// TODO move this to ContributionTab (this is handled weirdly, period) [fry]
void downloadAndUpdateContributionListing(Base base) {
//activeTab is required now but should be removed
//as there is only one instance of contribListing and it should be present in this class
final ContributionTab activeTab = getActiveTab();
ContribProgressMonitor progress =
new ContribProgressBar(activeTab.progressBar) {
@Override
public void startTask(String name, int maxValue) {
super.startTask(name, maxValue);
progressBar.setVisible(true);
progressBar.setString(null);
}
@Override
public void setProgress(int value) {
super.setProgress(value);
// int percent = 100 * value / this.max;
progressBar.setValue(value);
}
@Override
public void finishedAction() {
progressBar.setVisible(false);
activeTab.updateContributionListing();
activeTab.updateCategoryChooser();
if (error) {
exception.printStackTrace();
makeAndShowTab(true, false);
} else {
makeAndShowTab(false, false);
}
}
};
activeTab.contribListing.downloadAvailableList(base, progress);
}
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);
examplesTab.showFrame(editor, error, loading);
updatesTab.showFrame(editor, error, loading);
}
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();
}
}