This commit is contained in:
Akarshit Wal
2015-07-14 22:14:14 +05:30
parent 6763e76e85
commit e83d60ec6b
7 changed files with 173 additions and 392 deletions
@@ -55,7 +55,7 @@ public class ContributionListPanel extends JPanel implements Scrollable, Contrib
// private StatusPanel status;
protected ContributionFilter filter;
// private ContributionListing contribListing;
private ContributionListing contribListing = ContributionListing.getInstance();
protected ContributionListing contribListing = ContributionListing.getInstance();
protected JTable table;
DefaultTableModel dtm;
@@ -107,6 +107,7 @@ public class ContributionListPanel extends JPanel implements Scrollable, Contrib
dtm.setColumnIdentifiers(colName);
JScrollPane scrollPane = new JScrollPane(table);
table.setFillsViewportHeight(true);
// table.setBorder();
table.setDefaultRenderer(Contribution.class, new StatusRendere());
table.setRowHeight(30);
table.setRowMargin(6);
@@ -251,12 +252,12 @@ public class ContributionListPanel extends JPanel implements Scrollable, Contrib
Icon icon = null;
label.setBorder(BorderFactory.createEmptyBorder(0, 17, 0, 0));
if (contribution.isInstalled()) {
icon = UIManager.getIcon("OptionPane.warningIcon");
icon = Toolkit.getLibIcon("icons/installedAndUptodate.png");
if (contribListing.hasUpdates(contribution)) {
icon = Toolkit.getLibIcon("icons/pde-16.png");
icon = Toolkit.getLibIcon("icons/installedNeedsUpdate.png");
}
if (!contribution.isCompatible(Base.getRevision())) {
icon = Toolkit.getLibIcon("icons/pde-16.png");
icon = Toolkit.getLibIcon("icons/installedIncompatible.png");
}
}
label.setIcon(icon);
@@ -119,7 +119,7 @@ public class ContributionManagerDialog {
public void makeFrame(final Editor editor) {
dialog = new JFrame(title);
String[] tabTitles = { "Tools","Libraries","Modes","Examples","Updates"};
tabbedPane = new JTabbedPane();
makeAndShowTab(false, true);
@@ -141,19 +141,43 @@ public class ContributionManagerDialog {
tabbedPane.addTab("Updates", null, updatesContributionTab.panel, "Updates");
tabbedPane.setMnemonicAt(3, KeyEvent.VK_5);
tabbedPane.setUI(new SpacedTabbedPaneUI());
tabbedPane.setBackground(Color.WHITE);
tabbedPane.setOpaque(true);
tabbedPane.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
JPanel updateTabPanel = new JPanel(true);
numberLabel.setOpaque(true);
numberLabel.setBackground(Color.BLUE);
numberLabel.setOpaque(false);
numberLabel.setBorder(BorderFactory.createEmptyBorder(0, 6, 0, 0));
JLabel numberBackground = new JLabel(Toolkit.getLibIcon("icons/notification.png"));
JLabel updateTabLabel = new JLabel("Update");
updateTabPanel.setOpaque(false);
updateTabPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory
.createMatteBorder(0, 2, 0, 0, Color.BLACK), BorderFactory
.createEmptyBorder(4, 4, 4, 4)));
tabbedPane.setTabComponentAt(4, updateTabPanel);
JLabel tabLabels[] = new JLabel[4];
for(int i = 0 ; i < tabLabels.length;i++){
tabLabels[i] = new JLabel(tabTitles[i]);
tabLabels[i]
.setBorder(BorderFactory.createCompoundBorder(BorderFactory
.createMatteBorder(0, (i == 0 ? 0 : 2), 0, (i == 3 ? 2 : 0),
Color.BLACK), BorderFactory
.createEmptyBorder(4, 4, 4, 4)));
tabbedPane.setTabComponentAt(i, tabLabels[i]);
}
GroupLayout tabLayout = new GroupLayout(updateTabPanel);
tabLayout.setAutoCreateGaps(true);
updateTabPanel.setLayout(tabLayout);
tabLayout.setHorizontalGroup(tabLayout.createSequentialGroup().addComponent(numberLabel).addComponent(updateTabLabel));
tabLayout.setVerticalGroup(tabLayout.createParallelGroup().addComponent(numberLabel).addComponent(updateTabLabel));
tabbedPane.setTabComponentAt(4, updateTabPanel);
tabLayout.setHorizontalGroup(tabLayout
.createSequentialGroup()
.addGroup(tabLayout.createParallelGroup().addComponent(numberLabel)
.addComponent(numberBackground)).addComponent(updateTabLabel));
tabLayout.setVerticalGroup(tabLayout.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(numberBackground).addComponent(numberLabel)
.addComponent(updateTabLabel));
tabbedPane.addChangeListener(new ChangeListener() {
@@ -227,18 +251,40 @@ public class ContributionManagerDialog {
public class SpacedTabbedPaneUI extends BasicTabbedPaneUI {
@Override
protected void installDefaults() {
UIManager.put("TabbedPane.selected", Color.WHITE);
super.installDefaults();
highlight = Color.WHITE;
lightHighlight = Color.WHITE;
shadow = Color.WHITE;
darkShadow = Color.WHITE;
focus = Color.LIGHT_GRAY;
tabInsets = new Insets(0, 0, 0, 0);
contentBorderInsets = new Insets(0, 0, 0, 0);
tabAreaInsets = new Insets(0, 0, 0, 0);
selectedTabPadInsets = new Insets(0, 0, 0, 0);
}
@Override
protected LayoutManager createLayoutManager() {
return new BasicTabbedPaneUI.TabbedPaneLayout() {
@Override
public void addLayoutComponent(String name, Component comp) {
// TODO Auto-generated method stub
super.addLayoutComponent(name, comp);
}
@Override
protected void calculateTabRects(int tabPlacement, int tabCount) {
super.calculateTabRects(tabPlacement, tabCount);
for (int i = 0; i < rects.length; i++) {
rects[i].y -= 10;
rects[i].height += 15;
if (i == 4) {
rects[i].x = tabbedPane.getWidth() - rects[i].width;
rects[i].x = tabbedPane.getWidth() - rects[i].width - 2;
}
rects[i].y -= 5;
rects[i].height += 5;
}
}
};
@@ -249,14 +295,15 @@ public class ContributionManagerDialog {
GroupLayout layout = new GroupLayout(dialog.getContentPane());
dialog.getContentPane().setLayout(layout);
dialog.setResizable(true);
layout.setAutoCreateContainerGaps(true);
layout.setHorizontalGroup(layout.createParallelGroup()
.addComponent(tabbedPane));
layout.setVerticalGroup(layout
.createParallelGroup()
.addComponent(tabbedPane));
layout.setHonorsVisibility(tabbedPane, true);
dialog.getContentPane().setBackground(Color.WHITE);
dialog.validate();
dialog.pack();
dialog.repaint();
}
@@ -54,6 +54,7 @@ public class ContributionTab {
ContributionListPanel contributionListPanel;
StatusPanel statusPanel;
FilterField filterField;
JLabel filterLabel;
JButton restartButton;
JLabel categoryLabel;
JLabel loaderLabel;
@@ -96,9 +97,9 @@ public class ContributionTab {
contribListing = ContributionListing.getInstance();
if (contributionType == null) {
contributionListPanel = new UpdateContribListingPanel(this, filter);
statusPanel = new UpdateStatusPanel(450, this);
statusPanel = new UpdateStatusPanel(650, this);
} else {
statusPanel = new StatusPanel(450,this);
statusPanel = new StatusPanel(650,this);
contributionListPanel = new ContributionListPanel(this, filter);
}
contribListing.addContributionListener(contributionListPanel);
@@ -149,6 +150,8 @@ public class ContributionTab {
loaderLabel = new JLabel(Toolkit.getLibIcon("icons/loader.gif"));
loaderLabel.setOpaque(false);
loaderLabel.setBackground(Color.WHITE);
filterLabel = new JLabel("Filter");
filterLabel.setOpaque(false);
}
/*restartButton = new JButton(Language.text("contrib.restart"));
@@ -201,24 +204,29 @@ public class ContributionTab {
GroupLayout layout = new GroupLayout(panel);
panel.setLayout(layout);
layout.setAutoCreateContainerGaps(true);
layout.setAutoCreateGaps(true);
// layout.setAutoCreateContainerGaps(true);
// layout.setAutoCreateGaps(true);
layout.setHorizontalGroup(layout
.createParallelGroup(GroupLayout.Alignment.CENTER)
.addGroup(layout.createSequentialGroup()
.addGroup(layout
.createSequentialGroup()
.addContainerGap()
.addComponent(filterLabel)
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(filterField)
.addComponent(categoryChooser, GroupLayout.PREFERRED_SIZE,
GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addComponent(loaderLabel).addComponent(contributionListPanel)
.addComponent(errorPanel).addComponent(statusPanel));
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(categoryChooser,
categoryChooser.getPreferredSize().width + 20,
categoryChooser.getPreferredSize().width + 20,
categoryChooser.getPreferredSize().width + 20)
.addContainerGap()).addComponent(loaderLabel)
.addComponent(contributionListPanel).addComponent(errorPanel)
.addComponent(statusPanel));
layout.setVerticalGroup(layout
.createSequentialGroup()
.addGroup(layout
.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(categoryChooser, GroupLayout.PREFERRED_SIZE,
GroupLayout.DEFAULT_SIZE,
GroupLayout.PREFERRED_SIZE)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(filterLabel).addComponent(categoryChooser)
.addComponent(filterField))
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(loaderLabel)
@@ -228,6 +236,9 @@ public class ContributionTab {
GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE));
layout.linkSize(SwingConstants.VERTICAL, categoryChooser, filterField);
layout.setHonorsVisibility(contributionListPanel, false);
panel.setBackground(Color.WHITE);
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
}
@@ -279,7 +290,7 @@ public class ContributionTab {
closeButton = new JButton("X");
closeButton.setOpaque(false);
closeButton.setContentAreaFilled(false);
closeButton.addActionListener(new ActionListener() {
@Override
@@ -288,6 +299,8 @@ public class ContributionTab {
}
});
tryAgainButton = new JButton("Try Again");
tryAgainButton.setContentAreaFilled(false);
tryAgainButton.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.BLACK, 1),BorderFactory.createEmptyBorder(3, 0, 3, 0)));
tryAgainButton.addActionListener(new ActionListener() {
@Override
@@ -300,8 +313,12 @@ public class ContributionTab {
.createSequentialGroup()
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(errorMessage).addComponent(tryAgainButton))
.addGroup(layout
.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(errorMessage)
.addComponent(tryAgainButton, statusPanel.BUTTON_WIDTH,
statusPanel.BUTTON_WIDTH,
statusPanel.BUTTON_WIDTH))
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
.addComponent(closeButton));
@@ -309,7 +326,8 @@ public class ContributionTab {
.createSequentialGroup()
.addGroup(layout.createParallelGroup().addComponent(errorMessage)
.addComponent(closeButton)).addComponent(tryAgainButton));
errorPanel.setBackground(Color.BLUE);
errorPanel.setBackground(Color.PINK);
errorPanel.validate();
}
@@ -388,68 +406,36 @@ public class ContributionTab {
}
protected void setFilterText(String filter) {
if (filter == null || filter.isEmpty()) {
filterField.setText("");
filterField.showingHint = true;
} else {
filterField.setText(filter);
filterField.showingHint = false;
}
filterField.applyFilter();
}
// private JPanel getPlaceholder() {
// return contributionListPanel.statusPlaceholder;
// }
//TODO: this is causing a lot of bugs as the hint is wrongly firing applyFilter()
class FilterField extends JPanel {
JTextField searchField;
JButton searchButton;
String filterHint;
boolean showingHint;
class FilterField extends JTextField {
Icon searchIcon;
List<String> filters;
public FilterField () {
searchField = new JTextField(Language.text("contrib.filter_your_search"));
filterHint = Language.text("contrib.filter_your_search");
searchButton = new JButton("S");
super("");
searchIcon = Toolkit.getLibIcon("icons/searchIcon.png");
setOpaque(false);
ComponentBorder cb = new ComponentBorder(searchButton,"LEFT");
cb.install( searchField);
GroupLayout layout = new GroupLayout(this);
setLayout(layout);
layout.setHorizontalGroup(layout.createSequentialGroup().addComponent(searchField));
layout.setVerticalGroup(layout.createParallelGroup().addComponent(searchField));
showingHint = true;
filters = new ArrayList<String>();
updateStyle();
addFocusListener(new FocusListener() {
public void focusLost(FocusEvent focusEvent) {
if (filterField.getText().isEmpty()) {
showingHint = true;
if (getText().isEmpty()) {
setBorder(BorderFactory.createMatteBorder(0, 33, 0, 0, searchIcon));
}
updateStyle();
}
public void focusGained(FocusEvent focusEvent) {
if (showingHint) {
showingHint = false;
filterField.setText("");
}
updateStyle();
setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 0));
}
});
searchField.getDocument().addDocumentListener(new DocumentListener() {
getDocument().addDocumentListener(new DocumentListener() {
public void removeUpdate(DocumentEvent e) {
applyFilter();
}
@@ -465,7 +451,7 @@ public class ContributionTab {
}
public void applyFilter() {
String filter = filterField.getFilterText();
String filter = getText();
filter = filter.toLowerCase();
// Replace anything but 0-9, a-z, or : with a space
@@ -476,29 +462,6 @@ public class ContributionTab {
contributionListPanel.updateColors();
}
public String getFilterText() {
return showingHint ? "" : getText();
}
public String getText() {
return searchField.getText();
}
public void setText(String text) {
searchField.setText(text);
}
public void updateStyle() {
if (showingHint) {
setText(filterHint);
// setForeground(UIManager.getColor("TextField.light")); // too light
setForeground(Color.gray);
setFont(getFont().deriveFont(Font.ITALIC));
} else {
setForeground(UIManager.getColor("TextField.foreground"));
setFont(getFont().deriveFont(Font.PLAIN));
}
}
}
@@ -509,293 +472,4 @@ public class ContributionTab {
public void updateStatusPanel(ContributionPanel contributionPanel) {
statusPanel.update(contributionPanel);
}
/**
* The ComponentBorder class allows you to place a real component in
* the space reserved for painting the Border of a component.
*
* This class takes advantage of the knowledge that all Swing components are
* also Containers. By default the layout manager is null, so we should be
* able to place a child component anywhere in the parent component. In order
* to prevent the child component from painting over top of the parent
* component a Border is added to the parent componet such that the insets of
* the Border will reserve space for the child component to be painted without
* affecting the parent component.
*/
public class ComponentBorder implements Border
{
static final String TOP = "TOP";
static final String LEFT = "LEFT";
static final String BOTTOM = "BOTTOM";
static final String RIGHT = "RIGHT";
public static final float LEADING = 0.0f;
public static final float CENTER = 0.5f;
public static final float TRAILING = 1.0f;
private JComponent parent;
private JComponent component;
private String edge;
private float alignment;
private int gap = 5;
private boolean adjustInsets = true;
private Insets borderInsets = new Insets(0, 0, 0, 0);
/**
* Convenience constructor that uses the default edge (Edge.RIGHT) and
* alignment (CENTER).
*
* @param component the component to be added in the Border area
*/
public ComponentBorder(JComponent component)
{
this(component, RIGHT);
}
/**
* Convenience constructor that uses the default alignment (CENTER).
*
* @param component the component to be added in the Border area
* @param edge a valid Edge enum of TOP, LEFT, BOTTOM, RIGHT
*/
public ComponentBorder(JComponent component, String edge)
{
this(component, edge, CENTER);
}
/**
* Main constructor to create a ComponentBorder.
*
* @param component the component to be added in the Border area
* @param edge a valid Edge enum of TOP, LEFT, BOTTOM, RIGHT
* @param alignment the alignment of the component along the
* specified Edge. Must be in the range 0 - 1.0.
*/
public ComponentBorder(JComponent component, String edge, float alignment )
{
this.component = component;
component.setSize( component.getPreferredSize() );
component.setCursor(Cursor.getDefaultCursor());
setEdge( edge );
setAlignment( alignment );
}
public boolean isAdjustInsets()
{
return adjustInsets;
}
public void setAdjustInsets(boolean adjustInsets)
{
this.adjustInsets = adjustInsets;
}
/**
* Get the component alignment along the Border Edge
*
* @return the alignment
*/
public float getAlignment()
{
return alignment;
}
/**
* Set the component alignment along the Border Edge
*
* @param alignment a value in the range 0 - 1.0. Standard values would be
* CENTER (default), LEFT and RIGHT.
*/
public void setAlignment(float alignment)
{
this.alignment = alignment > 1.0f ? 1.0f : alignment < 0.0f ? 0.0f : alignment;
}
/**
* Get the Edge the component is positioned along
*
* @return the Edge
*/
public String getEdge()
{
return edge;
}
/**
* Set the Edge the component is positioned along
*
* @param edge the Edge the component is position on.
*/
public void setEdge(String edge)
{
this.edge = edge;
}
/**
* Get the gap between the border component and the parent component
*
* @return the gap in pixels.
*/
public int getGap()
{
return gap;
}
/**
* Set the gap between the border component and the parent component
*
* @param gap the gap in pixels (default is 5)
*/
public void setGap(int gap)
{
this.gap = gap;
}
//
// Implement the Border interface
//
public Insets getBorderInsets(Component c)
{
return borderInsets;
}
public boolean isBorderOpaque()
{
return false;
}
/**
* In this case a real component is to be painted. Setting the location
* of the component will cause it to be painted at that location.
*/
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height)
{
float x2 = (width - component.getWidth()) * component.getAlignmentX() + x;
float y2 = (height - component.getHeight()) * component.getAlignmentY() + y;
component.setLocation((int)x2, (int)y2);
}
/*
* Install this Border on the specified component by replacing the
* existing Border with a CompoundBorder containing the original Border
* and our ComponentBorder
*
* This method should only be invoked once all the properties of this
* class have been set. Installing the Border more than once will cause
* unpredictable results.
*/
public void install(JComponent parent)
{
this.parent = parent;
determineInsetsAndAlignment();
// Add this Border to the parent
Border current = parent.getBorder();
if (current == null)
{
parent.setBorder(this);
}
else
{
CompoundBorder compound = new CompoundBorder(current, this);
parent.setBorder(compound);
}
// Add component to the parent
parent.add(component);
}
/**
* The insets need to be determined so they are included in the preferred
* size of the component the Border is attached to.
*
* The alignment of the component is determined here so it doesn't need
* to be recalculated every time the Border is painted.
*/
private void determineInsetsAndAlignment()
{
borderInsets = new Insets(0, 0, 0, 0);
// The insets will only be updated for the edge the component will be
// diplayed on.
//
// The X, Y alignment of the component is controlled by both the edge
// and alignment parameters
if (edge.equals("TOP"))
{
borderInsets.top = component.getPreferredSize().height + gap;
component.setAlignmentX(alignment);
component.setAlignmentY(0.0f);
}
else if (edge.equals("BOTTOM"))
{
borderInsets.bottom = component.getPreferredSize().height + gap;
component.setAlignmentX(alignment);
component.setAlignmentY(1.0f);
}
else if (edge.equals("LEFT"))
{
borderInsets.left = component.getPreferredSize().width + gap;
component.setAlignmentX(0.0f);
component.setAlignmentY(alignment);
}
else if (edge.equals("RIGHT"))
{
borderInsets.right = component.getPreferredSize().width + gap;
component.setAlignmentX(1.0f);
component.setAlignmentY(alignment);
}
if (adjustInsets)
adjustBorderInsets();
}
/*
* The complimentary edges of the Border may need to be adjusted to allow
* the component to fit completely in the bounds of the parent component.
*/
private void adjustBorderInsets()
{
Insets parentInsets = parent.getInsets();
// May need to adust the height of the parent component to fit
// the component in the Border
if (edge.equals("RIGHT") || edge.equals("LEFT"))
{
int parentHeight = parent.getPreferredSize().height - parentInsets.top - parentInsets.bottom;
int diff = component.getHeight() - parentHeight;
if (diff > 0)
{
int topDiff = (int)(diff * alignment);
int bottomDiff = diff - topDiff;
borderInsets.top += topDiff;
borderInsets.bottom += bottomDiff;
}
}
// May need to adust the width of the parent component to fit
// the component in the Border
if (edge.equals("TOP") || edge.equals("BOTTOM"))
{
int parentWidth = parent.getPreferredSize().width - parentInsets.left - parentInsets.right;
int diff = component.getWidth() - parentWidth;
if (diff > 0)
{
int leftDiff = (int)(diff * alignment);
int rightDiff = diff - leftDiff;
borderInsets.left += leftDiff;
borderInsets.right += rightDiff;
}
}
}
}
}
@@ -26,6 +26,7 @@ import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
@@ -55,6 +56,9 @@ class StatusPanel extends JPanel {
ContributionTab contributionTab;
public StatusPanel(int width, final ContributionTab contributionTab) {
super();
setBackground(Color.WHITE);
setBorder(BorderFactory.createMatteBorder(2, 0, 0, 0, Color.BLACK));
this.contributionTab = contributionTab;
label = new JTextPane();
label.setEditable(false);
@@ -72,6 +76,8 @@ class StatusPanel extends JPanel {
}
});
installButton = new JButton("Install");
installButton.setContentAreaFilled(false);
installButton.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.BLACK, 1),BorderFactory.createEmptyBorder(3, 0, 3, 0)));
installButton.addActionListener(new ActionListener() {
@Override
@@ -83,9 +89,12 @@ class StatusPanel extends JPanel {
}
});
progressBarPanel = new JPanel();
progressBarPanel.setLayout(new BorderLayout());;
updateLabel = new JLabel(" ");
progressBarPanel.setLayout(new BorderLayout());
progressBarPanel.setOpaque(false);
updateLabel = new JLabel(" ");
updateButton = new JButton("Update");
updateButton.setContentAreaFilled(false);
updateButton.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.BLACK, 1),BorderFactory.createEmptyBorder(3, 0, 3, 0)));
updateButton.addActionListener(new ActionListener() {
@Override
@@ -98,6 +107,8 @@ class StatusPanel extends JPanel {
});
removeButton = new JButton("Remove");
removeButton.setContentAreaFilled(false);
removeButton.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.BLACK, 1),BorderFactory.createEmptyBorder(3, 0, 3, 0)));
removeButton.addActionListener(new ActionListener() {
@Override
@@ -150,6 +161,8 @@ class StatusPanel extends JPanel {
removeButton.setEnabled(false);
layout.setHonorsVisibility(updateLabel, false); // Makes the label take up space even though not visible
validate();
}
@@ -8,15 +8,19 @@ import java.util.TreeMap;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import processing.app.Base;
import processing.app.contrib.ContributionListPanel.MyColumnHeaderRenderer;
import processing.app.ui.Toolkit;
public class UpdateContribListingPanel extends ContributionListPanel {
@@ -83,7 +87,26 @@ public class UpdateContribListingPanel extends ContributionListPanel {
table.setRowSelectionAllowed(true);
table.setAutoCreateColumnsFromModel(true);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.getTableHeader().setDefaultRenderer(new MyColumnHeaderRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus, int row,
int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
row, column);
JTableHeader tableHeader = table.getTableHeader();
if (tableHeader != null) {
setForeground(tableHeader.getForeground());
}
setIcon(getIcon(table, column));
setBackground(Color.WHITE);
setBorder(BorderFactory.createMatteBorder(2, 0, 2, 0, Color.BLACK));
return this;
}
});
GroupLayout layout = new GroupLayout(this);
layout.setHorizontalGroup(layout.createParallelGroup().addComponent(scrollPane));
layout.setVerticalGroup(layout.createSequentialGroup().addComponent(scrollPane));
@@ -164,9 +187,19 @@ public class UpdateContribListingPanel extends ContributionListPanel {
}
}
}
Icon icon = null;
if (entry.isInstalled()) {
icon = Toolkit.getLibIcon("icons/installedAndUptodate.png");
if (contribListing.hasUpdates(entry)) {
icon = Toolkit.getLibIcon("icons/installedNeedsUpdate.png");
}
if (!entry.isCompatible(Base.getRevision())) {
icon = Toolkit.getLibIcon("icons/installedIncompatible.png");
}
}
dtm
.addRow(new Object[] {
"", "<html><b>" + entry.getName() + "</b></html>", name, entry.getPrettyVersion(),
icon, "<html><b>" + entry.getName() + "</b></html>", name, entry.getPrettyVersion(),
contributionTab.contribListing.getLatestVersion(entry) });
}
}
@@ -178,5 +211,12 @@ public class UpdateContribListingPanel extends ContributionListPanel {
public boolean isCellEditable(int row, int column) {
return false;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
if(columnIndex == 0){
return Icon.class;
}
return super.getColumnClass(columnIndex);
}
}
}
@@ -1,8 +1,10 @@
package processing.app.contrib;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.LayoutStyle;
@@ -11,6 +13,8 @@ public class UpdateStatusPanel extends StatusPanel {
public UpdateStatusPanel(int width, final ContributionTab contributionTab) {
super();
updateButton = new JButton("Update All");
updateButton.setContentAreaFilled(false);
updateButton.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.BLACK, 1),BorderFactory.createEmptyBorder(3, 0, 3, 0)));
updateButton.addActionListener(new ActionListener() {
@Override
@@ -21,6 +25,8 @@ public class UpdateStatusPanel extends StatusPanel {
}
}
});
this.setBackground(Color.WHITE);
this.setBorder(BorderFactory.createMatteBorder(2, 0, 0, 0, Color.BLACK));
layout = new GroupLayout(this);
this.setLayout(layout);
@@ -31,7 +37,7 @@ public class UpdateStatusPanel extends StatusPanel {
.createSequentialGroup()
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
.addComponent(updateButton));
.addComponent(updateButton, BUTTON_WIDTH, BUTTON_WIDTH, BUTTON_WIDTH));
layout.setVerticalGroup(layout.createParallelGroup()
.addComponent(updateButton));
updateButton.setVisible(true);
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB