Skip to content

Commit

Permalink
Merge pull request #3246 from katysaintin/master
Browse files Browse the repository at this point in the history
Improve boolean and enum pv managment in pvtable and open Web Page Management
  • Loading branch information
katysaintin authored Jan 30, 2025
2 parents 75a6a3d + c48fa1b commit 666d9ad
Show file tree
Hide file tree
Showing 9 changed files with 203 additions and 97 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,7 @@ private static String URLdecode(final String text)
}
catch (UnsupportedEncodingException ex)
{
logger.log(Level.SEVERE, "Impossible to decode {0} because {1}", new Object[] { text, ex.getMessage() });
return text;
}
}
Expand Down Expand Up @@ -299,6 +300,7 @@ private static String doResolveResource(final String parent_display, final Strin
}

// Give up
logger.log(Level.WARNING, " {0} is not resolved ", new Object[] { resource_name});
return null;
}

Expand All @@ -319,12 +321,15 @@ private static boolean canOpenUrl(final String resource_name)
}
catch (Exception ex)
{
logger.log(Level.SEVERE, "Impossible to open stream on {0} because of {1}", new Object[] { resource_name, ex.getMessage() });
return false;
}
}

if (! isURL(resource_name))
if (! isURL(resource_name)) {
logger.log(Level.WARNING, "URL {0} is not a URL", new Object[] { resource_name });
return false;
}
// This implementation is expensive:
// On success, caller will soon open the URL again.
// In practice, not too bad because second time around
Expand All @@ -344,12 +349,17 @@ private static boolean canOpenUrl(final String resource_name)

try
{
final InputStream stream = openURL(resource_name);
stream.close();
// final InputStream stream = openURL(resource_name);
// stream.close();
//Test only if the page exist and not read the content
final String escaped = resource_name.replace(" ", "%20");
URL resource = new URL(escaped);
resource.openConnection();
return true;
}
catch (Exception ex)
{
logger.log(Level.SEVERE, "Impossible to open connection on URL {0} because of {1}", new Object[] { resource_name, ex.getMessage() });
return false;
}
}
Expand Down Expand Up @@ -397,7 +407,7 @@ public static File getFile(final URI resource) throws Exception
// .. but once examples are inside the jar,
// we can only read them as a stream.
// There is no File access.
logger.log(Level.WARNING, "Cannot get `File` for " + url);
logger.log(Level.WARNING, "Cannot get `File` for " + url + " " + ex.getMessage());
return null;
}
}
Expand Down Expand Up @@ -488,7 +498,6 @@ public static InputStream openURL(final String resource_name) throws Exception

private static final byte[] readUrl(final String url) throws Exception
{
// System.out.println("Actually reading " + url + ", not cached");
final InputStream in = openURL(url, timeout_ms);
final ByteArrayOutputStream buf = new ByteArrayOutputStream();
IOUtils.copy(in, buf);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,9 @@ public class Messages
ShowErrorDialogTitle,
ShowMessageDialogTitle,
ShowSaveAsDialogTitle,
WebPageErrorDetails,
WebPageErrorLoading,
WebPageErrorMessage,
WidgetColorPopOver_Alpha,
WidgetColorPopOver_Blue,
WidgetColorPopOver_Color,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.csstudio.display.builder.model.WidgetPropertyListener;
import org.csstudio.display.builder.model.util.ModelResourceUtil;
import org.csstudio.display.builder.model.widgets.WebBrowserWidget;
import org.csstudio.display.builder.representation.javafx.Messages;
import org.phoebus.framework.jobs.JobManager;
import org.phoebus.framework.util.IOUtils;
import org.phoebus.ui.javafx.ImageCache;
Expand Down Expand Up @@ -102,7 +103,22 @@ protected void goToURL(String url)
// still defaulting to "http://".
else if (url.indexOf("://") < 0)
url = "http://" + url;
webEngine.load(url);

//Try to open page to test if we can open page
try {
InputStream openURL = ModelResourceUtil.openURL(url, 0);
openURL.close();
webEngine.load(url);
}
catch (Exception e) {
//if there is an error display a error page in engine
StringBuilder errorMessage = new StringBuilder();
errorMessage.append("<u style=\"color:red;\">"+Messages.WebPageErrorLoading+" :</u><BR>");
errorMessage.append("<a href=" + url + " target=\"_blank\">"+url+"</a><BR>");
errorMessage.append("<u>"+Messages.WebPageErrorMessage+" :</u> " + e.getMessage() + "<BR>");
errorMessage.append("<u>"+Messages.WebPageErrorDetails+" :</u> " + e.toString());
webEngine.loadContent(errorMessage.toString());
}
}

