Merge pull request #66 from PAMGuard/main

merge from main
This commit is contained in:
Douglas Gillespie 2024-02-15 16:52:29 +00:00 committed by GitHub
commit e491028ef7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 169 additions and 10 deletions

View File

@ -4,7 +4,7 @@
<groupId>org.pamguard</groupId> <groupId>org.pamguard</groupId>
<artifactId>Pamguard</artifactId> <artifactId>Pamguard</artifactId>
<name>Pamguard Java12+</name> <name>Pamguard Java12+</name>
<version>2.02.10</version> <version>2.02.10a</version>
<description>Pamguard for Java 12+, using Maven to control dependcies</description> <description>Pamguard for Java 12+, using Maven to control dependcies</description>
<url>www.pamguard.org</url> <url>www.pamguard.org</url>
<organization> <organization>

View File

@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.pamguard</groupId> <groupId>org.pamguard</groupId>
<artifactId>Pamguard</artifactId> <artifactId>Pamguard</artifactId>
<version>2.02.10</version> <version>2.02.10a</version>
<name>Pamguard Java12+</name> <name>Pamguard Java12+</name>
<description>Pamguard for Java 12+, using Maven to control dependcies</description> <description>Pamguard for Java 12+, using Maven to control dependcies</description>
<url>www.pamguard.org</url> <url>www.pamguard.org</url>

View File

