diff --git a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/AbstractArchiveDlg.java b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/AbstractArchiveDlg.java index c9784a1dd8..1d3f0df3ef 100644 --- a/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/AbstractArchiveDlg.java +++ b/cave/com.raytheon.uf.viz.archive/src/com/raytheon/uf/viz/archive/ui/AbstractArchiveDlg.java @@ -24,6 +24,7 @@ import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; @@ -32,7 +33,6 @@ import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; @@ -96,10 +96,19 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements */ protected boolean setSelect = false; + /** + * Must be set by sub-class prior to creating table. + */ protected TableType tableType; + /** + * Job that computes sizes of table row entries off the UI thread. + */ protected final SizeJob sizeJob = new SizeJob(); + /** Keeps track of when it is safe to clear the busy cursor. */ + protected final AtomicInteger busyCnt = new AtomicInteger(0); + /** * @param parentShell */ @@ -270,15 +279,27 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements Job job = new Job("setup") { @Override protected IStatus run(IProgressMonitor monitor) { - initInfo(); - VizApp.runAsync(new Runnable() { + ArchiveConfigManager.getInstance().reset(); + if (!shell.isDisposed()) { + VizApp.runAsync(new Runnable() { - @Override - public void run() { - populateComboBoxes(); - updateTableComp(); - } - }); + @Override + public void run() { + populateComboBoxes(); + setCursorBusy(false); + } + }); + } + initDisplayData(); + if (!shell.isDisposed()) { + VizApp.runAsync(new Runnable() { + + @Override + public void run() { + updateTableComp(); + } + }); + } return Status.OK_STATUS; } }; @@ -360,12 +381,11 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements } /** - * Get information from manager for populating combo boxes and set up to get - * selected entries sizes. Intended for use on a non-UI thread. + * Set up all display data and queue getting sizes for any that are + * selected. */ - private void initInfo() { + private void initDisplayData() { ArchiveConfigManager manager = ArchiveConfigManager.getInstance(); - manager.reset(); Calendar startCal = getStart(); Calendar endCal = getEnd(); String[] archiveNames = manager.getArchiveDataNamesList(); @@ -401,18 +421,32 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements Calendar endCal = getEnd(); setCursorBusy(true); - sizeJob.clearQueue(); - ArchiveInfo archiveInfo = archiveInfoMap.get(archiveName); - CategoryInfo categoryInfo = archiveInfo.get(categoryName); + try { + sizeJob.clearQueue(); - for (DisplayData displayData : categoryInfo.getDisplayDataList()) { - sizeJob.queue(new SizeJobRequest(displayData, startCal, endCal)); + ArchiveInfo archiveInfo = archiveInfoMap.get(archiveName); + + // Not yet populated by background job. + if (archiveInfo == null) { + return; + } + + // Not yet populated by background job. + CategoryInfo categoryInfo = archiveInfo.get(categoryName); + if (categoryInfo == null) { + return; + } + + for (DisplayData displayData : categoryInfo.getDisplayDataList()) { + sizeJob.queue(new SizeJobRequest(displayData, startCal, endCal)); + } + sizeJob.requeueSelected(startCal, endCal); + + tableComp.populateTable(categoryInfo.getDisplayDataList()); + } finally { + setCursorBusy(false); } - sizeJob.requeueSelected(startCal, endCal); - - tableComp.populateTable(categoryInfo.getDisplayDataList()); - setCursorBusy(false); } /** @@ -421,11 +455,12 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements * @param state */ protected void setCursorBusy(boolean state) { - Cursor cursor = null; if (state) { - cursor = shell.getDisplay().getSystemCursor(SWT.CURSOR_WAIT); + busyCnt.addAndGet(1); + shell.setCursor(shell.getDisplay().getSystemCursor(SWT.CURSOR_WAIT)); + } else if (busyCnt.addAndGet(-1) == 0) { + shell.setCursor(null); } - shell.setCursor(cursor); } /* diff --git a/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/ArchiveConfigManager.java b/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/ArchiveConfigManager.java index 7256175be2..b72ce5b1b0 100644 --- a/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/ArchiveConfigManager.java +++ b/edexOsgi/com.raytheon.uf.common.archive/src/com/raytheon/uf/common/archive/config/ArchiveConfigManager.java @@ -526,7 +526,7 @@ public class ArchiveConfigManager { } /** - * Get a list of directories matching the categories directory pattern that + * Get a list of directories matching the categories directory patterns that * are sub-directories of the archive's root directory. * * @param archiveConfig @@ -537,13 +537,15 @@ public class ArchiveConfigManager { CategoryConfig categoryConfig) { List resultDirs = new ArrayList(); File rootFile = new File(archiveConfig.getRootDir()); + List dirs = new ArrayList(); + List tmpDirs = new ArrayList(); + List swpDirs = null; for (String dirPattern : categoryConfig.getDirPatternList()) { String[] subExpr = dirPattern.split(File.separator); - List dirs = new ArrayList(); + dirs.clear(); dirs.add(rootFile); - List tmpDirs = new ArrayList(); - List swpDirs = null; + tmpDirs.clear(); for (String regex : subExpr) { Pattern subPattern = Pattern.compile("^" + regex + "$"); @@ -582,6 +584,18 @@ public class ArchiveConfigManager { return getDisplayData(archiveName, categoryName, false); } + /** + * Get the Display labels matching the pattern for the archive data's + * category. Assumes the archive data's root directory is the mount point to + * start the search. + * + * @param archiveName + * @param categoryName + * @param setSelect + * - when true set the displayData selection base on category's + * selection list + * @return displayDataList + */ public List getDisplayData(String archiveName, String categoryName, boolean setSelect) { Map> displayMap = new HashMap>(); @@ -635,7 +649,8 @@ public class ArchiveConfigManager { } } - List displayInfoList = new ArrayList(); + List displayDataList = new ArrayList( + displays.size()); for (String displayLabel : displays) { DisplayData displayData = new DisplayData(archiveConfig, @@ -644,10 +659,10 @@ public class ArchiveConfigManager { displayData.setSelected(categoryConfig .getSelectedDisplayNames().contains(displayLabel)); } - displayInfoList.add(displayData); + displayDataList.add(displayData); } - return displayInfoList; + return displayDataList; } /**