private void download(final String url, final String file)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@ ShowConfirmationDialogTitle=Please Confirm
ShowErrorDialogTitle=Error
ShowMessageDialogTitle=Message
ShowSaveAsDialogTitle=Save As
WebPageErrorDetails=Error details
WebPageErrorLoading=Error when loading page
WebPageErrorMessage=Error message
WidgetColorPopOver_Hex=Hex Value:
WidgetColorPopOver_Alpha=Alpha:
WidgetColorPopOver_Blue=Blue:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,58 +2,58 @@ ActionButton_N_ActionsAsOneFmt={0} actions
ActionButton_N_ActionsFmt=Choisissez 1 parmi {0}
ActionButton_NoActions=VIDE
ActionsDialog_Actions=Actions :
ActionsDialog_Detail=Détail de l’action :
ActionsDialog_Detail=D\u00E9tail de l’action :
ActionsDialog_DisplayPath=Chemin de l’affichage :
ActionsDialog_ExecuteAll=Exécuter toutes les actions en une seule fois
ActionsDialog_ExecuteAll=Ex\u00E9cuter toutes les actions en une seule fois
ActionsDialog_FilePath=Chemin du fichier :
ActionsDialog_Info=Configurer les actions qui ouvrent des affichages, écrivent des PV, etc.
ActionsDialog_Info=Configurer les actions qui ouvrent des affichages, \u00E9crivent des PV, etc.
ActionsDialog_PVName=Nom du PV :
ActionsDialog_ScriptPath=Fichier de script :
ActionsDialog_ScriptText=Texte du script intégré :
ActionsDialog_ScriptText=Texte du script int\u00E9gr\u00E9 :
ActionsDialog_Title=Actions
Add=Ajouter
AddEmbeddedJavaScript=Ajouter JavaScript intégré\u2026
AddEmbeddedPython=Ajouter Python intégré\u2026
AddEmbeddedJavaScript=Ajouter JavaScript int\u00E9gr\u00E9\u2026
AddEmbeddedPython=Ajouter Python int\u00E9gr\u00E9\u2026
AddJavaScriptFile=Ajouter un fichier JavaScript
AddPythonFile=Ajouter un fichier Python
Alpha=Alpha
Blue=Bleu
BoolButtonError_Body=Le dialogue de confirmation est pris en charge uniquement pour le mode toggle.
BoolButtonError_Title=Configuration non prise en charge
ColorDialog_Current=Actuel
ColorDialog_Custom=Couleur personnalisée
ColorDialog_Default=Défaut
ColorDialog_Info=Séléctionnez une couleur prédéfinie, ou une couleur personnalisée
ColorDialog_Custom=Couleur personnalis\u00E9e
ColorDialog_Default=D\u00E9faut
ColorDialog_Info=S\u00E9l\u00E9ctionnez une couleur pr\u00E9d\u00E9finie, ou une couleur personnalis\u00E9e
ColorDialog_Original=Original
ColorDialog_Predefined=Couleurs prédéfinies
ColorDialog_Predefined=Couleurs pr\u00E9d\u00E9finies
ColorDialog_Title_FMT=Choisir {0}
ColorMap_Custom=Carte de couleurs personnalisée
ColorMap_Custom=Carte de couleurs personnalis\u00E9e
ColorMapDialog_Add=Ajouter une couleur
ColorMapDialog_Color=Couleur
ColorMapDialog_Info=Séléctionnez une carte de couleurs prédéfinie. Optionnellement, personnalisez-la.
ColorMapDialog_PredefinedMap=Carte de couleurs prédéfinie
ColorMapDialog_Info=S\u00E9l\u00E9ctionnez une carte de couleurs pr\u00E9d\u00E9finie. Optionnellement, personnalisez-la.
ColorMapDialog_PredefinedMap=Carte de couleurs pr\u00E9d\u00E9finie
ColorMapDialog_Remove=Supprimer la couleur
ColorMapDialog_Result=Résultat
ColorMapDialog_Result=R\u00E9sultat
ColorMapDialog_Title=Carte de couleurs
ColorMapDialog_Value=Valeur (0-255)
Column=Colonne
ConvertToEmbeddedJavaScript=Convertir en JavaScript intégré\u2026
ConvertToEmbeddedPython=Convertir en Python intégré\u2026
ConvertToEmbeddedJavaScript=Convertir en JavaScript int\u00E9gr\u00E9\u2026
ConvertToEmbeddedPython=Convertir en Python int\u00E9gr\u00E9\u2026
ConvertToScriptFile=Convertir en fichier script
Copy=Copier
Duplicate=Dupliquer
Edit=Modifier\u2026
ExportWidgetInfo=Exporter vers un fichier
CopyWidgetInfo=Afficher liste des Pv
CopyButton =Copier dans le press-papier
ExportDone=Informations sur le widget exportées dans le fichier {0}.
ExportFailed=Échec de l’exportation.
ExportDone=Informations sur le widget export\u00E9es dans le fichier {0}.
ExportFailed=\u00C9chec de l’exportation.
FileTypeAll=Tous les fichiers (*.*)
FileTypeDisplays=Affichages (*.bob)
FontDialog_ExampleText=Texte exemple
FontDialog_Family=Police personnalisée :
FontDialog_Info=Séléctionnez une police prédéfinie, ou une police personnalisée
FontDialog_Predefined=Polices prédéfinies
FontDialog_Family=Police personnalis\u00E9e :
FontDialog_Info=S\u00E9l\u00E9ctionnez une police pr\u00E9d\u00E9finie, ou une police personnalis\u00E9e
FontDialog_Predefined=Polices pr\u00E9d\u00E9finies
FontDialog_Preview=Aperçu :
FontDialog_Size=Taille :
FontDialog_Style=Style :
Expand All @@ -67,98 +67,101 @@ MacrosDialog_NameCol=Nom de la macro
MacrosDialog_Title=Macros
MacrosDialog_ValueCol=Valeur
MacrosTable_NameHint=<Entrer le nom>
MacrosTable_ToolTip=Modifier les noms ou les valeurs. Ajouter une nouvelle macro dans la dernière ligne
MacrosTable_ToolTip=Modifier les noms ou les valeurs. Ajouter une nouvelle macro dans la derni\u00E8re ligne
MacrosTable_ValueHint=<Entrer la valeur>
MoveDown=Vers le bas
MoveUp=Vers le haut
NotSet=Non défini
OpenInExternalEditor=Ouvrir dans un éditeur externe
NotSet=Non d\u00E9fini
OpenInExternalEditor=Ouvrir dans un \u00E9diteur externe
Password=Mot de passe
Password_Caption=Mot de passe :
Password_Error=Mot de passe incorrect
Password_Prompt=Entrer le mot de passe
PointsDialog_Info=Modifier les coordonnées des points
PointsDialog_Info=Modifier les coordonn\u00E9es des points
PointsDialog_Title=Modifier les points
PointsTable_Empty=Pas de points
PointsTable_X=X
PointsTable_Y=Y
Red=Rouge
Remove=Supprimer
Row=Ligne
RulesDialog_ColName=Règle
RulesDialog_ColBoolExp=Expression booléenne
RulesDialog_ColName=R\u00E8gle
RulesDialog_ColBoolExp=Expression bool\u00E9enne
RulesDialog_ColValExp=Expression de valeur
RulesDialog_DefaultRuleName=Nouvelle règle
RulesDialog_DefaultRuleName=Nouvelle r\u00E8gle
RulesDialog_ExpressionsTT=Modifier les expressions
RulesDialog_Info=Modifier les règles pour le widget
RulesDialog_Info=Modifier les r\u00E8gles pour le widget
RulesDialog_NoExpressions=Pas d’expressions dans le tableau.
RulesDialog_NoPVs=Pas de PVs dans le tableau.
RulesDialog_NoRules=Pas de règles dans le tableau.
RulesDialog_PVsTT=Modifier les noms des PV et sélectionner si les changements de leur valeur déclenchent l’exécution de la règle
RulesDialog_RulesTT=Modifier les règles
RulesDialog_SelectRule=Séléctionner la règle pour voir/ajouter PV/Expression
RulesDialog_NoRules=Pas de r\u00E8gles dans le tableau.
RulesDialog_PVsTT=Modifier les noms des PV et s\u00E9lectionner si les changements de leur valeur d\u00E9clenchent l’ex\u00E9cution de la r\u00E8gle
RulesDialog_RulesTT=Modifier les r\u00E8gles
RulesDialog_SelectRule=S\u00E9l\u00E9ctionner la r\u00E8gle pour voir/ajouter PV/Expression
RulesDialog_ShowScript=Afficher le script
RulesDialog_Title=Règles
ScriptsDialog_BtnEmbedJS=Intégrer JS
ScriptsDialog_BtnEmbedPy=Intégrer Py
RulesDialog_Title=R\u00E8gles
ScriptsDialog_BtnEmbedJS=Int\u00E9grer JS
ScriptsDialog_BtnEmbedPy=Int\u00E9grer Py
ScriptsDialog_BtnFile=Fichier
ScriptsDialog_CheckConnections=Déclencher uniquement lorsque tous les PVs sont connectés
ScriptsDialog_CheckConnections=D\u00E9clencher uniquement lorsque tous les PVs sont connect\u00E9s
ScriptsDialog_ColPV=Nom du PV
ScriptsDialog_ColScript=Script
ScriptsDialog_ColTrigger=Déclencheur
ScriptsDialog_ColTrigger=D\u00E9clencheur
ScriptsDialog_DefaultScriptFile=mon_script.py
ScriptsDialog_Info=Modifier les scripts et leurs PVs
ScriptsDialog_JavaScriptScriptFile=mon_script.js
ScriptsDialog_NoScripts=Pas de scripts dans le tableau.
ScriptsDialog_NoPVs=Pas de PVs dans le tableau.
ScriptsDialog_PVsTT=Modifier les noms des PV et sélectionner si les changements de leur valeur déclenchent l’exécution du script
ScriptsDialog_PVsTT=Modifier les noms des PV et s\u00E9lectionner si les changements de leur valeur d\u00E9clenchent l’ex\u00E9cution du script
ScriptsDialog_PythonScriptFile=mon_script.py
ScriptsDialog_ScriptsTT=Séléctionner le fichier script externe ou modifier le texte du script intégré
ScriptsDialog_ScriptsTT=S\u00E9l\u00E9ctionner le fichier script externe ou modifier le texte du script int\u00E9gr\u00E9
ScriptsDialog_Title=Scripts
Select=Séléctionner\u2026
Select=S\u00E9l\u00E9ctionner\u2026
ShowConfirmationDialogTitle=Veuillez confirmer
ShowErrorDialogTitle=Erreur
ShowMessageDialogTitle=Message
ShowSaveAsDialogTitle=Enregistrer sous
WebPageErrorDetails=D\u00E9tails de l\u0027erreur
WebPageErrorLoading=Erreur au chargement de la page
WebPageErrorMessage=Message d\u0027erreur
WidgetColorPopOver_Hex=Valeur Hex :
WidgetColorPopOver_Alpha=Alpha :
WidgetColorPopOver_Blue=Bleu :
WidgetColorPopOver_Color=Couleur :
WidgetColorPopOver_CustomColor=Couleur personnalisée
WidgetColorPopOver_Default=défaut
WidgetColorPopOver_DefaultButton=Défaut
WidgetColorPopOver_Info={0} \u2013 Séléctionnez une couleur prédéfinie et/ou personnalisez-la.
WidgetColorPopOver_CustomColor=Couleur personnalis\u00E9e
WidgetColorPopOver_Default=d\u00E9faut
WidgetColorPopOver_DefaultButton=D\u00E9faut
WidgetColorPopOver_Info={0} \u2013 S\u00E9l\u00E9ctionnez une couleur pr\u00E9d\u00E9finie et/ou personnalisez-la.
WidgetColorPopOver_Green=Vert :
WidgetColorPopOver_Original=original
WidgetColorPopOver_PredefinedColors=Couleurs prédéfinies
WidgetColorPopOver_PredefinedColors=Couleurs pr\u00E9d\u00E9finies
WidgetColorPopOver_Red=Rouge :
WidgetColorPopOver_SearchField=Rechercher
WidgetColorPopOver_SearchFieldTT=Filtrer les couleurs par nom
WidgetFontPopOver_ExampleText=Texte exemple
WidgetFontPopOver_FontsFamilies=Familles de polices
WidgetFontPopOver_Info={0} \u2013 Séléctionnez une police prédéfinie et/ou personnalisez-la.
WidgetFontPopOver_PredefinedFonts=Polices prédéfinies
WidgetFontPopOver_Info={0} \u2013 S\u00E9l\u00E9ctionnez une police pr\u00E9d\u00E9finie et/ou personnalisez-la.
WidgetFontPopOver_PredefinedFonts=Polices pr\u00E9d\u00E9finies
WidgetFontPopOver_Preview=Aperçu
WidgetFontPopOver_PreviewPrompt=Entrez votre texte pour un aperçu.
WidgetFontPopOver_SearchPrompt=Rechercher
WidgetFontPopOver_SearchPromptTT=Filtrer les polices par nom
WidgetFontPopOver_SizeCaption=Taille :
WidgetFontPopOver_SizePrompt=Entrez ou séléctionnez la taille de la police
WidgetFontPopOver_SizePrompt=Entrez ou s\u00E9l\u00E9ctionnez la taille de la police
WidgetFontPopOver_Sizes=Tailles
WidgetFontPopOver_StyleCaption=Style :
WidgetFontPopOver_StylePrompt=Séléctionnez le style de la police
WidgetFontPopOver_StylePrompt=S\u00E9l\u00E9ctionnez le style de la police
WidgetFontPopOver_Styles=Styles
WidgetInfoDialog_Category=Catégorie
WidgetInfoDialog_Category=Cat\u00E9gorie
WidgetInfoDialog_Count=Nombre
WidgetInfoDialog_Disconnected=Déconnecté
WidgetInfoDialog_Disconnected=D\u00E9connect\u00E9
WidgetInfoDialog_Info_Fmt=Widget "{0}" ({1})
WidgetInfoDialog_Name=Nom
WidgetInfoDialog_Path=Chemin du widget
WidgetInfoDialog_Property=Propriété
WidgetInfoDialog_State=État
WidgetInfoDialog_Property=Propri\u00E9t\u00E9
WidgetInfoDialog_State=\u00C9tat
WidgetInfoDialog_WidgetStats=Statistiques des widgets
WidgetInfoDialog_TabMacros=Macros
WidgetInfoDialog_TabProperties=Propriétés
WidgetInfoDialog_TabProperties=Propri\u00E9t\u00E9s
WidgetInfoDialog_TabPVs=PV
WidgetInfoDialog_Title=Infos du widget
WidgetInfoDialog_Total=Total
Expand All @@ -167,4 +170,4 @@ WidgetInfoDialog_WidgetType=Type de widget
Zoom_All=Tout
Zoom_Height=Hauteur
Zoom_Width=Largeur
Reset_Axis_Ranges=Réinitialiser les axes
Reset_Axis_Ranges=R\u00E9initialiser les axes
Loading

0 comments on commit 666d9ad

Please sign in to comment.