[rfc][icedtea-web] make download indicator more compact

Jiri Vanek jvanek at redhat.com
Thu Jan 10 06:33:00 PST 2013


On 01/09/2013 08:45 PM, Adam Domurad wrote:
> On 01/08/2013 11:06 AM, Jiri Vanek wrote:
>> On 01/07/2013 08:00 PM, Adam Domurad wrote:
>>> On 01/07/2013 09:41 AM, Jiri Vanek wrote:
>>>> On 01/04/2013 05:35 PM, Adam Domurad wrote:
>>>>> On 01/03/2013 11:07 AM, Jiri Vanek wrote:
>>>>>> Hi!
>>>>>>
>>>>>> This patch is adding "show details" to download indicator. For One jar jnlp files it behaviour is
>>>>>> unaffected. For Multiple jars there is just one progress bar, but can be shown "old stile"
>>>>>> detailed one via clicking to "Show details". Then can be minimalised by "hide details". Button is
>>>>>> localised.
>>>>>>
>>>>>> The button is nasty not nice.. Any better idea? but still this is better then previous approach.
>>>>>>
>>>>>> Looking forward to have this inside!
>>>>>>
>>>>>> Best rigards
>>>>>> J.
>>>>>
>>>>> Thanks for looking into this! I was actually comparing our download indicator to proprietary just
>>>>> yesterday, while staring at multiple jars downloading. The average user does not want to know
>>>>> about
>>>>> the jars being downloaded, in fact I think such information can look scary :-).
>>>>>
>>>>>> diff -r 9549226afa8f netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java
>>>>>> --- a/netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java Thu Jan 03 09:54:16 2013
>>>>>> +0100
>>>>>> +++ b/netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java Thu Jan 03 17:07:28 2013
>>>>>> +0100
>>>>>> @@ -62,6 +62,7 @@
>>>>>>
>>>>>> /** shared constraint */
>>>>>> static GridBagConstraints vertical;
>>>>>> + static GridBagConstraints verticalNoClean;
>>>>>> static GridBagConstraints verticalIndent;
>>>>>> static {
>>>>>> vertical = new GridBagConstraints();
>>>>>> @@ -70,8 +71,12 @@
>>>>>> vertical.fill = GridBagConstraints.HORIZONTAL;
>>>>>> vertical.anchor = GridBagConstraints.WEST;
>>>>>>
>>>>>> + verticalNoClean = new GridBagConstraints();
>>>>>> + verticalNoClean.weightx = 1.0;
>>>>>> +
>>>>>> verticalIndent = (GridBagConstraints) vertical.clone();
>>>>>> verticalIndent.insets = new Insets(0, 10, 3, 0);
>>>>>> +
>>>>>
>>>>> Nit: These two blank lines (and all the ones added below) have tabs :-)
>>>>>
>>>>>> }
>>>>>>
>>>>>> /**
>>>>>> @@ -114,15 +119,15 @@
>>>>>>
>>>>>> frame.getContentPane().add(result, vertical);
>>>>>> frame.pack();
>>>>>> -
>>>>>> if (!frame.isVisible()) {
>>>>>> - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
>>>>>> - Insets insets =
>>>>>> Toolkit.getDefaultToolkit().getScreenInsets(frame.getGraphicsConfiguration());
>>>>>> - Dimension screen = new Dimension(screenSize.width - insets.left,
>>>>>> - screenSize.height - insets.top);
>>>>>> - frame.setLocation(screen.width - frame.getWidth(),
>>>>>> - screen.height - frame.getHeight());
>>>>>> + placeFrameToLowerRight();
>>>>>> }
>>>>>> + result.addComponentListener(new ComponentAdapter() {
>>>>>> + @Override
>>>>>> + public void componentResized(ComponentEvent e) {
>>>>>> + placeFrameToLowerRight();
>>>>>> + }
>>>>>> + });
>>>>>>
>>>>>> frame.setVisible(true);
>>>>>>
>>>>>> @@ -131,6 +136,32 @@
>>>>>> }
>>>>>>
>>>>>> /**
>>>>>> + * The insets are calculated differently during first appearance
>>>>>> + * and during another appearance in case of some configurations.
>>>>>> + *
>>>>>> + * So the first value is stored to avoid jumping of window during later packing
>>>>>> + * of frame.
>>>>>> + *
>>>>>> + * However the second calculation is more correct:(
>>>>>> + *
>>>>>> + * This is affecting only multiple monitors which have different assets.
>>>>>> + * The underlying issue is that Toolkit.getDefaultToolkit().getScreenInsets
>>>>>> + * is returning assets for "random" monitor.
>>>>>> + */
>>>>>> + Dimension screen = null;
>>>>>> +
>>>>>> + private void placeFrameToLowerRight() throws HeadlessException {
>>>>>> + if (screen == null) {
>>>>>> + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
>>>>>> + Insets insets =
>>>>>> Toolkit.getDefaultToolkit().getScreenInsets(frame.getGraphicsConfiguration());
>>>>>> + screen = new Dimension(screenSize.width - insets.left,
>>>>>> + screenSize.height - insets.top);
>>>>>> + }
>>>>>> + frame.setLocation(screen.width - frame.getWidth(),
>>>>>> + screen.height - frame.getHeight());
>>>>>> + }
>>>>>> +
>>>>>> + /**
>>>>>> * Remove a download service listener that was obtained by
>>>>>> * calling the getDownloadListener method from the shared
>>>>>> * download info window.
>>>>>> @@ -163,12 +194,26 @@
>>>>>> * Groups the url progress in a panel.
>>>>>> */
>>>>>> static class DownloadPanel extends JPanel implements DownloadServiceListener {
>>>>>> -
>>>>>> + private static enum States{
>>>>>> + oneJAr, collapsed, detailed;
>>>>>
>>>>> Enums should be all-caps
>>>>>
>>>>>> +
>>>>>> + }
>>>>>> +
>>>>>> + private static final String DETAILS=R("ButShowDetails");
>>>>>> + private static final String HIDE_DETAILS=R("ButHideDetails");
>>>>>> /** the download name */
>>>>>> private String downloadName;
>>>>>>
>>>>>> /** Downloading part: */
>>>>>> private JLabel header = new JLabel();
>>>>>> + /** Show/hide details button: */
>>>>>> + private JButton details = new JButton(DETAILS);
>>>>>> + /** used instead of details button in case of one jar*/
>>>>>> + private JLabel delimiter = new JLabel("");
>>>>>> + /** all already created progress bars*/
>>>>>> + private List<ProgressPanel> progressPanels = new ArrayList<ProgressPanel>();
>>>>>> + private States state=States.oneJAr;
>>>>>> + private ProgressPanel mainProgressPanel;
>>>>>>
>>>>>> /** list of URLs being downloaded */
>>>>>> private List<URL> urls = new ArrayList<URL>();
>>>>>> @@ -176,6 +221,7 @@
>>>>>> /** list of ProgressPanels */
>>>>>> private List<ProgressPanel> panels = new ArrayList<ProgressPanel>();
>>>>>>
>>>>>> +
>>>>>
>>>>> Nit: two blank lines are unnecessary.
>>>>>
>>>>>> /**
>>>>>> * Create a new download panel for with the specified download
>>>>>> * name.
>>>>>> @@ -184,9 +230,35 @@
>>>>>> setLayout(new GridBagLayout());
>>>>>>
>>>>>> this.downloadName = downloadName;
>>>>>> - this.add(header, vertical);
>>>>>> + this.add(header, verticalNoClean);
>>>>>> header.setFont(header.getFont().deriveFont(Font.BOLD));
>>>>>> -
>>>>>> + this.add(delimiter, vertical);
>>>>>> + details.addActionListener(new ActionListener() {
>>>>>> + @Override
>>>>>> + public void actionPerformed(ActionEvent e) {
>>>>>> + if (state == States.detailed) {
>>>>>> + state = States.collapsed;
>>>>>> + details.setText(DETAILS);
>>>>>> + for (ProgressPanel progressPanel : progressPanels) {
>>>>>> + remove(progressPanel);
>>>>>> + }
>>>>>> + add(mainProgressPanel, verticalIndent);
>>>>>> + synchronized (frameMutex) {
>>>>>> + frame.pack();
>>>>>> + }
>>>>>> + } else {
>>>>>> + state = States.detailed;
>>>>>> + details.setText(HIDE_DETAILS);
>>>>>> + remove(mainProgressPanel);
>>>>>> + for (ProgressPanel progressPanel : progressPanels) {
>>>>>> + add(progressPanel, verticalIndent);
>>>>>> + }
>>>>>> + synchronized (frameMutex) {
>>>>>> + frame.pack();
>>>>>> + }
>>>>>> + }
>>>>>> + }
>>>>>> + });
>>>>>> setOverallPercent(0);
>>>>>> }
>>>>>>
>>>>>> @@ -196,14 +268,25 @@
>>>>>> protected void addProgressPanel(URL url, String version) {
>>>>>> if (!urls.contains(url)) {
>>>>>> ProgressPanel panel = new ProgressPanel(url, version);
>>>>>> -
>>>>>> - add(panel, verticalIndent);
>>>>>> + if (state != States.collapsed) {
>>>>>> + add(panel, verticalIndent);
>>>>>> + }
>>>>>> + progressPanels.add(panel);
>>>>>> + urls.add(url);
>>>>>> + panels.add(panel);
>>>>>> + if (panels.size() == 2){
>>>>>
>>>>> Small comment here would be good explaining why this 'magic number'
>>>>>
>>>>>> + remove(panels.get(0));
>>>>>> + remove(panels.get(1));
>>>>>> + remove(delimiter);
>>>>>> + add(details,vertical);
>>>>>> + mainProgressPanel=new ProgressPanel();
>>>>>> + add(mainProgressPanel, verticalIndent);
>>>>>> + state=States.collapsed;
>>>>>> + }
>>>>>> synchronized (frameMutex) {
>>>>>> frame.pack();
>>>>>> }
>>>>>>
>>>>>> - urls.add(url);
>>>>>> - panels.add(panel);
>>>>>> }
>>>>>> }
>>>>>>
>>>>>> @@ -219,10 +302,10 @@
>>>>>> addProgressPanel(url, version);
>>>>>>
>>>>>> setOverallPercent(overallPercent);
>>>>>> -
>>>>>> ProgressPanel panel = panels.get(urls.indexOf(url));
>>>>>> panel.setProgress(readSoFar, total);
>>>>>> panel.repaint();
>>>>>> +
>>>>>> }
>>>>>> };
>>>>>> SwingUtilities.invokeLater(r);
>>>>>> @@ -230,12 +313,28 @@
>>>>>>
>>>>>> /**
>>>>>> * Sets the overall percent completed.
>>>>>> + * should be called via invokeLater
>>>>>> */
>>>>>> public void setOverallPercent(int percent) {
>>>>>> // don't get whole string from resource and sub in
>>>>>> // values because it'll be doing a MessageFormat for
>>>>>> // each update.
>>>>>> header.setText(downloading + " " + downloadName + ": " + percent + "% " + complete +
>>>>>> ".");
>>>>>> + Container c = header.getParent();
>>>>>> + //we need to adapt nbboth panels and also frame to new length of header text
>>>>>
>>>>> nbboth > both
>>>>>
>>>>>> + while (c != null) {
>>>>>> + c.invalidate();
>>>>>> + c.validate();
>>>>>> + if (c instanceof Window){
>>>>>> + ((Window) c).pack();
>>>>>> + }
>>>>>> + c=c.getParent();
>>>>>> + }
>>>>>> +
>>>>>> + if (mainProgressPanel != null) {
>>>>>> + mainProgressPanel.setProgress(percent, 100);
>>>>>> + mainProgressPanel.repaint();
>>>>>> + }
>>>>>> }
>>>>>>
>>>>>> /**
>>>>>> @@ -276,12 +375,28 @@
>>>>>>
>>>>>> private long total;
>>>>>> private long readSoFar;
>>>>>> + private Dimension size = new Dimension(80, 15);
>>>>>>
>>>>>> + ProgressPanel() {
>>>>>> + bar.setMinimumSize(size);
>>>>>> + bar.setPreferredSize(size);
>>>>>> + bar.setOpaque(false);
>>>>>> +
>>>>>> + setLayout(new GridBagLayout());
>>>>>> +
>>>>>> + GridBagConstraints gbc = new GridBagConstraints();
>>>>>> + styleGridBagConstraints(gbc);
>>>>>> + add(bar, gbc);
>>>>>> + }
>>>>>> +
>>>>>> ProgressPanel(URL url, String version) {
>>>>>> - JLabel location = new JLabel(" " + url.getHost() + "/" + url.getFile());
>>>>>> + this(" " + url.getHost() + "/" + url.getFile(),version);
>>>>>> + }
>>>>>> + ProgressPanel(String caption, String version) {
>>>>>> + JLabel location = new JLabel(caption);
>>>>>>
>>>>>> - bar.setMinimumSize(new Dimension(80, 15));
>>>>>> - bar.setPreferredSize(new Dimension(80, 15));
>>>>>> + bar.setMinimumSize(size);
>>>>>> + bar.setPreferredSize(size);
>>>>>> bar.setOpaque(false);
>>>>>>
>>>>>> setLayout(new GridBagLayout());
>>>>>> @@ -291,12 +406,8 @@
>>>>>> gbc.fill = GridBagConstraints.NONE;
>>>>>> gbc.gridwidth = GridBagConstraints.RELATIVE;
>>>>>> add(bar, gbc);
>>>>>> -
>>>>>> - gbc.insets = new Insets(0, 3, 0, 0);
>>>>>> - gbc.weightx = 1.0;
>>>>>> - gbc.fill = GridBagConstraints.HORIZONTAL;
>>>>>> - gbc.gridwidth = GridBagConstraints.REMAINDER;
>>>>>> - gbc.anchor = GridBagConstraints.WEST;
>>>>>> +
>>>>>> + styleGridBagConstraints(gbc);
>>>>>> add(location, gbc);
>>>>>> }
>>>>>>
>>>>>> @@ -325,6 +436,14 @@
>>>>>> g.fillRect(x + 1, y + 1, divide - 1, h - 1);
>>>>>> }
>>>>>> }
>>>>>> +
>>>>>> + private void styleGridBagConstraints(GridBagConstraints gbc) {
>>>>>> + gbc.insets = new Insets(0, 3, 0, 0);
>>>>>> + gbc.weightx = 1.0;
>>>>>> + gbc.fill = GridBagConstraints.HORIZONTAL;
>>>>>> + gbc.gridwidth = GridBagConstraints.REMAINDER;
>>>>>> + gbc.anchor = GridBagConstraints.WEST;
>>>>>> + }
>>>>>> };
>>>>>>
>>>>>> }
>>>>>
>>>>> Code looks OK nits aside.
>>>>
>>>> Thanx for nits. Should be fixed now
>>>>>
>>>>> As for button ... yes it is nasty. IMO maybe we can take different approach here. The people
>>>>> interested in how the individual jars are downloading would mainly be 1. us trying to fix jar
>>>>> loading issues, 2. developers looking into jar loading issues.
>>>>>
>>>>> So what if the ICEDTEAPLUGIN_DEBUG environment variable turned this on/off ? It can be argued
>>>>> it is
>>>>> a bit hard for developers to access, but it isn't any easier to access this information from
>>>>> oracle
>>>>> plugin.
>>>>
>>>> I think I don't like this idea :(
>>>
>>> No problem, but can you elaborate why not?
>>
>> When it took to long to downld application, I'm happy to see whats going on. Maybe I can spot some
>> 3rd party jar to be stuck and then I can ping them. And I definitely do not want to look for
>> environmetn variables.
>>>
>>>> I have added an attempt to use an icon, And I must say it is much better. Btw, I have created
>>>> this icon.. so no wonders here :) But looks quite cool :)
>>>
>>> It looks OK :-) The glass part could use some transparency.
>> blah :)
>>
>>> There should be a slightly different icon from going from detailed ->compact.
>> As you wish, however, I do not like the red cross I have added :(
>>
>>>
>>>>
>>>>>
>>>>> As well, I would be very happy to see the loading bar integrated with the splash screen (if splash
>>>>> screen is on). I believe this would nicely complement the user friendliness of the splash screen.
>>>>
>>>> You mean to sync progress on progress bar with the one in splash? Or also showing the downlaoded
>>>> resources somehow and show details button in splash?
>>>
>>> I was thinking always have progress bar on splash, and have detailed view hide/show the download
>>> bars in corner. IMO this is good for now, except:
>> I agree. It can came in some future.
>>
>>> 1. visual glitches such as http://i.imgur.com/Oveuh.png (with text flickering from middle to top
>>> every frame). As well on dual monitors expanding/compacting view constantly changed screens for me.
>> Well I was not able to reproduce today :-/
>> However I have changed the implementation and So I hope that it will behave better in your
>> configuration.
>>
>> Please note, now this patch is depending on [rfc][icedtea-web] centre of dialogues to centre of
>> active monitor.
>> Sorry for inconvenience here:(
>>
>>> 2. A different style button/icon from going detailed->compact.
>>
>> How different? (in context of this patch/in global)?
>
> Just a different icon, like you added.
>
> patch:
>> diff -r 02981a272327 netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java
>> --- a/netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java  Mon Jan 07 11:47:32 2013 -0500
>> +++ b/netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java  Tue Jan 08 15:26:23 2013 +0100
>> @@ -29,6 +29,7 @@
>>
>>  import net.sourceforge.jnlp.runtime.*;
>>  import net.sourceforge.jnlp.util.ImageResources;
>> +import net.sourceforge.jnlp.util.ScreenFinder;
>>
>>  /**
>>   * Show the progress of downloads.
>> @@ -62,6 +63,7 @@
>>
>>      /** shared constraint */
>>      static GridBagConstraints vertical;
>> +    static GridBagConstraints verticalNoClean;
>>      static GridBagConstraints verticalIndent;
>>      static {
>>          vertical = new GridBagConstraints();
>> @@ -70,6 +72,9 @@
>>          vertical.fill = GridBagConstraints.HORIZONTAL;
>>          vertical.anchor = GridBagConstraints.WEST;
>>
>> +        verticalNoClean = new GridBagConstraints();
>> +        verticalNoClean.weightx = 1.0;
>> +
>>          verticalIndent = (GridBagConstraints) vertical.clone();
>>          verticalIndent.insets = new Insets(0, 10, 3, 0);
>>      }
>> @@ -101,9 +106,7 @@
>>
>>          synchronized (frameMutex) {
>>              if (frame == null) {
>> -                frame = new JFrame(downloading + "...");
>> - frame.setIconImages(ImageResources.INSTANCE.getApplicationImages());
>> -                frame.getContentPane().setLayout(new GridBagLayout());
>> +                frame=createDownloadIndicatorFrame(true);
>>              }
>>
>>              if (resources != null) {
>> @@ -114,15 +117,13 @@
>>
>>              frame.getContentPane().add(result, vertical);
>>              frame.pack();
>> -
>> -            if (!frame.isVisible()) {
>> -                Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
>> -                Insets insets =
>> Toolkit.getDefaultToolkit().getScreenInsets(frame.getGraphicsConfiguration());
>> -                Dimension screen = new Dimension(screenSize.width - insets.left,
>> -                        screenSize.height - insets.top);
>> -                frame.setLocation(screen.width - frame.getWidth(),
>> -                        screen.height - frame.getHeight());
>> -            }
>> +            placeFrameToLowerRight();
>> +            result.addComponentListener(new ComponentAdapter() {
>> +                @Override
>> +                public void componentResized(ComponentEvent e) {
>> +                    placeFrameToLowerRight();
>> +                }
>> +            });
>>
>>              frame.setVisible(true);
>>
>> @@ -130,6 +131,23 @@
>>          }
>>      }
>>
>> +     public static JFrame createDownloadIndicatorFrame(boolean undecorated) throws
>> HeadlessException {
>> +        JFrame f = new JFrame(downloading + "...");
>> +        f.setUndecorated(undecorated);
>> + f.setIconImages(ImageResources.INSTANCE.getApplicationImages());
>> +        f.getContentPane().setLayout(new GridBagLayout());
>> +        return f;
>> +    }
>> +
>> +    /**
>> +     * This places indicator to lower rigt corner of active monitor.
>
> s/rigt/right/
>
>> +     */
>> +    private static void placeFrameToLowerRight() throws HeadlessException {
>> +       Rectangle bounds = ScreenFinder.getCurrentScreenSizeWithoutBounds();
>> +        frame.setLocation(bounds.width+bounds.x - frame.getWidth(),
>> +                bounds.height+bounds.y - frame.getHeight());
>> +    }
>> +
>>      /**
>>       * Remove a download service listener that was obtained by
>>       * calling the getDownloadListener method from the shared
>> @@ -163,13 +181,31 @@
>>       * Groups the url progress in a panel.
>>       */
>>      static class DownloadPanel extends JPanel implements DownloadServiceListener {
>> +        private final DownloadPanel self;
>>
>> +        private static enum States{
>> +            ONE_JAR, COLLAPSED, DETAILED;
>> +         }
>> +
>> +        private static final String DETAILS=R("ButShowDetails");
>> +        private static final String HIDE_DETAILS=R("ButHideDetails");
>>          /** the download name */
>>          private String downloadName;
>> -
>>          /** Downloading part: */
>>          private JLabel header = new JLabel();
>> -
>> +        /** Show/hide detailsButton button: */
>> +        private final JButton detailsButton;
>> +        private static final URL magnifyGlassUrl =
>> ClassLoader.getSystemResource("net/sourceforge/jnlp/resources/magnifyGlass-small.png");
>> +        private static final URL redCrossUrl =
>> ClassLoader.getSystemResource("net/sourceforge/jnlp/resources/redCross-small.png");
>> +        private static final Icon magnifyGlassIcon = new ImageIcon(magnifyGlassUrl);
>> +        private static final Icon redCrossIcon = new ImageIcon(redCrossUrl);
>> +        /** used  instead of detailsButton button in case of one jar*/
>> +        private JLabel delimiter = new JLabel("");
>> +        /** all already created progress bars*/
>> +        private List<ProgressPanel> progressPanels = new ArrayList<ProgressPanel>();
>> +        private States state=States.ONE_JAR;
>> +        private ProgressPanel mainProgressPanel;
>> +
>>          /** list of URLs being downloaded */
>>          private List<URL> urls = new ArrayList<URL>();
>>
>> @@ -181,12 +217,52 @@
>>           * name.
>>           */
>>          protected DownloadPanel(String downloadName) {
>> +            self = this;
>>              setLayout(new GridBagLayout());
>> +            this.downloadName = downloadName;
>> +            this.add(header, verticalNoClean);
>> + header.setFont(header.getFont().deriveFont(Font.BOLD));
>> +            this.add(delimiter, vertical);
>> +            detailsButton = new JButton(magnifyGlassIcon);
>> +            int w = magnifyGlassIcon.getIconWidth();
>> +            int h = magnifyGlassIcon.getIconHeight();
>> +            detailsButton.setPreferredSize(new Dimension(w + 2, h + 2));
>> +            detailsButton.addActionListener(new ActionListener() {
>> +                @Override
>> +                public void actionPerformed(ActionEvent e) {
>> +                    if (state == States.DETAILED) {
>> +                        state = States.COLLAPSED;
>> +                        detailsButton.setToolTipText(DETAILS);
>> +                        detailsButton.setIcon(magnifyGlassIcon);
>> +                        for (ProgressPanel progressPanel : progressPanels) {
>> +                            remove(progressPanel);
>> +                        }
>> +                        add(mainProgressPanel, verticalIndent);
>> +                        recreateFrame(true);
>> +                    } else {
>> +                        state = States.DETAILED;
>> + detailsButton.setToolTipText(HIDE_DETAILS);
>> +                        detailsButton.setIcon(redCrossIcon);
>> +                        remove(mainProgressPanel);
>> +                        for (ProgressPanel progressPanel : progressPanels) {
>> +                            add(progressPanel, verticalIndent);
>> +                        }
>> +                        recreateFrame(false);
>> +                    }
>> +                }
>>
>> -            this.downloadName = downloadName;
>> -            this.add(header, vertical);
>> - header.setFont(header.getFont().deriveFont(Font.BOLD));
>> -
>> +                public void recreateFrame(boolean undecorated) throws HeadlessException {
>> +                    JFrame oldFrame = frame;
>> +                    frame = createDownloadIndicatorFrame(undecorated);
>> +                    frame.getContentPane().add(self, vertical);
>> +                    synchronized (frameMutex) {
>> +                        frame.pack();
>> +                        placeFrameToLowerRight();
>> +                    }
>> +                    frame.setVisible(true);
>> +                    oldFrame.dispose();
>> +                }
>> +            });
>>              setOverallPercent(0);
>>          }
>>
>> @@ -196,14 +272,31 @@
>>          protected void addProgressPanel(URL url, String version) {
>>              if (!urls.contains(url)) {
>>                  ProgressPanel panel = new ProgressPanel(url, version);
>> -
>> -                add(panel, verticalIndent);
>> +                if (state != States.COLLAPSED) {
>> +                    add(panel, verticalIndent);
>> +                }
>> +                progressPanels.add(panel);
>> +                urls.add(url);
>> +                panels.add(panel);
>> +                //download indicator does not know about added jars
>> +                //When just one is added then it behaves as was costumed (and no show detail button)
>
> Sorry, I do not understand this last sentence (at least not the way its worded).
>
>> +                //when secoond one is added, then it already knows that there will
>
> s/secoond/second/
>
>> +                //be two or more jars, so it swap to collapsed state in count of two.
>> +                //no later, no sooner
>> +                if (panels.size() == 2){
>> +                    remove(panels.get(0));
>> +                    remove(panels.get(1));
>> +                    remove(delimiter);
>> +                    add(detailsButton,vertical);
>> +                    mainProgressPanel=new ProgressPanel();
>> +                    add(mainProgressPanel, verticalIndent);
>> +                    state=States.COLLAPSED;
>> +                }
>>                  synchronized (frameMutex) {
>>                      frame.pack();
>> +                    placeFrameToLowerRight();
>>                  }
>>
>> -                urls.add(url);
>> -                panels.add(panel);
>>              }
>>          }
>>
>> @@ -219,10 +312,10 @@
>>                          addProgressPanel(url, version);
>>
>>                      setOverallPercent(overallPercent);
>> -
>>                      ProgressPanel panel = panels.get(urls.indexOf(url));
>>                      panel.setProgress(readSoFar, total);
>>                      panel.repaint();
>> +
>>                  }
>>              };
>>              SwingUtilities.invokeLater(r);
>> @@ -230,12 +323,27 @@
>>
>>          /**
>>           * Sets the overall percent completed.
>> +         * should be called via invokeLater
>>           */
>>          public void setOverallPercent(int percent) {
>>              // don't get whole string from resource and sub in
>>              // values because it'll be doing a MessageFormat for
>>              // each update.
>>              header.setText(downloading + " " + downloadName + ": " + percent + "% " + complete +
>> ".");
>> +            Container c = header.getParent();
>> +            //we need to adapt both panels and also frame to new length of header text
>> +            while (c != null) {
>> +                c.invalidate();
>> +                c.validate();
>> +                if (c instanceof  Window){
>> +                    ((Window) c).pack();
>> +                }
>> +                c=c.getParent();
>> +            }
>> +            if (mainProgressPanel != null) {
>> +                mainProgressPanel.setProgress(percent, 100);
>> +                mainProgressPanel.repaint();
>> +            }
>>          }
>>
>>          /**
>> @@ -276,12 +384,28 @@
>>
>>          private long total;
>>          private long readSoFar;
>> +        private Dimension size = new Dimension(80, 15);
>>
>> +        ProgressPanel() {
>> +            bar.setMinimumSize(size);
>> +            bar.setPreferredSize(size);
>> +            bar.setOpaque(false);
>> +
>> +            setLayout(new GridBagLayout());
>> +
>> +            GridBagConstraints gbc = new GridBagConstraints();
>> +            styleGridBagConstraints(gbc);
>> +            add(bar, gbc);
>> +        }
>> +
>>          ProgressPanel(URL url, String version) {
>> -            JLabel location = new JLabel(" " + url.getHost() + "/" + url.getFile());
>> +            this(" " + url.getHost() + "/" + url.getFile(),version);
>> +        }
>> +        ProgressPanel(String caption, String version) {
>> +            JLabel location = new JLabel(caption);
>>
>> -            bar.setMinimumSize(new Dimension(80, 15));
>> -            bar.setPreferredSize(new Dimension(80, 15));
>> +            bar.setMinimumSize(size);
>> +            bar.setPreferredSize(size);
>>              bar.setOpaque(false);
>>
>>              setLayout(new GridBagLayout());
>> @@ -291,12 +415,8 @@
>>              gbc.fill = GridBagConstraints.NONE;
>>              gbc.gridwidth = GridBagConstraints.RELATIVE;
>>              add(bar, gbc);
>> -
>> -            gbc.insets = new Insets(0, 3, 0, 0);
>> -            gbc.weightx = 1.0;
>> -            gbc.fill = GridBagConstraints.HORIZONTAL;
>> -            gbc.gridwidth = GridBagConstraints.REMAINDER;
>> -            gbc.anchor = GridBagConstraints.WEST;
>> +
>> +            styleGridBagConstraints(gbc);
>>              add(location, gbc);
>>          }
>>
>> @@ -325,6 +445,14 @@
>>                  g.fillRect(x + 1, y + 1, divide - 1, h - 1);
>>              }
>>          }
>> +
>> +        private void styleGridBagConstraints(GridBagConstraints gbc) {
>> +            gbc.insets = new Insets(0, 3, 0, 0);
>> +            gbc.weightx = 1.0;
>> +            gbc.fill = GridBagConstraints.HORIZONTAL;
>> +            gbc.gridwidth = GridBagConstraints.REMAINDER;
>> +            gbc.anchor = GridBagConstraints.WEST;
>> +        }
>>      };
>>
>>  }
>
> Attached are two alternate icons. They are from here http://opengameart.org/content/forum-controls
> and are in the public domain.

ok.. I dont like the aluminium magnify glass :)

I was thinking about some simple + and - also - you can see how it resulted at "*2.png versions" not 
nice:(

then I took  your arrow idea and I think the result is pretty nice.

What do you think now?

(just note, smaller arrow and bigger arrow are intentional:)
>
> The magnifying glass can go compact->detailed, and the left&up arrow can go detailed->compact. Maybe
> get rid of the surrounding buttons as well (or make them more subtle) ?

What do you mean?
>

Patch with updated names of icons and fixed typos attached.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: showDownloadDetails.png
Type: image/png
Size: 860 bytes
Desc: not available
Url : http://mail.openjdk.java.net/pipermail/distro-pkg-dev/attachments/20130110/a5999764/showDownloadDetails.png 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: hideDownloadDetails.png
Type: image/png
Size: 862 bytes
Desc: not available
Url : http://mail.openjdk.java.net/pipermail/distro-pkg-dev/attachments/20130110/a5999764/hideDownloadDetails.png 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: magnifyGlass-small2.png
Type: image/png
Size: 1193 bytes
Desc: not available
Url : http://mail.openjdk.java.net/pipermail/distro-pkg-dev/attachments/20130110/a5999764/magnifyGlass-small2.png 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: redCross-small2.png
Type: image/png
Size: 1027 bytes
Desc: not available
Url : http://mail.openjdk.java.net/pipermail/distro-pkg-dev/attachments/20130110/a5999764/redCross-small2.png 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cmpactDownloadIndicator2.patch
Type: text/x-patch
Size: 12564 bytes
Desc: not available
Url : http://mail.openjdk.java.net/pipermail/distro-pkg-dev/attachments/20130110/a5999764/cmpactDownloadIndicator2.patch 


More information about the distro-pkg-dev mailing list