@ -53,7 +53,7 @@ public class HydrophoneDataBlock extends PamDataBlock<HydrophoneDataUnit> {
*/ */
@Override @Override
public int getNumRequiredBeforeLoadTime() { public int getNumRequiredBeforeLoadTime() {
return ArrayManager.getArrayManager().getCurrentArray().getHydrophoneCount(); return ArrayManager.getArrayManager().getCurrentArray().getHydrophoneCount()*2;
} }

View File

@ -3,6 +3,7 @@ package Array;
import pamScrollSystem.AbstractScrollManager; import pamScrollSystem.AbstractScrollManager;
import PamUtils.PamCalendar; import PamUtils.PamCalendar;
import PamView.symbol.StandardSymbolManager; import PamView.symbol.StandardSymbolManager;
import PamguardMVC.PamConstants;
import PamguardMVC.PamDataBlock; import PamguardMVC.PamDataBlock;
import PamguardMVC.PamProcess; import PamguardMVC.PamProcess;
@ -42,7 +43,7 @@ public class HydrophoneProcess extends PamProcess{
@Override @Override
public void addOutputDataBlock(PamDataBlock outputDataBlock){ public void addOutputDataBlock(PamDataBlock outputDataBlock){
AbstractScrollManager.getScrollManager().addToSpecialDatablock(outputDataBlock); AbstractScrollManager.getScrollManager().addToSpecialDatablock(outputDataBlock, 60000, 0);
super.addOutputDataBlock(outputDataBlock); super.addOutputDataBlock(outputDataBlock);
} }

View File

@ -31,7 +31,7 @@ public class PamguardVersionInfo {
* Version number, major version.minorversion.sub-release. * Version number, major version.minorversion.sub-release.
* Note: can't go higher than sub-release 'f' * Note: can't go higher than sub-release 'f'
*/ */
static public final String version = "2.02.10"; static public final String version = "2.02.10a";
/** /**
* Release date * Release date

View File

@ -407,8 +407,13 @@ public class ClickDisplayManager implements PamSettings {
public Serializable getSettingsReference() { public Serializable getSettingsReference() {
cdmp.countEverything(this); cdmp.countEverything(this);
cdmp.saveDisplayLocations(getWindowList());
return cdmp; return cdmp;
} }
public void restoreWindowSizes() {
cdmp.restoreWindowSizes(getWindowList());
}
public int countDisplays(Class displayType) { public int countDisplays(Class displayType) {
int count = 0; int count = 0;

View File

@ -1,8 +1,13 @@
package clickDetector; package clickDetector;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.io.Serializable; import java.io.Serializable;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.ArrayList;
import Layout.PamInternalFrame;
import clickDetector.IDI_Display.IDIHistogramImage; import clickDetector.IDI_Display.IDIHistogramImage;
import PamController.PamController; import PamController.PamController;
@ -35,6 +40,10 @@ public class ClickDisplayManagerParameters2 implements Cloneable, Serializable,
private boolean initialised = false; private boolean initialised = false;
private boolean manualWindowSizes = false;
private ArrayList<WindowSizeData> windowSizes = new ArrayList();
public ClickDisplayManagerParameters2() { public ClickDisplayManagerParameters2() {
setDefaults(); setDefaults();
} }
@ -159,6 +168,11 @@ public class ClickDisplayManagerParameters2 implements Cloneable, Serializable,
return null; return null;
} }
/**
* This populates the serialised settings with lists of how many displays of
* each type there are.
* @param clickDisplayManager
*/
public void countEverything(ClickDisplayManager clickDisplayManager) { public void countEverything(ClickDisplayManager clickDisplayManager) {
lastMode = PamController.getInstance().getRunMode(); lastMode = PamController.getInstance().getRunMode();
if (lastMode >= NMODES) lastMode = 0; if (lastMode >= NMODES) lastMode = 0;
@ -208,4 +222,101 @@ public class ClickDisplayManagerParameters2 implements Cloneable, Serializable,
return ps; return ps;
} }
/**
* Save windows sizes in an array list.
* @param windowList
*/
public void saveDisplayLocations(ArrayList<ClickDisplay> windowList) {
if (windowList == null) {
return;
}
getWindowSizes(); // make sure the array is created
windowSizes.clear();
for (ClickDisplay disp : windowList) {
Point loc = disp.getFrame().getLocation();
Dimension sz = disp.getFrame().getSize();
String cls = disp.getClass().toString();
windowSizes.add(new WindowSizeData(cls, loc, sz));
}
}
/**
* Try to restore window locations and sizes from a stored list.
* @param windowList
* @return
*/
public boolean restoreWindowSizes(ArrayList<ClickDisplay> windowList){
if (windowSizes == null || windowList == null) {
return false;
}
int resized = 0;
for (ClickDisplay disp : windowList) {
PamInternalFrame frame = disp.getFrame();
String cls = disp.getClass().toString();
// find an element in the list with that class.
WindowSizeData sizeData = null;
for (int i = 0; i < windowSizes.size(); i++) {
if (windowSizes.get(i).windowClass.equals(cls)) {
sizeData = windowSizes.remove(i);
break;
}
}
if (sizeData != null) {
frame.setLocation(sizeData.location);
frame.setSize(sizeData.size);
resized ++;
}
}
return resized > 0;
}
/**
* @return the windowSizes
*/
public ArrayList<WindowSizeData> getWindowSizes() {
if (windowSizes == null) {
windowSizes = new ArrayList<>();
}
return windowSizes;
}
/**
* @return the manualWindowSizes
*/
public boolean isManualWindowSizes() {
return manualWindowSizes;
}
/**
* @param manualWindowSizes the manualWindowSizes to set
*/
public void setManualWindowSizes(boolean manualWindowSizes) {
this.manualWindowSizes = manualWindowSizes;
}
private class WindowSizeData implements Serializable {
static public final long serialVersionUID = 1;
protected String windowClass;
public WindowSizeData(String windowClass, Point location, Dimension size) {
super();
this.windowClass = windowClass;
this.location = location;
this.size = size;
}
protected Point location;
protected Dimension size;
}
} }

View File

@ -72,9 +72,19 @@ public class ClickTabPanel extends JDesktopPane implements ComponentListener {
public void componentMoved(ComponentEvent e) { public void componentMoved(ComponentEvent e) {
} }
/**
* This get's called during startup when the window is created and will
* automatically resize everything. IT may get called 2 or 3 times at startup
* as components such as the side bar sort themselves out.
*/
public void componentResized(ComponentEvent e) { public void componentResized(ComponentEvent e) {
// if (++resizeCount < 5) { // if (++resizeCount < 5) {
arrangeWindows(); if (clickTabPanelControl.clickDisplayManager.cdmp.isManualWindowSizes() == false) {
arrangeWindows();
}
else {
clickTabPanelControl.clickDisplayManager.restoreWindowSizes();
}
// } // }
} }

View File

@ -26,6 +26,7 @@ import java.awt.Frame;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JMenu; import javax.swing.JMenu;
import javax.swing.JMenuItem; import javax.swing.JMenuItem;
@ -117,11 +118,29 @@ public class ClickTabPanelControl implements PamTabPanel {
menu.add(clickDisplayManager.getModulesMenu()); menu.add(clickDisplayManager.getModulesMenu());
menuItem = new JMenuItem("Arrange Windows ..."); menu.add(clickControl.angleVetoes.getDisplayMenuItem(parentFrame));
menu.addSeparator();
JCheckBoxMenuItem autoArrange = new JCheckBoxMenuItem("Auto arrange windows");
autoArrange.setSelected(clickDisplayManager.cdmp.isManualWindowSizes() == false);
autoArrange.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
clickDisplayManager.cdmp.setManualWindowSizes(autoArrange.isSelected() == false);
if (autoArrange.isSelected()) {
clickPanel.arrangeWindows();
}
}
});
autoArrange.setToolTipText("Automatically arrange windows in a standard layout whenever the display dimensions change");
menu.add(autoArrange);
menuItem = new JMenuItem("Arrange Windows Now");
menuItem.addActionListener(new ArrangeWindows(parentFrame)); menuItem.addActionListener(new ArrangeWindows(parentFrame));
menuItem.setToolTipText("Automatically arrange windows in a standard layout");
menu.add(menuItem); menu.add(menuItem);
menu.add(clickControl.angleVetoes.getDisplayMenuItem(parentFrame));
return menu; return menu;
} }

