Index: progress/api/doc/changes/apichanges.xml =================================================================== RCS file: /cvs/core/progress/api/doc/changes/apichanges.xml,v retrieving revision 1.8 diff -u -r1.8 apichanges.xml --- progress/api/doc/changes/apichanges.xml 28 Jul 2006 11:32:41 -0000 1.8 +++ progress/api/doc/changes/apichanges.xml 2 Aug 2006 10:33:25 -0000 @@ -84,7 +84,25 @@ - Split APi and implementation of progress compoennt + Add methods to create main/detail labels for an custom placed progress component. + + + + + +

Adding createMainLabelComponent(ProgressHandle) and + createDetailLabelComponent(ProgressHandle) to ProgressHandleFactory, AggregateProgressHandleFactory classes. + These are complimentary to the extractProgressComponent(ProgressHandle) method and allow to + externalize the display of task's display name and detail messages when embedded in custom UI components. +

+
+ + + +
+ + + Split API and implementation of progress component Index: progress/src/org/netbeans/api/progress/ProgressHandle.java =================================================================== RCS file: /cvs/core/progress/src/org/netbeans/api/progress/ProgressHandle.java,v retrieving revision 1.7 diff -u -r1.7 ProgressHandle.java --- progress/src/org/netbeans/api/progress/ProgressHandle.java 28 Jul 2006 11:32:41 -0000 1.7 +++ progress/src/org/netbeans/api/progress/ProgressHandle.java 2 Aug 2006 10:33:25 -0000 @@ -25,6 +25,7 @@ import java.util.Collections; import java.util.List; import javax.swing.JComponent; +import javax.swing.JLabel; import javax.swing.JProgressBar; import org.netbeans.progress.spi.InternalHandle; @@ -148,7 +149,7 @@ /** * change the display name of the progress task. Use with care, please make sure the changed name is not completely different, * or otherwise it might appear to the user as a different task. - * @since 1.5 + * @since org.netbeans.api.progress 1.5 */ public void setDisplayName(String newDisplayName) { internal.requestDisplayNameChange(newDisplayName); @@ -167,6 +168,14 @@ */ InternalHandle getInternalHandle() { return internal; + } + + JLabel extractDetailLabel() { + return internal.extractDetailLabel(); + } + + JLabel extractMainLabel() { + return internal.extractMainLabel(); } Index: progress/src/org/netbeans/api/progress/ProgressHandleFactory.java =================================================================== RCS file: /cvs/core/progress/src/org/netbeans/api/progress/ProgressHandleFactory.java,v retrieving revision 1.3 diff -u -r1.3 ProgressHandleFactory.java --- progress/src/org/netbeans/api/progress/ProgressHandleFactory.java 28 Jul 2006 11:32:42 -0000 1.3 +++ progress/src/org/netbeans/api/progress/ProgressHandleFactory.java 2 Aug 2006 10:33:25 -0000 @@ -21,6 +21,7 @@ import javax.swing.Action; import javax.swing.JComponent; +import javax.swing.JLabel; import org.netbeans.progress.spi.InternalHandle; import org.openide.util.Cancellable; @@ -91,6 +92,26 @@ */ public static JComponent createProgressComponent(ProgressHandle handle) { return handle.extractComponent(); + } + + /** + * Get the task title component for use in custom dialogs, the task won't + * show in the progress bar anymore. The text of the label is changed by calls to ProgressHandle.setDisplayName() method + * @return the component to use in custom UI. + * @since org.netbeans.api.progress 1.8 + */ + public static JLabel createMainLabelComponent(ProgressHandle handle) { + return handle.extractMainLabel(); + } + + /** + * Get the detail messages component for use in custom dialogs, the task won't + * show in the progress bar anymore. The text of the label is changed by calls to ProgressHandle.progress(String) method. + * @return the component to use in custom UI. + * @since org.netbeans.api.progress 1.8 + */ + public static JLabel createDetailLabelComponent(ProgressHandle handle) { + return handle.extractDetailLabel(); } /** Index: progress/src/org/netbeans/api/progress/aggregate/AggregateProgressFactory.java =================================================================== RCS file: /cvs/core/progress/src/org/netbeans/api/progress/aggregate/AggregateProgressFactory.java,v retrieving revision 1.6 diff -u -r1.6 AggregateProgressFactory.java --- progress/src/org/netbeans/api/progress/aggregate/AggregateProgressFactory.java 28 Jul 2006 11:32:42 -0000 1.6 +++ progress/src/org/netbeans/api/progress/aggregate/AggregateProgressFactory.java 2 Aug 2006 10:33:25 -0000 @@ -21,7 +21,8 @@ import javax.swing.Action; import javax.swing.JComponent; -import org.netbeans.progress.spi.InternalHandle; +import javax.swing.JLabel; +import org.netbeans.api.progress.ProgressHandle; import org.openide.util.Cancellable; /** @@ -77,11 +78,31 @@ /** * Get the progress bar component for use in custom dialogs, the task won't * show in the progress bar anymore. - * @since 1.3 + * @since org.netbeans.api.progress 1.3 * @return the component to use in custom UI. */ public static JComponent createProgressComponent(AggregateProgressHandle handle) { return handle.extractComponent(); } + + /** + * Get the task title component for use in custom dialogs, the task won't + * show in the progress bar anymore. The text of the label is changed by calls to handle's setDisplayName() method. + * @return the component to use in custom UI. + * @since org.netbeans.api.progress 1.8 + */ + public static JLabel createMainLabelComponent(AggregateProgressHandle handle) { + return handle.extractMainLabel(); + } + + /** + * Get the detail messages component for use in custom dialogs, the task won't + * show in the progress bar anymore.The text of the label is changed by calls to contributors' progress(String) methods. + * @return the component to use in custom UI. + * @since org.netbeans.api.progress 1.8 + */ + public static JLabel createDetailLabelComponent(AggregateProgressHandle handle) { + return handle.extractDetailLabel(); + } } Index: progress/src/org/netbeans/api/progress/aggregate/AggregateProgressHandle.java =================================================================== RCS file: /cvs/core/progress/src/org/netbeans/api/progress/aggregate/AggregateProgressHandle.java,v retrieving revision 1.8 diff -u -r1.8 AggregateProgressHandle.java --- progress/src/org/netbeans/api/progress/aggregate/AggregateProgressHandle.java 1 Jul 2006 08:52:11 -0000 1.8 +++ progress/src/org/netbeans/api/progress/aggregate/AggregateProgressHandle.java 2 Aug 2006 10:33:26 -0000 @@ -24,6 +24,7 @@ import java.util.Iterator; import javax.swing.Action; import javax.swing.JComponent; +import javax.swing.JLabel; import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; import org.openide.util.Cancellable; @@ -226,4 +227,12 @@ JComponent extractComponent() { return ProgressHandleFactory.createProgressComponent(handle); } + + JLabel extractDetailLabel() { + return ProgressHandleFactory.createDetailLabelComponent(handle); + } + + JLabel extractMainLabel() { + return ProgressHandleFactory.createMainLabelComponent(handle); + } } Index: progress/src/org/netbeans/progress/module/Controller.java =================================================================== RCS file: /cvs/core/progress/src/org/netbeans/progress/module/Controller.java,v retrieving revision 1.18 diff -u -r1.18 Controller.java --- progress/src/org/netbeans/progress/module/Controller.java 28 Jul 2006 11:32:42 -0000 1.18 +++ progress/src/org/netbeans/progress/module/Controller.java 2 Aug 2006 10:33:26 -0000 @@ -86,6 +86,7 @@ return defaultInstance; } + // to be called on the default instance only.. Component getVisualComponent() { if (component instanceof Component) { return (Component)component; Index: progress/src/org/netbeans/progress/spi/ExtractedProgressUIWorker.java =================================================================== RCS file: progress/src/org/netbeans/progress/spi/ExtractedProgressUIWorker.java diff -N progress/src/org/netbeans/progress/spi/ExtractedProgressUIWorker.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ progress/src/org/netbeans/progress/spi/ExtractedProgressUIWorker.java 2 Aug 2006 10:33:26 -0000 @@ -0,0 +1,34 @@ +/* + * The contents of this file are subject to the terms of the Common Development + * and Distribution License (the License). You may not use this file except in + * compliance with the License. + * + * You can obtain a copy of the License at http://www.netbeans.org/cddl.html + * or http://www.netbeans.org/cddl.txt. + * + * When distributing Covered Code, include this CDDL Header Notice in each file + * and include the License file at http://www.netbeans.org/cddl.txt. + * If applicable, add the following below the CDDL Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Sun Microsystems, Inc. Portions Copyright 2006 Sun + * Microsystems, Inc. All Rights Reserved. + */ + +package org.netbeans.progress.spi; + +import javax.swing.JComponent; +import javax.swing.JLabel; + +/** + * + * @author mkleint + */ +public interface ExtractedProgressUIWorker extends ProgressUIWorker { + + JComponent getProgressComponent(); + JLabel getMainLabelComponent(); + JLabel getDetailLabelComponent(); +} Index: progress/src/org/netbeans/progress/spi/InternalHandle.java =================================================================== RCS file: /cvs/core/progress/src/org/netbeans/progress/spi/InternalHandle.java,v retrieving revision 1.1 diff -u -r1.1 InternalHandle.java --- progress/src/org/netbeans/progress/spi/InternalHandle.java 28 Jul 2006 11:32:45 -0000 1.1 +++ progress/src/org/netbeans/progress/spi/InternalHandle.java 2 Aug 2006 10:33:26 -0000 @@ -29,6 +29,7 @@ import java.util.logging.Logger; import javax.swing.Action; import javax.swing.JComponent; +import javax.swing.JLabel; import javax.swing.JProgressBar; import javax.swing.SwingUtilities; import org.netbeans.progress.module.*; @@ -45,7 +46,9 @@ private String displayName; private boolean allowCancel; private boolean allowBackground; - private boolean customPlaced = false; + private boolean customPlaced1 = false; + private boolean customPlaced2 = false; + private boolean customPlaced3 = false; private int state; private int totalUnits; private int currentUnit; @@ -58,6 +61,7 @@ private final boolean userInitiated; private int initialDelay = Controller.INITIAL_DELAY; private Controller controller; + private ExtractedProgressUIWorker component; public static final int STATE_INITIALIZED = 0; public static final int STATE_RUNNING = 1; @@ -103,7 +107,7 @@ public boolean isCustomPlaced() { - return customPlaced; + return component != null; } public boolean isUserInitialized() { @@ -180,7 +184,7 @@ timeStarted = System.currentTimeMillis(); timeLastProgress = timeStarted; - if (! customPlaced) { + if (controller == null) { controller = Controller.getDefault(); } @@ -294,25 +298,53 @@ (initialEstimate == -1 ? -1 : calculateFinishEstimate())); } + private void createExtractedWorker() { + if (component == null) { + ProgressUIWorkerProvider prov = (ProgressUIWorkerProvider)Lookup.getDefault().lookup(ProgressUIWorkerProvider.class); + assert prov != null; + component = prov.getExtractedComponentWorker(); + controller = new Controller(component); + } + } /** * have the component in custom location, don't include in the status bar. */ public synchronized JComponent extractComponent() { - if (customPlaced) { + if (customPlaced1) { throw new IllegalStateException("Cannot retrieve progress component multiple times"); } if (state != STATE_INITIALIZED) { throw new IllegalStateException("You can request custom placement of progress component only before starting the task"); } - customPlaced = true; - ProgressUIWorkerProvider prov = (ProgressUIWorkerProvider)Lookup.getDefault().lookup(ProgressUIWorkerProvider.class); - assert prov != null; - ProgressUIWorker component = prov.getExtractedComponentWorker(); - controller = new Controller(component); - return (JComponent)component; + customPlaced1 = true; + createExtractedWorker(); + return component.getProgressComponent(); } - + public JLabel extractDetailLabel() { + if (customPlaced2) { + throw new IllegalStateException("Cannot retrieve progress detail label component multiple times"); + } + if (state != STATE_INITIALIZED) { + throw new IllegalStateException("You can request custom placement of progress component only before starting the task"); + } + customPlaced2 = true; + createExtractedWorker(); + return component.getDetailLabelComponent(); + } + + public JLabel extractMainLabel() { + if (customPlaced3) { + throw new IllegalStateException("Cannot retrieve progress main label component multiple times"); + } + if (state != STATE_INITIALIZED) { + throw new IllegalStateException("You can request custom placement of progress component only before starting the task"); + } + customPlaced3 = true; + createExtractedWorker(); + return component.getMainLabelComponent(); + } + long calculateFinishEstimate() { // we are interested in seconds only Index: progress/src/org/netbeans/progress/spi/ProgressUIWorkerProvider.java =================================================================== RCS file: /cvs/core/progress/src/org/netbeans/progress/spi/ProgressUIWorkerProvider.java,v retrieving revision 1.1 diff -u -r1.1 ProgressUIWorkerProvider.java --- progress/src/org/netbeans/progress/spi/ProgressUIWorkerProvider.java 28 Jul 2006 11:32:45 -0000 1.1 +++ progress/src/org/netbeans/progress/spi/ProgressUIWorkerProvider.java 2 Aug 2006 10:33:26 -0000 @@ -27,5 +27,5 @@ public ProgressUIWorkerWithModel getDefaultWorker(); - public ProgressUIWorker getExtractedComponentWorker(); + public ExtractedProgressUIWorker getExtractedComponentWorker(); } Index: progress/test/unit/src/org/netbeans/api/progress/ProgressHandleTest.java =================================================================== RCS file: /cvs/core/progress/test/unit/src/org/netbeans/api/progress/ProgressHandleTest.java,v retrieving revision 1.9 diff -u -r1.9 ProgressHandleTest.java --- progress/test/unit/src/org/netbeans/api/progress/ProgressHandleTest.java 28 Jul 2006 11:32:46 -0000 1.9 +++ progress/test/unit/src/org/netbeans/api/progress/ProgressHandleTest.java 2 Aug 2006 10:33:27 -0000 @@ -22,6 +22,7 @@ import java.lang.reflect.Method; import javax.swing.JComponent; import javax.swing.JFrame; +import javax.swing.JLabel; import javax.swing.SwingUtilities; import org.netbeans.junit.NbTestCase; import org.netbeans.progress.module.Controller; @@ -115,6 +116,13 @@ assertFalse(handle.isCustomPlaced()); JComponent comp = ProgressHandleFactory.createProgressComponent(proghandle); assertTrue(handle.isCustomPlaced()); + JLabel main = ProgressHandleFactory.createMainLabelComponent(proghandle); + assertTrue(handle.isCustomPlaced()); + assertNotNull(main); + JLabel detail = ProgressHandleFactory.createDetailLabelComponent(proghandle); + assertTrue(handle.isCustomPlaced()); + assertNotNull(detail); + boolean ok = false; try { // cannot get the custom component multiple times.. @@ -125,6 +133,28 @@ assertTrue(ok); } + + /** + * Test of custom placed labels of class org.netbeans.progress.api.ProgressHandle. + */ + public void testCustomPlacedLabels() { + assertFalse(handle.isCustomPlaced()); + JComponent comp = ProgressHandleFactory.createProgressComponent(proghandle); + JLabel main = ProgressHandleFactory.createMainLabelComponent(proghandle); + JLabel detail = ProgressHandleFactory.createDetailLabelComponent(proghandle); + proghandle.start(); + proghandle.setDisplayName("test1"); + proghandle.progress("message1"); + // kind of bad to have the wait here to overcome the scheduling.. + try { + Thread.sleep(300); + } catch (InterruptedException exc) { + System.out.println("interrupted"); + } + assertEquals("test1", main.getText()); + assertEquals("message1", detail.getText()); + } + // tasks shorter than the InternalHandle.INITIAL_DELAY should be discarded. public void testIfShortOnesGetDiscarded() throws Exception { Index: progressui/src/org/netbeans/modules/progress/ui/NbProgressBar.java =================================================================== RCS file: /cvs/core/progressui/src/org/netbeans/modules/progress/ui/NbProgressBar.java,v retrieving revision 1.1 diff -u -r1.1 NbProgressBar.java --- progressui/src/org/netbeans/modules/progress/ui/NbProgressBar.java 28 Jul 2006 11:32:48 -0000 1.1 +++ progressui/src/org/netbeans/modules/progress/ui/NbProgressBar.java 2 Aug 2006 10:33:27 -0000 @@ -21,8 +21,11 @@ import java.awt.Color; import java.awt.Dimension; +import javax.swing.JComponent; +import javax.swing.JLabel; import javax.swing.JProgressBar; import javax.swing.UIManager; +import org.netbeans.progress.spi.ExtractedProgressUIWorker; import org.netbeans.progress.spi.InternalHandle; import org.netbeans.progress.spi.ProgressUIWorker; import org.netbeans.progress.spi.ProgressEvent; @@ -33,9 +36,12 @@ * @author mkleint */ -public class NbProgressBar extends JProgressBar implements ProgressUIWorker { +public class NbProgressBar extends JProgressBar implements ExtractedProgressUIWorker { boolean isSetup = false; boolean usedInStatusBar = false; + //TODO these two ought to be created only when the the bar is used externally.. + private JLabel detailLabel = new JLabel(); + private JLabel mainLabel = new JLabel(); /** Creates a new instance of NbProgressBar */ public NbProgressBar() { @@ -72,6 +78,7 @@ public void processProgressEvent(ProgressEvent event) { if (event.getType() == ProgressEvent.TYPE_START || !isSetup || event.isSwitched()) { setupBar(event.getSource(), this); + mainLabel.setText(event.getSource().getDisplayName()); isSetup = true; } if (event.getType() == ProgressEvent.TYPE_PROGRESS) { @@ -79,6 +86,13 @@ setValue(event.getWorkunitsDone()); } setString(StatusLineComponent.getBarString(event.getPercentageDone(), event.getEstimatedCompletion())); + if (event.getDisplayName() != null) { + mainLabel.setText(event.getDisplayName()); + } + if (event.getMessage() != null) { + detailLabel.setText(event.getMessage()); + } + } else if (event.getType() == ProgressEvent.TYPE_FINISH) { boolean wasIndetermenite = isIndeterminate(); setIndeterminate(false); @@ -113,4 +127,16 @@ } bar.setString(" "); } + + public JComponent getProgressComponent() { + return this; + } + + public JLabel getMainLabelComponent() { + return mainLabel; + } + + public JLabel getDetailLabelComponent() { + return detailLabel; + } } Index: progressui/src/org/netbeans/modules/progress/ui/ProviderImpl.java =================================================================== RCS file: /cvs/core/progressui/src/org/netbeans/modules/progress/ui/ProviderImpl.java,v retrieving revision 1.1 diff -u -r1.1 ProviderImpl.java --- progressui/src/org/netbeans/modules/progress/ui/ProviderImpl.java 28 Jul 2006 11:32:49 -0000 1.1 +++ progressui/src/org/netbeans/modules/progress/ui/ProviderImpl.java 2 Aug 2006 10:33:27 -0000 @@ -19,6 +19,7 @@ package org.netbeans.modules.progress.ui; +import org.netbeans.progress.spi.ExtractedProgressUIWorker; import org.netbeans.progress.spi.ProgressUIWorker; import org.netbeans.progress.spi.ProgressUIWorkerProvider; import org.netbeans.progress.spi.ProgressUIWorkerWithModel; @@ -37,7 +38,7 @@ return new StatusLineComponent(); } - public ProgressUIWorker getExtractedComponentWorker() { + public ExtractedProgressUIWorker getExtractedComponentWorker() { return new NbProgressBar(); }