Issue #1966 Fix race conditiona and delay in populating GUIs combo/spinner entries also minor code clean up.

Change-Id: I4df5a5e4b1fb1e868ce9e8914116c2ae67c029c3

Former-commit-id: 3572d3b28e641446040ae8a6bc96a8770aea6ba5
This commit is contained in:
Roger Ferrel 2013-06-26 06:56:08 -05:00
parent 67d052307c
commit f66681f62b
2 changed files with 82 additions and 32 deletions

View file

@ -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();
ArchiveConfigManager.getInstance().reset();
if (!shell.isDisposed()) {
VizApp.runAsync(new Runnable() {
@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,10 +421,22 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements
Calendar endCal = getEnd();
setCursorBusy(true);
try {
sizeJob.clearQueue();
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));
@ -412,8 +444,10 @@ public abstract class AbstractArchiveDlg extends CaveSWTDialog implements
sizeJob.requeueSelected(startCal, endCal);
tableComp.populateTable(categoryInfo.getDisplayDataList());
} finally {
setCursorBusy(false);
}
}
/**
* Set the shells cursor to the desire state.
@ -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);
}
/*

View file

@ -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<File> resultDirs = new ArrayList<File>();
File rootFile = new File(archiveConfig.getRootDir());
List<File> dirs = new ArrayList<File>();
List<File> tmpDirs = new ArrayList<File>();
List<File> swpDirs = null;
for (String dirPattern : categoryConfig.getDirPatternList()) {
String[] subExpr = dirPattern.split(File.separator);
List<File> dirs = new ArrayList<File>();
dirs.clear();
dirs.add(rootFile);
List<File> tmpDirs = new ArrayList<File>();
List<File> 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<DisplayData> getDisplayData(String archiveName,
String categoryName, boolean setSelect) {
Map<String, List<File>> displayMap = new HashMap<String, List<File>>();
@ -635,7 +649,8 @@ public class ArchiveConfigManager {
}
}
List<DisplayData> displayInfoList = new ArrayList<DisplayData>();
List<DisplayData> displayDataList = new ArrayList<DisplayData>(
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;
}
/**