View File

@ -458,6 +458,7 @@ public class DetectionGroupProcess extends PamProcess {
detectionGroupDataBlock.saveViewerData(); detectionGroupDataBlock.saveViewerData();
int nUpdates = 0; int nUpdates = 0;
int nOK = 0; int nOK = 0;
int consecutiveOK = 0;
System.out.printf("Checking %d data units in %s ", detectionGroupDataBlock.getUnitsCount(), detectionGroupDataBlock.getDataName()); System.out.printf("Checking %d data units in %s ", detectionGroupDataBlock.getUnitsCount(), detectionGroupDataBlock.getDataName());
synchronized (detectionGroupDataBlock.getSynchLock()) { synchronized (detectionGroupDataBlock.getSynchLock()) {
ListIterator<DetectionGroupDataUnit> it = detectionGroupDataBlock.getListIterator(0); ListIterator<DetectionGroupDataUnit> it = detectionGroupDataBlock.getListIterator(0);
@ -466,11 +467,16 @@ public class DetectionGroupProcess extends PamProcess {
boolean ok = checkDataIntegrity(du, false); boolean ok = checkDataIntegrity(du, false);
if (ok) { if (ok) {
nUpdates++; nUpdates++;
consecutiveOK = 0;
} }
else { else {
nOK++; nOK++;
consecutiveOK++;
} }
System.out.printf("."); System.out.printf(".");
if (consecutiveOK % 80 == 0) {
System.out.printf("\n");
}
} }
} }
System.out.printf("\n%s: %d out of %d data units required corrections\n", detectionGroupDataBlock.getDataName(), nUpdates, nUpdates+nOK); System.out.printf("\n%s: %d out of %d data units required corrections\n", detectionGroupDataBlock.getDataName(), nUpdates, nUpdates+nOK);
@ -486,7 +492,7 @@ public class DetectionGroupProcess extends PamProcess {
subTabLogging = detectionGroupLogging.getSubLogging(); subTabLogging = detectionGroupLogging.getSubLogging();
PamConnection con = DBControlUnit.findConnection(); PamConnection con = DBControlUnit.findConnection();
String desc = String.format("Detection group UID %d at %s", du.getUID(), PamCalendar.formatDBDateTime(du.getTimeMilliseconds())); String desc = String.format("Detection group UID %d at %s", du.getUID(), PamCalendar.formatDBDateTime(du.getTimeMilliseconds()));
String idList = "( " + du.getUID() + " )"; String idList = "( " + du.getDatabaseIndex() + " )";
ArrayList<PamSubtableData> stData = subTabLogging.loadSubtableData(con, detectionGroupLogging, idList, null); ArrayList<PamSubtableData> stData = subTabLogging.loadSubtableData(con, detectionGroupLogging, idList, null);
if (stData == null) { if (stData == null) {
System.out.println("Error loading sub table data for event uid " + du.getUID()); System.out.println("Error loading sub table data for event uid " + du.getUID());

View File

@ -2002,7 +2002,7 @@ public abstract class SQLLogging {
* *
* @param con database connection * @param con database connection
* @param parentLogging super detection logging instance. * @param parentLogging super detection logging instance.
* @param uidList list of UID's in the parent data that have been loaded. * @param idList list of ID's in the parent data that have been loaded. Note Id, NOT UID
* @return list of all PamSubtableData items * @return list of all PamSubtableData items
*/ */
public ArrayList<PamSubtableData> loadSubtableData(PamConnection con, SQLLogging parentLogging, String idList, ViewLoadObserver loadObserver) { public ArrayList<PamSubtableData> loadSubtableData(PamConnection con, SQLLogging parentLogging, String idList, ViewLoadObserver loadObserver) {
@ -2034,6 +2034,13 @@ public abstract class SQLLogging {
return loadSubtableData(con, subtableResults, loadObserver); return loadSubtableData(con, subtableResults, loadObserver);
} }
/**
* Get a sub table result set. Note that this is based on ID, not UID
* @param con connection
* @param parentLogging parent logging system
* @param parentIdList ParentID list. Note that this is ID, not UID, <br>i.e. the query is WHERE ParentID IN ...
* @return child table result set
*/
private ResultSet createSubTableResultSet(PamConnection con, SQLLogging parentLogging, private ResultSet createSubTableResultSet(PamConnection con, SQLLogging parentLogging,
String parentIdList) { String parentIdList) {
String clause = String.format(" WHERE ParentID IN %s ORDER BY UTC, UTCMilliseconds", parentIdList); String clause = String.format(" WHERE ParentID IN %s ORDER BY UTC, UTCMilliseconds", parentIdList);