Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
e8fb55f
Modified the behavior of spinner widget to react differently with dif…
wmliuanl Nov 7, 2025
12a6040
Merge pull request #1 from ControlSystemStudio/master
wmliuanl Nov 7, 2025
b465ebc
docs: fix warnings
minijackson Sep 26, 2025
200ea9d
databrowser-timescale: add index.rst
minijackson Nov 12, 2025
357ddde
display/editor: add missing documents to the doc toctree
minijackson Nov 12, 2025
d556b27
Merge branch 'ControlSystemStudio:master' into master
wmliuanl Nov 20, 2025
2d18a93
preserve the selection for the alarm tree
shroffk Nov 25, 2025
4356591
remove the flag since it is inconsistent
shroffk Nov 25, 2025
ace4905
generates swagger documentation during the maven build process
Nov 21, 2025
00edc45
show in red incorrect properties in settings.ini
Nov 27, 2025
aeb1205
add validation when loosing focus
Sep 30, 2025
29297a8
add parameters to generate the file from the source files. generation…
Nov 14, 2025
e08d6f1
remove CI : swagger.json is now generated during maven build
Nov 27, 2025
35093e4
Setup base APIs to show dialog comparing stored array and live array
georgweiss Nov 28, 2025
ed9fce4
Merge pull request #3659 from lcaouen/create_settings_template_locally
georgweiss Nov 28, 2025
f5c5bf0
CSSTUDIO-3597 Create a new instance of macros in EmbeddedDisplayWidge…
abrahamwolk Dec 1, 2025
770f350
Merge pull request #3660 from lcaouen/new_swagger_generation
georgweiss Dec 1, 2025
2f5314b
Add pv name to dialog layout
georgweiss Dec 1, 2025
a557455
Port AlarmTreePath unit test from old cs studio
DKastelic Nov 24, 2025
a677402
Fix bug where moving tree item to unchanged path would delete it
DKastelic Dec 1, 2025
9a11ac7
Update makePath to throw exception
DKastelic Dec 1, 2025
0313967
Update UI actions to handle AlarmTreePath exception
DKastelic Dec 1, 2025
ac18402
Update XmlModelReader to handle AlarmTreePathException
DKastelic Dec 1, 2025
11a5bd1
Document AlarmTreePathException
DKastelic Dec 1, 2025
ab385da
Update comparison table when PV is connected
georgweiss Dec 1, 2025
c9bacba
Render delta value in comparison dialog
georgweiss Dec 2, 2025
4838f2b
Add styling of diff column
georgweiss Dec 2, 2025
78385ca
Adding comparison dialog title
georgweiss Dec 2, 2025
54083d7
load properties from manifest + escape html tags + monospace font
Dec 2, 2025
85b257d
Additional string resources
georgweiss Dec 2, 2025
453a2a3
Allow indexed access of scalar array elements for pva
georgweiss Dec 2, 2025
15e8cc9
Merge pull request #3666 from ControlSystemStudio/CSSTUDIO-2686b
georgweiss Dec 3, 2025
e3a5f09
More styling and fixed sorting on delta column
georgweiss Dec 3, 2025
6c6eef4
Clickable delta cell to launch dialog if arrays are not equal
georgweiss Dec 3, 2025
cb3b6f3
Merge pull request #3663 from ControlSystemStudio/CSSTUDIO-3597
shroffk Dec 3, 2025
70ced28
Change empy`Name` properties by the name of the file in runtime and i…
agaget Nov 26, 2025
4e0c31c
change default value of the property of the template initial.bob
agaget Dec 3, 2025
7141bd3
Using VTypes instead of priminitives for the comparison dialog
georgweiss Dec 4, 2025
0f70bee
Handle update if live data has fewer elements than stored snapshot
georgweiss Dec 4, 2025
123f629
Merge pull request #3657 from lcaouen/focus_validation
shroffk Dec 4, 2025
b97b54d
Proper handling of differences in array length in comparisoon dialog
georgweiss Dec 5, 2025
0024eed
Minor layout and code cleanup changes
georgweiss Dec 5, 2025
9a8d40c
Javadoc and code cleanup
georgweiss Dec 5, 2025
21e8517
Support for setting threshold when comparing array/table elements
georgweiss Dec 8, 2025
357bdd8
Cleanup code when comparison dialog is closed
georgweiss Dec 8, 2025
fa7bb3c
Use VTypeHelper to determine array size
georgweiss Dec 8, 2025
ba95624
Adding documentation
georgweiss Dec 8, 2025
2401fd8
Merge pull request #3655 from lcaouen/Empty_name_Edit
shroffk Dec 8, 2025
77aacfb
Return infinite delta if arrays are of different length
georgweiss Dec 9, 2025
b764710
Merge branch 'master' into CSSTUDIO-3585
georgweiss Dec 9, 2025
fc547ad
Updated ordering and documentation
georgweiss Dec 9, 2025
d355c64
Updated ordering and documentation
georgweiss Dec 9, 2025
24f8a08
Add dimensions and non-equal count to comparison dialog
georgweiss Dec 10, 2025
d2fba8b
Do not launch comparison dialog if live PV is not connected
georgweiss Dec 10, 2025
f6e8ee5
First example of alarm configuration dialogs with the alarm tree
shroffk Dec 10, 2025
653a4b3
Send to log/email from alarm ui bug fix (acknowledged list same as ac…
georgweiss Dec 11, 2025
6350631
Fix line break for log entries created from Alarm Table UI
georgweiss Dec 11, 2025
3faf851
Merge pull request #3673 from ControlSystemStudio/CSSTUDIO-3598
shroffk Dec 11, 2025
a570d69
Merge pull request #3669 from ControlSystemStudio/CSSTUDIO-3585
shroffk Dec 11, 2025
d73dad4
Merge pull request #3641 from minijackson/fix-doc-warnings
shroffk Dec 11, 2025
a190d29
CSSTUDIO-3605 Always use the type "long" when converting to hexadecim…
abrahamwolk Dec 12, 2025
1912d57
RDB archive: Fix Oracle time zone problem.
Dec 12, 2025
fb37c8c
CSSTUDIO-3605 Bugfix: Avoid sign extension when converting numbers to…
abrahamwolk Dec 15, 2025
82cebbd
CSSTUDIO-3605 Add test cases.
abrahamwolk Dec 15, 2025
717fc53
check if property files are in classes folders and exclude keys from …
Dec 15, 2025
27499f5
Merge pull request #3675 from ControlSystemStudio/arch_rdb_oracle_tim…
kasemir Dec 15, 2025
acb8aad
Cache the move item name to prepare more intuitive destination paths
shroffk Dec 15, 2025
3289387
Cleanup imports for the new alarm tree view
shroffk Dec 15, 2025
d124088
exclude keys that must not be checked + Remove system.err and system.out
Dec 17, 2025
22b3713
Merge branch 'ControlSystemStudio:master' into master
wmliuanl Dec 18, 2025
3969688
Modified the behavior of spinner widget to make 5x steps, 10x steps
wmliuanl Dec 19, 2025
251ed4a
create individual color properties for each tab
Dec 19, 2025
c0bef37
create enable_individual_colors propert for navtabs and manage the wi…
Dec 19, 2025
e96f8d6
fix call to setTabNames in NavigationTabsDemo.java
Dec 19, 2025
6e1f013
Update controls_spinner_slider_scrollbar.bob
wmliuanl Dec 19, 2025
471890f
Update SpinnerRepresentation.java
wmliuanl Dec 19, 2025
d4a8dfb
a prototype context menu action for adding PVs to alarm configurations
shroffk Dec 22, 2025
c632ccb
Add support for changing condifurations
shroffk Dec 31, 2025
1402795
Cleanup the dialog, the AlarmClient lifecycle is now completely withi…
shroffk Dec 31, 2025
95c2b75
The "add pvs to alarm tree" supports multiple configuration
shroffk Dec 31, 2025
9d1c23d
move the add PV action to the dialog instead of the action
shroffk Jan 5, 2026
eb15e54
More clear name for the context menu action to add PVs to the alarm s…
shroffk Jan 5, 2026
2727d71
Merge pull request #3624 from wmliuanl/master
shroffk Jan 5, 2026
794bd81
Merge pull request #3667 from ControlSystemStudio/alarm_apps
shroffk Jan 5, 2026
db2ce5f
Merge pull request #3664 from DKastelic/master
shroffk Jan 5, 2026
0eadadd
Merge remote-tracking branch 'origin/master' into alarm_apps
shroffk Jan 6, 2026
1fc5aaa
Merge pull request #3661 from lcaouen/check_settings
georgweiss Jan 7, 2026
400445a
NavigationTabs : fix minor typo issues
Jan 7, 2026
e404138
NavigationTabs : indentation is consistent in using 4 spaces
Jan 7, 2026
f425702
NavigationTabs : using a single setTabs method to update Tabs
Jan 7, 2026
6e6247c
NavigatonTabs : fix minor typo issues
Jan 7, 2026
272a540
remove Messages import
Jan 7, 2026
7f4f726
NavigatonTabs : fix minor typo issues
Jan 7, 2026
666a19e
NavigationTabs : fix NavigationTabsDemo.java
Jan 7, 2026
010be78
CSSTUDIO-3605 Report error for unsupported number formats when conver…
abrahamwolk Jan 8, 2026
4fdae91
CSSTUDIO-3605 Improve typing and limit scope of 'buf'.
abrahamwolk Jan 8, 2026
b51cd18
Handle the new AlarmTreePathException
shroffk Jan 8, 2026
0e767e7
Fix open save&restore action when UI is not yet open
georgweiss Jan 9, 2026
fae59a9
NavigationTabs: fix build of tests
Jan 9, 2026
1ccd11e
Create a preference to enable/disable add PVs to alarm configuration …
shroffk Jan 9, 2026
e4ec9ce
Merge pull request #3683 from ControlSystemStudio/CSSTUDIO-3622
georgweiss Jan 11, 2026
ed38995
Merge pull request #3674 from ControlSystemStudio/CSSTUDIO-3605
abrahamwolk Jan 12, 2026
4334fbd
Merge pull request #3680 from lcaouen/individual-colors-on-navtabs
shroffk Jan 12, 2026
72630a2
Fix https://github.com/ControlSystemStudio/phoebus/issues/3685
Jan 12, 2026
8e402d8
Merge pull request #3682 from ControlSystemStudio/alarm_apps
shroffk Jan 12, 2026
f3967da
Merge pull request #3686 from lcaouen/check_settings
shroffk Jan 13, 2026
75b01dd
CSSTUDIO-3620 Bugfix: When no range is specified, the default range […
abrahamwolk Jan 22, 2026
1ea9747
Merge pull request #3689 from ControlSystemStudio/CSSTUDIO-3620
abrahamwolk Jan 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 0 additions & 31 deletions .github/workflows/build_swagger.yml

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,9 @@ public class AlarmSystem extends AlarmSystemConstants
/** Disable notify feature */
@Preference public static boolean disable_notify_visible;

/** Enable context menu for adding PVs to alarm configuration */
@Preference public static boolean enable_add_to_alarm_context_menu;

/** "Disable until.." shortcuts */
@Preference public static String[] shelving_options;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -484,12 +484,8 @@ private AlarmTreeItem<?> findOrCreateNode(final String path, final boolean is_le
* @param path_name to parent Root or parent component under which to add the component
* @param new_name Name of the new component
*/
public void addComponent(final String path_name, final String new_name) {
try {
sendNewItemInfo(path_name, new_name, new AlarmClientNode(null, new_name));
} catch (final Exception ex) {
logger.log(Level.WARNING, "Cannot add component " + new_name + " to " + path_name, ex);
}
public void addComponent(final String path_name, final String new_name) throws Exception {
sendNewItemInfo(path_name, new_name, new AlarmClientNode(null, new_name));
}

/**
Expand All @@ -498,12 +494,8 @@ public void addComponent(final String path_name, final String new_name) {
* @param path_name to parent Root or parent component under which to add the component
* @param new_name Name of the new component
*/
public void addPV(final String path_name, final String new_name) {
try {
sendNewItemInfo(path_name, new_name, new AlarmClientLeaf(null, new_name));
} catch (final Exception ex) {
logger.log(Level.WARNING, "Cannot add pv " + new_name + " to " + path_name, ex);
}
public void addPV(final String path_name, final String new_name) throws Exception {
sendNewItemInfo(path_name, new_name, new AlarmClientLeaf(null, new_name));
}

private void sendNewItemInfo(String path_name, final String new_name, final AlarmTreeItem<?> content) throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/** Helper for handling the path names of alarm tree elements.
* Path looks like "/root/area/system/subsystem/pv_name".
Expand All @@ -32,24 +33,33 @@ public static boolean isPath(final String path)
* @param path Parent path or <code>null</code> when starting at root
* @param item Name of item at end of path
* @return Full path name to item
* @throws AlarmTreePathException When getting an illegal item string with leading slashes
*/
public static String makePath(final String path, String item)
{
public static String makePath(final String path, String item) throws AlarmTreePathException {
// Validate item: forbid leading slashes except exactly one (legacy compatibility)
if (item != null && item.startsWith(PATH_SEP)) {
// If there's more than one leading slash, it's invalid
if (item.length() > 1 && item.charAt(1) == PATH_SEP.charAt(0)) {
throw new AlarmTreePathException(
"Item must not have leading slashes: '" + item + "'"
);
}
// For legacy support (existing tests), strip exactly one leading slash
item = item.substring(1);
}

final StringBuilder result = new StringBuilder();
if (path != null)
{
if (! isPath(path))
result.append(PATH_SEP);
// Skip path it it's only '/'
// Skip path if it's only '/'
if (!PATH_SEP.equals(path))
result.append(path);
}
result.append(PATH_SEP);
if (item != null && !item.isEmpty())
{
// If item already starts with '/', skip it
if (item.startsWith(PATH_SEP))
item = item.substring(1);
// Escape any path-seps inside item with backslashes
result.append(item.replace(PATH_SEP, "\\/"));
}
Expand Down Expand Up @@ -112,8 +122,9 @@ public static String getName(final String path)
* @param path Original path
* @param modifier Path modifier: "segments/to/add", "/absolute/new/path", ".."
* @return Path based on pwd and modifier
* @throws AlarmTreePathException When a segment contains leading slashes.
*/
public static String update(String path, String modifier)
public static String update(String path, String modifier) throws AlarmTreePathException
{
if (modifier == null || modifier.isEmpty())
return makePath(null, path);
Expand All @@ -137,4 +148,18 @@ public static String update(String path, String modifier)
}
}
}

public static boolean pathsAreEquivalent(String a, String b) {
var elementsA = splitPath(a);
var elementsB = splitPath(b);
if (elementsA.length != elementsB.length) {
return false;
}
for (int i = 0; i < elementsA.length; i++) {
if (!Objects.equals(elementsA[i], elementsB[i])) {
return false;
}
}
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.phoebus.applications.alarm.model;

/**
* Exception thrown when attempting to construct an invalid alarm tree path.
* <p>
* Paths or path elements that start with more than one leading slash are not allowed.
* A single leading slash is permitted for backward compatibility and for
* representing absolute paths, but multiple leading slashes indicate an
* invalid or ambiguous path specification.
*/
public class AlarmTreePathException extends IllegalArgumentException {
public AlarmTreePathException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

import org.phoebus.applications.alarm.client.AlarmClientLeaf;
import org.phoebus.applications.alarm.client.AlarmClientNode;
import org.phoebus.applications.alarm.model.AlarmTreePathException;
import org.phoebus.applications.alarm.model.TitleDetail;
import org.phoebus.applications.alarm.model.TitleDetailDelay;
import org.phoebus.framework.persistence.XMLUtil;
Expand Down Expand Up @@ -118,15 +119,8 @@ private void buildModel(final Document doc) throws Exception
// Create the root of the model. Parent is null and name must be config.
root = new AlarmClientNode(null, root_node.getAttribute(TAG_NAME));

// First add PVs at this level, ..
for (final Element child : XMLUtil.getChildElements(root_node, TAG_PV))
processPV(root /* parent */, child);

// .. when sub-components which again have PVs.
// This way, duplicate PVs will be detected and ignored at a nested level,
// keeping those toward the root
for (final Node child : XMLUtil.getChildElements(root_node, TAG_COMPONENT))
processComponent(root /* parent */, child);
// Recursively process children
processChildren(root, root_node);
}

private void processComponent(final AlarmClientNode parent, final Node node) throws Exception
Expand Down Expand Up @@ -162,12 +156,34 @@ private void processComponent(final AlarmClientNode parent, final Node node) thr
// This does not refer to XML attributes but instead to the attributes of a model component node.
processCompAttr(component, node);

// First add PVs at this level, then sub-components
// Recursively process children
processChildren(component, node);
}

private void processChildren(AlarmClientNode component, Node node) throws Exception {
// First add PVs at this level
for (final Element child : XMLUtil.getChildElements(node, TAG_PV))
processPV(component/* parent */, child);
try {
processPV(component/* parent */, child);
} catch (AlarmTreePathException e) {
logger.log(Level.WARNING,
"Ignoring malformed PV "
+ component.getPathName() + "/" + child.getAttribute(TAG_NAME) + ".\n"
+ "Cause: " + e.getMessage());
}

// then subcomponents, which again have PVs.
// This way, duplicate PVs will be detected and ignored at a nested level,
// keeping those toward the root
for (final Element child : XMLUtil.getChildElements(node, TAG_COMPONENT))
processComponent(component /* parent */, child);
try {
processComponent(component /* parent */, child);
} catch (AlarmTreePathException e) {
logger.log(Level.WARNING,
"Ignoring malformed component "
+ component.getPathName() + "/" + child.getAttribute(TAG_NAME) + ".\n"
+ "Cause: " + e.getMessage());
}
}

private void processCompAttr(final AlarmClientNode component, final Node node) throws Exception
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,13 @@ connection_check_secs=5
# To turn on disable notifications feature, set the value to `true`
disable_notify_visible=false

# Enable context menu for adding PVs to alarm configuration.
#
# When enabled, right-clicking on PVs in the application will show
# an "Add to Alarms" option that opens a dialog to add the selected
# PVs to the alarm tree.
enable_add_to_alarm_context_menu=true

# Options for the "Disable until.." shortcuts in the PV config dialog.
#
# :format:
Expand Down
Loading