From 84ba1e1ac3f64bbb91a4ab58f6517cb72cd270b6 Mon Sep 17 00:00:00 2001 From: Dalibor Aksic <93644806+Daksic28@users.noreply.github.com> Date: Tue, 10 Dec 2024 16:36:26 +0100 Subject: [PATCH] [26790] Such-Funktion Sortierfunktion Designe angepasst und Einstellung (#406) --- .../webapi/core/IMednetAuthService.java | 10 - .../webapi/core/auth/MednetAuthService.java | 72 +-- .../webapi/core/constants/ApiConstants.java | 56 ++- .../webapi/core/constants/IconConstants.java | 9 +- .../core/constants/PreferenceConstants.java | 2 + .../webapi/core/constants/StateConstants.java | 7 + .../core/constants/TransientCategory.java | 47 -- .../webapi/core/constants/URLConstants.java | 32 +- .../fhir/resources/util/FileDownloader.java | 17 +- .../handler/SingleFileDownloaderHandler.java | 4 +- .../mednet/webapi/core/messages/Messages.java | 24 +- .../src/messages.properties | 22 + .../src/messages_de.properties | 22 + .../src/messages_en.properties | 22 + .../src/messages_fr.properties | 39 +- .../src/messages_it.properties | 26 +- .../icons/check-mark.png | Bin 0 -> 1142 bytes .../icons/left-arrow.png | Bin 0 -> 290 bytes .../icons/left-arrow_white.png | Bin 0 -> 238 bytes .../icons/on-off-button-gruen.png | Bin 0 -> 1098 bytes .../icons/on-off-button-rot.png | Bin 0 -> 1195 bytes .../icons/toggel_green.png | Bin 2407 -> 0 bytes .../icons/toggel_red.png | Bin 2398 -> 0 bytes .../icons/warnung_gelb.png | Bin 772 -> 0 bytes .../icons/warnung_gruen.png | Bin 822 -> 0 bytes .../ch/elexis/mednet/webapi/ui/Activator.java | 77 +++- .../elexis/mednet/webapi/ui/MednetAuthUi.java | 1 - .../mednet/webapi/ui/handler/DataHandler.java | 19 +- .../webapi/ui/handler/ImportOmnivoreUtil.java | 5 - .../webapi/ui/handler/PatientFetcher.java | 11 +- .../mednet/webapi/ui/handler/TableHelper.java | 91 +++- .../webapi/ui/navigation/NavigationState.java | 37 ++ .../webapi/ui/parts/CustomerComposite.java | 65 ++- .../mednet/webapi/ui/parts/FormComposite.java | 118 +++-- .../webapi/ui/parts/MedNetMainComposite.java | 424 ++++++------------ .../webapi/ui/parts/ProviderComposite.java | 71 ++- .../ui/parts/SubmittedFormsComposite.java | 21 +- .../preferences/MedNetWebPreferencePage.java | 50 ++- .../ui/preferences/PreferenceInitializer.java | 15 +- .../mednet/webapi/ui/util/ButtonFactory.java | 168 +++++++ .../ui/util/CompositeEffectHandler.java | 128 ++++++ .../mednet/webapi/ui/util/ImageUtil.java | 32 ++ .../UIStyleTableHelper.java} | 4 +- 43 files changed, 1187 insertions(+), 561 deletions(-) create mode 100644 bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/StateConstants.java delete mode 100644 bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/TransientCategory.java create mode 100644 bundles/ch.elexis.mednet.webapi.ui/icons/check-mark.png create mode 100644 bundles/ch.elexis.mednet.webapi.ui/icons/left-arrow.png create mode 100644 bundles/ch.elexis.mednet.webapi.ui/icons/left-arrow_white.png create mode 100644 bundles/ch.elexis.mednet.webapi.ui/icons/on-off-button-gruen.png create mode 100644 bundles/ch.elexis.mednet.webapi.ui/icons/on-off-button-rot.png delete mode 100644 bundles/ch.elexis.mednet.webapi.ui/icons/toggel_green.png delete mode 100644 bundles/ch.elexis.mednet.webapi.ui/icons/toggel_red.png delete mode 100644 bundles/ch.elexis.mednet.webapi.ui/icons/warnung_gelb.png delete mode 100644 bundles/ch.elexis.mednet.webapi.ui/icons/warnung_gruen.png create mode 100644 bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/navigation/NavigationState.java create mode 100644 bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/ButtonFactory.java create mode 100644 bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/CompositeEffectHandler.java create mode 100644 bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/ImageUtil.java rename bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/{fhir/util/UIStyleHelper.java => util/UIStyleTableHelper.java} (98%) diff --git a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/IMednetAuthService.java b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/IMednetAuthService.java index 021d8f61e..813f5ec06 100644 --- a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/IMednetAuthService.java +++ b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/IMednetAuthService.java @@ -15,16 +15,6 @@ public interface IMednetAuthService { */ public Optional getToken(Map parameters); - /** - * Get the bearer token for the provided parameters. Existing tokens are - * returned without user interaction. If there is no existing token a - * {@link IMednetAuthUi} implementation is needed for user interaction. - * - * @param parameters - * @return - */ - public Optional delToken(Map parameters); - /** * Call this method to inform the {@link IMednetAuthService} about a exception * occurred accessing a web service using a token from the diff --git a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/auth/MednetAuthService.java b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/auth/MednetAuthService.java index 44da08f54..ca1a1ebdb 100644 --- a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/auth/MednetAuthService.java +++ b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/auth/MednetAuthService.java @@ -20,9 +20,6 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.ServiceReference; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import org.osgi.service.component.annotations.ReferenceCardinality; @@ -48,12 +45,9 @@ public class MednetAuthService implements IMednetAuthService { @Reference(cardinality = ReferenceCardinality.OPTIONAL, policyOption = ReferencePolicyOption.GREEDY) private IMednetAuthUi authUi; - private boolean useQueryParam = true; - private String currentState; private String currentCodeVerifier; - @Override public Optional getToken(Map parameters) { if (configService == null) { @@ -74,37 +68,6 @@ public Optional getToken(Map parameters) { return Optional.empty(); } - @Override - public Optional delToken(Map parameters) { - - String tokenGroup = "mednet"; - BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext(); - ServiceReference serviceReference = context.getServiceReference(IMednetAuthService.class); - - if (serviceReference != null) { - IMednetAuthService authService = context.getService(serviceReference); - try { - - if (configService == null) { - - } - - configService.setActiveMandator(PreferenceConstants.PREF_TOKEN + tokenGroup, null); - configService.setActiveMandator(PreferenceConstants.PREF_TOKEN_EXPIRES + tokenGroup, null); - configService.setActiveMandator(PreferenceConstants.PREF_REFRESHTOKEN + tokenGroup, null); - - } catch (Exception ex) { - - LoggerFactory.getLogger(getClass()).error("Error when removing token", ex); - } finally { - context.ungetService(serviceReference); - } - } else { - - } - return Optional.empty(); - } - private Optional getToken(String tokenGroup, IMednetAuthUi iMednetAuthUi) { Optional authCode = getAuthCode(tokenGroup, iMednetAuthUi); if (authCode.isPresent()) { @@ -116,9 +79,8 @@ private Optional getToken(String tokenGroup, IMednetAuthUi iMednetAuthUi return Optional.empty(); } - private String getOauthRestUrl() { - return configService.get(PreferenceConstants.PREF_RESTBASEURL, ApiConstants.BASE_URI); + return configService.get(PreferenceConstants.PREF_RESTBASEURL, ApiConstants.getBaseUri()); } private Optional getAccessTokenWithRefresh(String tokenGroup, String refreshToken, String oauthRestUrl) { @@ -127,7 +89,6 @@ private Optional getAccessTokenWithRefresh(String tokenGroup, String ref parameters.put("refresh_token", refreshToken); parameters.put("client_id", getClientId()); parameters.put("client_secret", getClientSecret()); - String form = parameters.entrySet().stream() .map(e -> e.getKey() + "=" + URLEncoder.encode(e.getValue(), StandardCharsets.UTF_8)) .collect(Collectors.joining("&")); @@ -165,9 +126,8 @@ private Optional getAccessTokenWithRefresh(String tokenGroup, String ref return Optional.of(token); } catch (JsonSyntaxException ex) { - LoggerFactory.getLogger(getClass()).error( - "The answer is not a valid JSON: " + response.statusCode(), - ex); + LoggerFactory.getLogger(getClass()) + .error("The answer is not a valid JSON: " + response.statusCode(), ex); } } else { LoggerFactory.getLogger(getClass()).error("Getting refreshed access token failed [" @@ -179,7 +139,6 @@ private Optional getAccessTokenWithRefresh(String tokenGroup, String ref return Optional.empty(); } - public Optional getAuthCode(String tokenGroup, IMednetAuthUi iMedNetAuthUi) { String codeVerifier = generateCodeVerifier(); String codeChallenge = generateCodeChallenge(codeVerifier); @@ -195,7 +154,6 @@ public Optional getAuthCode(String tokenGroup, IMednetAuthUi iMedNetAuth new GetAuthCodeWithStateSupplier(stateValue)); if (value instanceof String) { - LoggerFactory.getLogger(getClass()).info("Authorization Code received: {}", value); return Optional.of((String) value); } LoggerFactory.getLogger(getClass()).warn("No authorization code received."); @@ -235,7 +193,7 @@ private String getLoginHint() { LoggerFactory.getLogger(getClass()).warn("Kein Login-Hinweis in den Einstellungen gefunden."); } else { LoggerFactory.getLogger(getClass()).info("Login-Hinweis abgerufen: {}", userName); - } + } return userName; } @@ -288,7 +246,6 @@ private String generateCodeVerifier() { return Base64.getUrlEncoder().withoutPadding().encodeToString(code).substring(0, 43); } - private String generateCodeChallenge(String codeVerifier) { try { MessageDigest digest = MessageDigest.getInstance("SHA-256"); @@ -311,11 +268,16 @@ private String getCurrentState(boolean refresh) { } private String getClientId() { + String mode = configService.getActiveUserContact(PreferenceConstants.MEDNET_MODE, "DEMO"); try (InputStream properties = getClass().getResourceAsStream("/rsc/id.properties")) { if (properties != null) { Properties idProps = new Properties(); idProps.load(properties); - return idProps.getProperty("client_id"); + if ("PRODUKTIV".equals(mode)) { + return idProps.getProperty("client_id_prod"); + } else { + return idProps.getProperty("client_id_demo"); + } } } catch (Exception e) { LoggerFactory.getLogger(getClass()).error("Error loading id properties", e); @@ -324,11 +286,16 @@ private String getClientId() { } private String getClientSecret() { + String mode = configService.getActiveUserContact(PreferenceConstants.MEDNET_MODE, "DEMO"); try (InputStream properties = getClass().getResourceAsStream("/rsc/id.properties")) { if (properties != null) { Properties idProps = new Properties(); idProps.load(properties); - return idProps.getProperty("client_secret"); + if ("PRODUKTIV".equals(mode)) { + return idProps.getProperty("client_secret_prod"); + } else { + return idProps.getProperty("client_secret_demo"); + } } } catch (Exception e) { LoggerFactory.getLogger(getClass()).error("Error loading id properties", e); @@ -350,8 +317,8 @@ private Optional validateToken(String existingToken, String tokenGroup) getOauthRestUrl()); if (refreshedToken.isPresent()) { return refreshedToken; - } else { - configService.setActiveMandator(PreferenceConstants.PREF_REFRESHTOKEN + tokenGroup, null); + } else { + configService.setActiveMandator(PreferenceConstants.PREF_REFRESHTOKEN + tokenGroup, null); } } configService.setActiveMandator(PreferenceConstants.PREF_TOKEN + tokenGroup, null); @@ -376,6 +343,3 @@ public Optional handleException(Exception ex, Map parame return Optional.empty(); } } - - - diff --git a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/ApiConstants.java b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/ApiConstants.java index b5f10e9c2..1672945a4 100644 --- a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/ApiConstants.java +++ b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/ApiConstants.java @@ -1,20 +1,52 @@ package ch.elexis.mednet.webapi.core.constants; +import java.util.Optional; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ch.elexis.core.services.IConfigService; +import ch.elexis.core.utils.OsgiServiceUtil; public class ApiConstants { - // API Base URL - public static final String BASE_API_URL = "https://demo.mednet.swiss/web/api/v1/external"; - public static final String BASE_URI = "https://demo.mednetpatient.swiss/idsrv"; - public static final String BASE_REDERICT_URI = "https://tools.medelexis.ch/mednet/ac"; - public static final String BASE_REDERICT_URI_OBTAIN = "https://tools.medelexis.ch/mednet/ac-obtain/"; + private static final Logger logger = LoggerFactory.getLogger(ApiConstants.class); - // Specific API Endpoints - public static final String CUSTOMERS_URL = BASE_API_URL + "/customers?includeDetails=true"; - public static final String PROVIDERS_URL = BASE_API_URL + "/providers?customerId=%d&includeDetails=true"; - public static final String FORMS_URL = BASE_API_URL + "/forms?customerId=%d&providerId=%d"; - public static final String SUBMITTED_FORMS_URL = BASE_API_URL + "/submitted-forms?customerId=%d"; - public static final String PATIENTS_URL = BASE_API_URL + "/patients"; + public static String getBaseApiUrl() { + Optional configService = OsgiServiceUtil.getServiceWait(IConfigService.class, 5000); + if (configService.isPresent()) { + String mode = configService.get().getActiveUserContact(PreferenceConstants.MEDNET_MODE, "DEMO"); + if ("PRODUKTIV".equals(mode)) { + return "https://www.mednet.swiss/web/api/v1/external"; + } else { + return "https://demo.mednet.swiss/web/api/v1/external"; + } + } else { + logger.error("Error when retrieving the base API URL from the preferences: {}"); + } + return "https://demo.mednet.swiss/web/api/v1/external"; + } -} \ No newline at end of file + public static String getBaseUri() { + + Optional configService = OsgiServiceUtil.getServiceWait(IConfigService.class, 5000); + if (configService.isPresent()) { + String mode = configService.get().getActiveUserContact(PreferenceConstants.MEDNET_MODE, "DEMO"); + if ("PRODUKTIV".equals(mode)) { + return "https://www.mednet.swiss/idsrv"; + } else { + return "https://demo.mednetpatient.swiss/idsrv"; + } + } + return "https://demo.mednetpatient.swiss/idsrv"; + } + + public static final String BASE_REDERICT_URI = "https://tools.medelexis.ch/mednet/ac"; + public static final String BASE_REDERICT_URI_OBTAIN = "https://tools.medelexis.ch/mednet/ac-obtain/"; + public static final String CUSTOMERS_URL = "/customers?includeDetails=true"; + public static final String PROVIDERS_URL = "/providers?customerId=%d&includeDetails=true"; + public static final String FORMS_URL = "/forms?customerId=%d&providerId=%d"; + public static final String SUBMITTED_FORMS_URL = "/submitted-forms?customerId=%d"; + public static final String PATIENTS_URL = "/patients"; +} diff --git a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/IconConstants.java b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/IconConstants.java index 5d7e83f65..4a7a2ada5 100644 --- a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/IconConstants.java +++ b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/IconConstants.java @@ -29,8 +29,9 @@ public class IconConstants { public static final String ICON_SETTINGS_WHITE = "icons/settings_white.png"; public static final String ICON_CONECT_BLUE = "icons/conect_blue.png"; public static final String ICON_CONECT_WHITE = "icons/conect_white.png"; - public static final String ICON_TOGGEL_RED = "icons/toggel_red.png"; - public static final String ICON_TOGGEL_GREEN = "icons/toggel_green.png"; - public static final String ICON_WARNUNG_GELB = "icons/warnung_gelb.png"; - public static final String ICON_WARNUNG_GRUEN = "icons/warnung_gruen.png"; + public static final String ICON_TOGGEL_RED = "icons/on-off-button-rot.png"; + public static final String ICON_TOGGEL_GREEN = "icons/on-off-button-gruen.png"; + public static final String ICON_LEFT_ARROW = "icons/left-arrow.png"; + public static final String ICON_LEFT_ARROW_WHITE = "icons/left-arrow_white.png"; + } diff --git a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/PreferenceConstants.java b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/PreferenceConstants.java index d022ff2b0..6723c6710 100644 --- a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/PreferenceConstants.java +++ b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/PreferenceConstants.java @@ -22,4 +22,6 @@ public class PreferenceConstants { public static final String TOKEN_GROUP = "token_group"; public static final String TOKEN_GROUP_KEY = "mednet"; + public static final String MEDNET_MODE = "mednet_mode"; + } diff --git a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/StateConstants.java b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/StateConstants.java new file mode 100644 index 000000000..8dd6c9b0b --- /dev/null +++ b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/StateConstants.java @@ -0,0 +1,7 @@ +package ch.elexis.mednet.webapi.core.constants; + +public class StateConstants { + public static final String CUSTOMER = "CUSTOMER"; + public static final String PROVIDER = "PROVIDER"; + public static final String FORM = "FORM"; +} diff --git a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/TransientCategory.java b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/TransientCategory.java deleted file mode 100644 index a0a885c53..000000000 --- a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/TransientCategory.java +++ /dev/null @@ -1,47 +0,0 @@ -package ch.elexis.mednet.webapi.core.constants; - -import ch.elexis.core.model.ICategory; - -public class TransientCategory implements ICategory { - - private String name; - - public TransientCategory(String name) { - this.name = name; - } - - @Override - public String getName() { - return name; - } - - @Override - public void setName(String value) { - this.name = value; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - TransientCategory other = (TransientCategory) obj; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - return true; - } -} diff --git a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/URLConstants.java b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/URLConstants.java index 0a3899fba..201da7ade 100644 --- a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/URLConstants.java +++ b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/constants/URLConstants.java @@ -1,11 +1,35 @@ package ch.elexis.mednet.webapi.core.constants; +import java.util.Optional; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ch.elexis.core.services.IConfigService; +import ch.elexis.core.utils.OsgiServiceUtil; public class URLConstants { + private static final Logger logger = LoggerFactory.getLogger(URLConstants.class); + + public static String getBaseApiUrl() { + Optional configService = OsgiServiceUtil.getServiceWait(IConfigService.class, 5000); + if (configService.isPresent()) { + String mode = configService.get().getActiveUserContact(PreferenceConstants.MEDNET_MODE, "DEMO"); + + if ("PRODUKTIV".equals(mode)) { + return "https://www.mednet.swiss"; + } else { + return "https://demo.mednet.swiss"; + } + } else { + logger.error("Error when retrieving the base API URL from the preferences: {}"); + } + return "https://demo.mednet.swiss"; + } - public static final String URL_PATIENTS = "https://demo.mednet.swiss/DoctorUser/patients"; - public static final String URL_TASKS = "https://demo.mednet.swiss/DoctorUser/tasks"; - public static final String URL_DOCUMENTS = "https://demo.mednet.swiss/DoctorUser/documents"; - public static final String URL_THERAPY = "https://demo.mednet.swiss/DoctorUser/chronic-diseases/chronic-diseases-list"; + public static final String URL_PATIENTS = "/DoctorUser/patients"; + public static final String URL_TASKS = "/DoctorUser/tasks"; + public static final String URL_DOCUMENTS = "/DoctorUser/documents"; + public static final String URL_THERAPY = "/DoctorUser/chronic-diseases/chronic-diseases-list"; } \ No newline at end of file diff --git a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/fhir/resources/util/FileDownloader.java b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/fhir/resources/util/FileDownloader.java index 39bccc0b8..3ddf467eb 100644 --- a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/fhir/resources/util/FileDownloader.java +++ b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/fhir/resources/util/FileDownloader.java @@ -44,7 +44,8 @@ public FileDownloader(IMednetAuthService authService) { this.authService = authService; } - public void downloadForms() { + public boolean downloadForms() { + boolean success = false; BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext(); ServiceReference serviceReference = context.getServiceReference(IMednetAuthService.class); @@ -54,12 +55,13 @@ public void downloadForms() { Map parameters = new HashMap<>(); parameters.put(PreferenceConstants.TOKEN_GROUP, PreferenceConstants.TOKEN_GROUP_KEY); Optional authToken = authService.getToken(parameters); + if (authToken.isPresent()) { String token = authToken.get(); List customerIds = fetchCustomerIds(token); if (!customerIds.isEmpty()) { + success = true; for (Integer customerId : customerIds) { - fetchAndDownloadFormsForCustomer(token, customerId); } } else { @@ -76,13 +78,14 @@ public void downloadForms() { } else { logger.error("ServiceReference for IMednetAuthService is null."); } + return success; } private List fetchCustomerIds(String token) { List customerIds = new ArrayList<>(); try { - String apiUrl = ApiConstants.CUSTOMERS_URL; - HttpRequest request = HttpRequest.newBuilder().uri(URI.create(apiUrl)) + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(ApiConstants.getBaseApiUrl() + ApiConstants.CUSTOMERS_URL)) .header("Authorization", "Bearer " + token).GET().build(); HttpClient client = HttpClient.newHttpClient(); @@ -110,7 +113,7 @@ private List fetchCustomerIds(String token) { private void fetchAndDownloadFormsForCustomer(String token, Integer customerId) { try { - String apiUrl = String.format(ApiConstants.SUBMITTED_FORMS_URL, customerId); + String apiUrl = String.format(ApiConstants.getBaseApiUrl() + ApiConstants.SUBMITTED_FORMS_URL, customerId); HttpRequest request = HttpRequest.newBuilder().uri(URI.create(apiUrl)) .header("Authorization", "Bearer " + token).GET().build(); @@ -245,7 +248,7 @@ private static String extractDateFromUrl(String url) { private void acknowledgeDownloadSuccess(String packageId, String token) { try { - String successUrl = ApiConstants.BASE_API_URL + "/" + packageId + "/download-success?objectType=Form"; + String successUrl = ApiConstants.getBaseApiUrl() + "/" + packageId + "/download-success?objectType=Form"; HttpRequest request = HttpRequest.newBuilder().uri(URI.create(successUrl)) .header("Authorization", "Bearer " + token).method("PATCH", HttpRequest.BodyPublishers.noBody()) .build(); @@ -264,7 +267,7 @@ private void acknowledgeDownloadSuccess(String packageId, String token) { private void acknowledgeDownloadFailure(String packageId, String token, String errorMessage) { try { - String failureUrl = ApiConstants.BASE_API_URL + "/" + packageId + "/download-failure?objectType=Form"; // Use + String failureUrl = ApiConstants.getBaseApiUrl() + "/" + packageId + "/download-failure?objectType=Form"; // Use // constant String jsonBody = "{ \"errorMessage\": \"" + errorMessage.replace("\"", "\\\"") + "\" }"; diff --git a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/handler/SingleFileDownloaderHandler.java b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/handler/SingleFileDownloaderHandler.java index c76d4abca..218ff53ca 100644 --- a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/handler/SingleFileDownloaderHandler.java +++ b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/handler/SingleFileDownloaderHandler.java @@ -133,8 +133,6 @@ private String getDownloadStore() { } } - // Fallback: Verwenden von IEclipsePreferences, falls IConfigService nicht - // verfügbar ist String pluginId = PreferenceConstants.MEDNET_PLUGIN_STRING; IEclipsePreferences node = InstanceScope.INSTANCE.getNode(pluginId); String downloadPath = node.get(PreferenceConstants.MEDNET_DOWNLOAD_PATH, ""); @@ -166,7 +164,7 @@ private void acknowledgeDownloadSuccess(String packageId) { if (authToken.isPresent()) { token = authToken.get(); try { - String successUrl = ApiConstants.BASE_API_URL + "/" + packageId + String successUrl = ApiConstants.getBaseApiUrl() + "/" + packageId + "/download-success?objectType=Form"; HttpRequest request = HttpRequest.newBuilder().uri(URI.create(successUrl)) diff --git a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/messages/Messages.java b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/messages/Messages.java index 6b79a02fd..f5981cfaf 100644 --- a/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/messages/Messages.java +++ b/bundles/ch.elexis.mednet.webapi.core/src/ch/elexis/mednet/webapi/core/messages/Messages.java @@ -41,6 +41,10 @@ public class Messages extends NLS { public static String MedNetMainComposite_noPathConfigured; public static String MedNetMainComposite_noPathWarningTitle; public static String MedNetMainComposite_noPathWarningMessage; + public static String MedNetMainComposite_schedulerErrorTitle; + public static String MedNetMainComposite_schedulerErrorMessage; + public static String MedNetMainComposite_restartRequiredTitle; + public static String MedNetMainComposite_restartRequiredMessage; public static String MedNetMainComposite_tasks; public static String MedNetMainComposite_therapy; public static String MedNetMainComposite_titleMedNet; @@ -51,8 +55,24 @@ public class Messages extends NLS { public static String ProviderComposite_Anbieter_ID; public static String ProviderComposite_Anbieter_Name; public static String SubmittedFormsComposite_noErrorForms; - - + public static String ColumnHeaders_OrderNo; + public static String ColumnHeaders_Date; + public static String ColumnHeaders_PatientNo; + public static String ColumnHeaders_PatientName; + public static String ColumnHeaders_Birthdate; + public static String ColumnHeaders_Type; + public static String ColumnHeaders_ExportsAndAttachments; + public static String ColumnHeaders_Sender; + public static String ColumnHeaders_Receiver; + public static String Composite_searchBoxMessage; + public static String MedNetWebPreferencePage_operatingMode; + public static String MedNetWebPreferencePage_demoMode; + public static String MedNetWebPreferencePage_produktivMode; + public static String MedNetMainComposite_activateImport; + public static String BreadcrumbNavigation_customers; + public static String BreadcrumbNavigation_providers; + public static String BreadcrumbNavigation_forms; + public static String MedNetMainComposite_deactivateImport; static { diff --git a/bundles/ch.elexis.mednet.webapi.core/src/messages.properties b/bundles/ch.elexis.mednet.webapi.core/src/messages.properties index 6662a29b5..924619ba6 100644 --- a/bundles/ch.elexis.mednet.webapi.core/src/messages.properties +++ b/bundles/ch.elexis.mednet.webapi.core/src/messages.properties @@ -34,6 +34,10 @@ MedNetMainComposite_noPathWarningMessage=No download path configured. The import MedNetMainComposite_connectedTooltip=Forms are automatically imported into Omnivore. MedNetMainComposite_disconnectedTooltip=Sent forms will NOT be imported into Omnivore. MedNetMainComposite_showPatients=View mednet patients +MedNetMainComposite_schedulerErrorTitle=Scheduler Error +MedNetMainComposite_schedulerErrorMessage=An error has occurred. The scheduler has been deactivated. +MedNetMainComposite_restartRequiredTitle=Restart Required +MedNetMainComposite_restartRequiredMessage=The change of operating mode will only take effect after restarting Elexis. MedNetMainComposite_tasks=View mednet tasks MedNetMainComposite_therapy=View mednet therapy support MedNetMainComposite_titleMedNet=mednet @@ -41,6 +45,24 @@ MedNetWebPreferencePage_configForMedNetWebAPI=Configuration for mednet Web API MedNetWebPreferencePage_downloadFolder=&Download folder: MedNetWebPreferencePage_loginName=&Login name: MedNetWebPreferencePage_requestNewToken=Delete token and request a new one +MedNetWebPreferencePage_operatingMode=Operating Mode +MedNetWebPreferencePage_demoMode=Demo +MedNetWebPreferencePage_produktivMode=Productive ProviderComposite_Anbieter_ID=Provider ID ProviderComposite_Anbieter_Name=Provider Name SubmittedFormsComposite_noErrorForms=No error-loaded forms available. +ColumnHeaders_OrderNo=Order No. +ColumnHeaders_Date=Date +ColumnHeaders_PatientNo=Patient No. +ColumnHeaders_PatientName=Patient Name +ColumnHeaders_Birthdate=Birthdate +ColumnHeaders_Type=Type +ColumnHeaders_ExportsAndAttachments=Exports and Attachments +ColumnHeaders_Sender=Sender +ColumnHeaders_Receiver=Receiver +Composite_searchBoxMessage=Search by name... +MedNetMainComposite_activateImport=Activate Omnivore Import +BreadcrumbNavigation_customers=Customers +BreadcrumbNavigation_providers=Providers +BreadcrumbNavigation_forms=Forms +MedNetMainComposite_deactivateImport=Deactivate Import diff --git a/bundles/ch.elexis.mednet.webapi.core/src/messages_de.properties b/bundles/ch.elexis.mednet.webapi.core/src/messages_de.properties index a77685ba8..628c48f0a 100644 --- a/bundles/ch.elexis.mednet.webapi.core/src/messages_de.properties +++ b/bundles/ch.elexis.mednet.webapi.core/src/messages_de.properties @@ -34,6 +34,10 @@ MedNetMainComposite_noPathWarningTitle=Pfad fehlt MedNetMainComposite_noPathWarningMessage=Kein Download-Pfad konfiguriert. Der Importer funktioniert nicht ohne einen Pfad. Die Verbindung wird deaktiviert. MedNetMainComposite_connectedTooltip=Die Formulare werden automatisch in Omnivore importiert. MedNetMainComposite_disconnectedTooltip=Die gesendeten Formulare werden in Omnivore NICHT importiert. +MedNetMainComposite_schedulerErrorTitle=Scheduler-Fehler +MedNetMainComposite_schedulerErrorMessage=Ein Fehler ist aufgetreten. Der Scheduler wurde deaktiviert. +MedNetMainComposite_restartRequiredTitle=Neustart erforderlich +MedNetMainComposite_restartRequiredMessage=Die \u00c4nderung der Betriebsart wird erst nach einem Neustart von Elexis wirksam. MedNetMainComposite_tasks=mednet Aufgaben anzeigen MedNetMainComposite_therapy=mednet Therapiebegleitung anzeigen MedNetMainComposite_titleMedNet=mednet @@ -41,6 +45,24 @@ MedNetWebPreferencePage_configForMedNetWebAPI=Konfiguration f\u00FCr mednet Web MedNetWebPreferencePage_downloadFolder=&Download Ordner: MedNetWebPreferencePage_loginName=&Login Name: MedNetWebPreferencePage_requestNewToken=Token l\u00F6schen und neu anfordern +MedNetWebPreferencePage_operatingMode=Betriebsmodus +MedNetWebPreferencePage_demoMode=Demo +MedNetWebPreferencePage_produktivMode=Produktiv ProviderComposite_Anbieter_ID=Anbieter ID ProviderComposite_Anbieter_Name=Anbieter Name SubmittedFormsComposite_noErrorForms=Es sind keine fehlerhaft heruntergeladenen Formulare da. +ColumnHeaders_OrderNo=Auftrags-Nr. +ColumnHeaders_Date=Datum +ColumnHeaders_PatientNo=Patienten-Nr. +ColumnHeaders_PatientName=Patientenname +ColumnHeaders_Birthdate=Geburtsdatum +ColumnHeaders_Type=Typ +ColumnHeaders_ExportsAndAttachments=Exporte und Anh\u00E4nge +ColumnHeaders_Sender=Absender +ColumnHeaders_Receiver=Empf\u00E4nger +Composite_searchBoxMessage=Suche nach Namen... +MedNetMainComposite_activateImport=Omnivore Import Aktivieren +BreadcrumbNavigation_customers=Kunden +BreadcrumbNavigation_providers=Anbieter +BreadcrumbNavigation_forms=Formulare +MedNetMainComposite_deactivateImport=Import Deaktivieren \ No newline at end of file diff --git a/bundles/ch.elexis.mednet.webapi.core/src/messages_en.properties b/bundles/ch.elexis.mednet.webapi.core/src/messages_en.properties index 6662a29b5..316c2c9b8 100644 --- a/bundles/ch.elexis.mednet.webapi.core/src/messages_en.properties +++ b/bundles/ch.elexis.mednet.webapi.core/src/messages_en.properties @@ -34,6 +34,10 @@ MedNetMainComposite_noPathWarningMessage=No download path configured. The import MedNetMainComposite_connectedTooltip=Forms are automatically imported into Omnivore. MedNetMainComposite_disconnectedTooltip=Sent forms will NOT be imported into Omnivore. MedNetMainComposite_showPatients=View mednet patients +MedNetMainComposite_schedulerErrorTitle=Scheduler Error +MedNetMainComposite_schedulerErrorMessage=An error has occurred. The scheduler has been deactivated. +MedNetMainComposite_restartRequiredTitle=Restart Required +MedNetMainComposite_restartRequiredMessage=The change of operating mode will only take effect after restarting Elexis. MedNetMainComposite_tasks=View mednet tasks MedNetMainComposite_therapy=View mednet therapy support MedNetMainComposite_titleMedNet=mednet @@ -41,6 +45,24 @@ MedNetWebPreferencePage_configForMedNetWebAPI=Configuration for mednet Web API MedNetWebPreferencePage_downloadFolder=&Download folder: MedNetWebPreferencePage_loginName=&Login name: MedNetWebPreferencePage_requestNewToken=Delete token and request a new one +MedNetWebPreferencePage_operatingMode=Operating Mode +MedNetWebPreferencePage_demoMode=Demo +MedNetWebPreferencePage_produktivMode=Productive ProviderComposite_Anbieter_ID=Provider ID ProviderComposite_Anbieter_Name=Provider Name SubmittedFormsComposite_noErrorForms=No error-loaded forms available. +ColumnHeaders_OrderNo=Order No. +ColumnHeaders_Date=Date +ColumnHeaders_PatientNo=Patient No. +ColumnHeaders_PatientName=Patient Name +ColumnHeaders_Birthdate=Birthdate +ColumnHeaders_Type=Type +ColumnHeaders_ExportsAndAttachments=Exports and Attachments +ColumnHeaders_Sender=Sender +ColumnHeaders_Receiver=Receiver +Composite_searchBoxMessage=Search by name... +MedNetMainComposite_activateImport=Activate Omnivore Import +BreadcrumbNavigation_customers=Customers +BreadcrumbNavigation_providers=Providers +BreadcrumbNavigation_forms=Forms +MedNetMainComposite_deactivateImport=Deactivate Import \ No newline at end of file diff --git a/bundles/ch.elexis.mednet.webapi.core/src/messages_fr.properties b/bundles/ch.elexis.mednet.webapi.core/src/messages_fr.properties index aa917a6e9..0a98d489e 100644 --- a/bundles/ch.elexis.mednet.webapi.core/src/messages_fr.properties +++ b/bundles/ch.elexis.mednet.webapi.core/src/messages_fr.properties @@ -1,5 +1,5 @@ AttachmentsComposite_attachment=Pi\u00E8ce jointe -AttachmentsComposite_cannotBeConverted=\\ n'a pas pu \u00EAtre converti ou n'est pas un PDF.\\nVeuillez v\u00E9rifier si un document modifiable doit \u00EAtre envoy\u00E9. +AttachmentsComposite_cannotBeConverted=\\ n\u0027a pas pu \u00EAtre converti ou n\u0027est pas un PDF.\\nVeuillez v\u00E9rifier si un document modifiable doit \u00EAtre envoy\u00E9. AttachmentsComposite_document=Document AttachmentsComposite_dragFileHere=Glisser le fichier externe ici AttachmentsComposite_openWithDoubleClick=Ouvrir avec un double clic (sans modifications) @@ -9,7 +9,7 @@ CustomerComposite_customerID=ID client CustomerComposite_customerFirstName=Pr\u00E9nom du client CustomerComposite_customerLastName=Nom du client DataHandler_noPatientSelectedTitle=Pas de patient s\u00E9lectionn\u00E9 -DataHandler_noPatientSelectedMessage=Veuillez d'abord s\u00E9lectionner un patient. +DataHandler_noPatientSelectedMessage=Veuillez d\u0027abord s\u00E9lectionner un patient. DataHandler_sendDocumentsTitle=Envoyer des documents DataHandler_sendDocumentsMessage=Souhaitez-vous envoyer des documents? DocumentsSelectionDialog_doubleClickToAttach=Double-cliquez pour joindre le document (Maximum 3 documents) @@ -21,26 +21,51 @@ DocumentsSelectionDialog_selectionTitle=S\u00E9lection de documents mednet FormComposite_formId=ID du formulaire FormComposite_formName=Nom du formulaire MednetAuthService_browserAuthorizationPrompt=Autoriser Mednet dans le navigateur. -MedNetMainComposite_browserError=Le navigateur n'a pas pu \u00EAtre ouvert. +MedNetMainComposite_browserError=Le navigateur n\u0027a pas pu \u00EAtre ouvert. MedNetMainComposite_connect=Se connecter \u00E0 mednet MedNetMainComposite_connectionStarted=Connexion mednet d\u00E9marr\u00E9e. MedNetMainComposite_documents=Afficher les documents mednet MedNetMainComposite_error=Erreur MedNetMainComposite_forms=Afficher les formulaires t\u00E9l\u00E9charg\u00E9s avec erreurs MedNetMainComposite_formWithPatientData=Cr\u00E9er un formulaire mednet avec les donn\u00E9es du patient -MedNetMainComposite_noPathConfigured=Aucun chemin configur\u00E9. Veuillez configurer un chemin de t\u00E9l\u00E9chargement pour activer l'importateur. +MedNetMainComposite_noPathConfigured=Aucun chemin configur\u00E9. Veuillez configurer un chemin de t\u00E9l\u00E9chargement pour activer l\u0027importateur. MedNetMainComposite_noPathWarningTitle=Chemin manquant -MedNetMainComposite_noPathWarningMessage=Aucun chemin de t\u00E9l\u00E9chargement configur\u00E9. L'importateur ne fonctionnera pas sans chemin. La connexion sera d\u00E9sactiv\u00E9e. +MedNetMainComposite_noPathWarningMessage=Aucun chemin de t\u00E9l\u00E9chargement configur\u00E9. L\u0027importateur ne fonctionnera pas sans chemin. La connexion sera d\u00E9sactiv\u00E9e. MedNetMainComposite_connectedTooltip=Les formulaires sont automatiquement import\u00E9s dans Omnivore. MedNetMainComposite_disconnectedTooltip=Les formulaires envoy\u00E9s ne seront PAS import\u00E9s dans Omnivore. MedNetMainComposite_showPatients=Afficher les patients mednet +MedNetMainComposite_schedulerErrorTitle=Erreur du Planificateur +MedNetMainComposite_schedulerErrorMessage=Une erreur s\u0027est produite. Le planificateur a \u00e9t\u00e9 d\u00e9sactiv\u00e9. +MedNetMainComposite_restartRequiredTitle=Red\u00e9marrage requis +MedNetMainComposite_restartRequiredMessage=Le changement de mode de fonctionnement ne prendra effet qu\u0027apr\u00e8s le red\u00e9marrage d\u0027Elexis. MedNetMainComposite_tasks=Afficher les t\u00E2ches mednet MedNetMainComposite_therapy=Afficher le suivi th\u00E9rapeutique mednet MedNetMainComposite_titleMedNet=mednet MedNetWebPreferencePage_configForMedNetWebAPI=Configuration pour mednet Web API MedNetWebPreferencePage_downloadFolder=&Dossier de t\u00E9l\u00E9chargement: -MedNetWebPreferencePage_loginName=&Nom d'utilisateur: +MedNetWebPreferencePage_loginName=&Nom d\u0027utilisateur: MedNetWebPreferencePage_requestNewToken=Supprimer le jeton et en demander un nouveau +MedNetWebPreferencePage_operatingMode=Mode de fonctionnement +MedNetWebPreferencePage_demoMode=D\u00e9mo +MedNetWebPreferencePage_produktivMode=Productif ProviderComposite_Anbieter_ID=ID du fournisseur ProviderComposite_Anbieter_Name=Nom du fournisseur -SubmittedFormsComposite_noErrorForms=Il n'y a pas de formulaires t\u00E9l\u00E9charg\u00E9s avec erreurs. +SubmittedFormsComposite_noErrorForms=Il n\u0027y a pas de formulaires t\u00E9l\u00E9charg\u00E9s avec erreurs. +ColumnHeaders_OrderNo=Num\u00E9ro de commande +ColumnHeaders_Date=Date +ColumnHeaders_PatientNo=Num\u00E9ro du patient +ColumnHeaders_PatientName=Nom du patient +ColumnHeaders_Birthdate=Date de naissance +ColumnHeaders_Type=Type +ColumnHeaders_ExportsAndAttachments=Exports et pi\u00E8ces jointes +ColumnHeaders_Sender=Exp\u00E9diteur +ColumnHeaders_Receiver=Destinataire +Composite_searchBoxMessage=Recherche par nom... +MedNetMainComposite_activateImport=Activer l\u0027import Omnivore +BreadcrumbNavigation_customers=Clients +BreadcrumbNavigation_providers=Fournisseurs +BreadcrumbNavigation_forms=Formulaires +MedNetMainComposite_deactivateImport=D\u00E9sactiver l\u0027importation + + + diff --git a/bundles/ch.elexis.mednet.webapi.core/src/messages_it.properties b/bundles/ch.elexis.mednet.webapi.core/src/messages_it.properties index a07d67295..5dd25da8f 100644 --- a/bundles/ch.elexis.mednet.webapi.core/src/messages_it.properties +++ b/bundles/ch.elexis.mednet.webapi.core/src/messages_it.properties @@ -28,12 +28,16 @@ MedNetMainComposite_documents=Visualizza documenti mednet MedNetMainComposite_error=Errore MedNetMainComposite_forms=Visualizza moduli scaricati con errori MedNetMainComposite_formWithPatientData=Crea modulo mednet con dati del paziente -MedNetMainComposite_noPathConfigured=Nessun percorso configurato. Si prega di configurare un percorso di download per abilitare l'importatore. +MedNetMainComposite_noPathConfigured=Nessun percorso configurato. Si prega di configurare un percorso di download per abilitare l\u0027importatore. MedNetMainComposite_noPathWarningTitle=Percorso mancante -MedNetMainComposite_noPathWarningMessage=Nessun percorso di download configurato. L'importatore non funzionerà senza un percorso. La connessione verrà disattivata. +MedNetMainComposite_noPathWarningMessage=Nessun percorso di download configurato. L\u0027importatore non funzionerà senza un percorso. La connessione verrà disattivata. MedNetMainComposite_connectedTooltip=I moduli vengono importati automaticamente in Omnivore. MedNetMainComposite_disconnectedTooltip=I moduli inviati NON saranno importati in Omnivore. MedNetMainComposite_showPatients=Visualizza pazienti mednet +MedNetMainComposite_schedulerErrorTitle=Errore del Pianificatore +MedNetMainComposite_schedulerErrorMessage=Si \u00e8 verificato un errore. Il pianificatore \u00e8 stato disattivato. +MedNetMainComposite_restartRequiredTitle=Riavvio richiesto +MedNetMainComposite_restartRequiredMessage=La modifica della modalit\u00e0 operativa avr\u00e0 effetto solo dopo il riavvio di Elexis. MedNetMainComposite_tasks=Visualizza compiti mednet MedNetMainComposite_therapy=Visualizza accompagnamento terapeutico mednet MedNetMainComposite_titleMedNet=mednet @@ -41,6 +45,24 @@ MedNetWebPreferencePage_configForMedNetWebAPI=Configurazione per API Web mednet MedNetWebPreferencePage_downloadFolder=&Cartella di download: MedNetWebPreferencePage_loginName=&Nome utente: MedNetWebPreferencePage_requestNewToken=Elimina il token e richiedine uno nuovo +MedNetWebPreferencePage_operatingMode=Modalit\u00e0 operativa +MedNetWebPreferencePage_demoMode=Demo +MedNetWebPreferencePage_produktivMode=Produttivo ProviderComposite_Anbieter_ID=ID Fornitore ProviderComposite_Anbieter_Name=Nome del fornitore SubmittedFormsComposite_noErrorForms=Non ci sono moduli scaricati con errori. +ColumnHeaders_OrderNo=Numero d\u0027ordine +ColumnHeaders_Date=Data +ColumnHeaders_PatientNo=Numero del paziente +ColumnHeaders_PatientName=Nome del paziente +ColumnHeaders_Birthdate=Data di nascita +ColumnHeaders_Type=Tipo +ColumnHeaders_ExportsAndAttachments=Esportazioni e allegati +ColumnHeaders_Sender=Mittente +ColumnHeaders_Receiver=Destinatario +Composite_searchBoxMessage=Cerca per nome... +MedNetMainComposite_activateImport=Attiva Importazione Omnivore +BreadcrumbNavigation_customers=Clienti +BreadcrumbNavigation_providers=Fornitori +BreadcrumbNavigation_forms=Moduli +MedNetMainComposite_deactivateImport=Disattiva Importazione \ No newline at end of file diff --git a/bundles/ch.elexis.mednet.webapi.ui/icons/check-mark.png b/bundles/ch.elexis.mednet.webapi.ui/icons/check-mark.png new file mode 100644 index 0000000000000000000000000000000000000000..a4f9e689650906d1dc8362ebb08977bb05aff52a GIT binary patch literal 1142 zcmV-+1d02JP)N;RCGAqRK{v+jS-?_ zf?zhJ?B!z7Ma-N^FZ4oqQMhc<IYqBFHYRIn2ol9bTl_7IR{t6&VJmY)wxd#i{i? z|1Rdy^PCsY@nS`=@6~yJzwht&{r+FiAMW8lhWslk3ZbR=c}#QfYGjz&-VXt6cU}B! zVIs|18>l0Q0BQ(Rf6bk~yED*Kl#kE>q^(A-V>64Wx;*2iXq)ZX;X0exHPspwT)g-x zgl{e4c6*_xID{|*oz61_DD4TQQHml1u&<`(6@0IuzSMNHtu*$fTWdwlMJG|b&-wtT z&}o*k7UF#+|cG z2i2Xma|97ygF?~LKQh%f{(Fi?*hEx0Cwn^s)%l!)j@jl%l$gChc&Oq4=dO(6B@Rm7 zq^2jJIC#y#`I(kfT{Et+iID@eUH_TSM}G0{+)Z^)DT3Ol)^ZAT&3MNx?p#{t_FqO& z@$Mfde8e3wku)AT@JTRni-Atp2RnhM0cIALc>U5KHC^8@cGDTKcwl0hkFJhdVm4iP z`EUVQ$?>lSb?<4wG*pHA`&8c$)2>Bs%rElBSKsmJ&`%hqX({}5)IKYI{1%PX5g?IagST?LnlqotwKH zvVr9-e|7@n{z#6PNRIEzw#0NzL)H#1dK{#<>HxV`)iBS<8+mqps24I>>o-L29 znh8YkgwMj-<83dl%>BI$B_-ZDM@%G7=4X-=9YKW6?|aq|rK-vkYA=Q&4gnq{?W$e3 zJ0}|usRMM+oT-%Gbr<+UY4S|jmYT0a6%S~@jgHyoToLnaff67r0PPk+tKHBWOA@PH zn-LFcz>N#erZ`Qc2*pklGZ|z>P?LgoZ8anMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt=04T^vI!diPE~$a%;?!1eyR zm98c)odj|eIv$vE?YgTX?%S6naLIv-(@eN*Pxdt*8;j!)_a8T~=KjCx$kf$Ge_GYQ zkLKM|@-%G0)@yR=+)3d}+43Az9-UQje6vdA37^YCpMV98%}lyy0u(Gmr6)usn6dHu zC+y|uV3QLmIl9oaP4>cnGsX)~BNtC)iFefgS;a1O@`Y+yanMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&KtVG^Ht}Lapw1^`xJfv+DUcy;a^6Y=4_$lQ4Cy z*`5bo+mlQS``snO7$rXb5|d}zA=_H*5M8R6{_V1$(URjbY-TF|dRRq%d$3+gbP0l+XkKg$+|4 literal 0 HcmV?d00001 diff --git a/bundles/ch.elexis.mednet.webapi.ui/icons/on-off-button-gruen.png b/bundles/ch.elexis.mednet.webapi.ui/icons/on-off-button-gruen.png new file mode 100644 index 0000000000000000000000000000000000000000..a57be616b75a7a753553b9b45fcf15ce9742ff00 GIT binary patch literal 1098 zcmV-Q1hxB#P)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11J_AJ zK~z|UwU=LLTV)u=fA5#mwPhVm@j{CtleMB$*OL~Vg~1xy*sXJ@pk<(fNEr+-iVAwM zKOk;8+>|Mbpy-Xvn}KvV+I5L-P$<=E6P&%7|LTS4EOfQq);}hBy-2g1bCNE9%$~dR zyzl!w&-qBs_kBXSIB)kO^5WXl2|}??%8`+>%)@ODfsQ-o713>U$0tjbGGzrIwH7_IxTgm83f%89HgQ89O3r*8wVKgs3pM{KxdYeI+C)n4hl^h^FbJ)Y~Ai3~C{s57{UR0iTwF?7;Vn<3g z&ma^#f-vCXRG%dhc)}fEyrY&B$KB@gI^D5%%Qnv-t#Qm9g0~p&sLckrva}E34oAxb zb6dR2S3a!zLnz-mm^-<;+@B7h2qMqBC*%eCPA4lCAQ(*`GT>qNrvpS6v3 zH!T3_)=ufD!PoFL;8=3q!)R+u#l1(`?*V!p%q2F|j~jx~1jBR(M0-hm)LLun02&2N~CRH#mvKj{UDDxm@BO6Nyu!+z27V#xDOtx?{PlR^}o#{ zb_jUKP3o)k#%8kt0Op$B2ZkJ7RR}|b1J9Lhe%|g!nmC<4O6SE2!k;LAtf}0N(wN6I z<1$KO^+|S4&*hfZ!*}gf%%={byt1xvVJw3l!}1>`7)|8QRtUrPW-NIbcm^o)hNO#N zKE>#pbj5CXz9{~7JhF8oVtNq?g0_L&1^Cyh^T4k_3}KWdGsK?nuN5QvAAXrG1ScNj QU;qFB07*qoM6N<$g1_exXaE2J literal 0 HcmV?d00001 diff --git a/bundles/ch.elexis.mednet.webapi.ui/icons/on-off-button-rot.png b/bundles/ch.elexis.mednet.webapi.ui/icons/on-off-button-rot.png new file mode 100644 index 0000000000000000000000000000000000000000..f2012e4c58808f6cbfeb758ab6f538bea9cb85e2 GIT binary patch literal 1195 zcmV;c1XTNpP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11UN}V zK~z|UwU=FJTV)u>f6tqwOHR@mlh%DSt=&gKQP}WC!QobQ45y$26~PH2V=%lJ-sp`E z#7%}%(4h#*ypiFBpqmawrc=C-p@QO=7n`$Pb2i(CWL-a!e&n3Ti#E%9vX-P-_dqVr z|9zhS|Np)@ocDR4$;djXT?0<~@7Z7Kg=TrAnIboqx=%%ZvFcUf-mYT)x5aXqW(@eo zY$9l05ZT-e*SrSKvwoTDr1xi?)Co6{e(<^k)n$!fZlbL>>!eP&PWp|r&@!J^xEAP3 zCX?Z*D_<&X0YN<;7^Z#oZRExq*wD2Yradv``^P|*D?GY9mcIW&)Zel0%9X2jUf=|> zWMYx&@Ye`iu7N^gJTCFYhy%>kv|2p9Ez{cP*aKiLJM9}$da5h@lqnTXFO_&DGNr<4M1QtS-8qoB z^={*fzcpxAk1n-%mD&WkHMGruZnUwo?|*-@40wJhz%9ORG^nhvI%2GQa^zw?A_Lk8 zRvTTDLw&$R)d4*Q;g%|(Icb0h)qm!}&ebcM<(A=U4M~F%swPN7x8v1P;h4Zl3;J%b zR5;#9t)OB(gu|d?m77&zrGnHug}Y!{i}`Jr;_Vw?Mmr`({_1StFi1a8 zc@d-i@%9x={cV zxLNu}CBUt|oDzkw>!h>5$~oNgjc&Moyl{3Y#V@y}@9;d%FxLbL40ROq86!{@&GPM!A!Amz&`ed3{;{on(U64(8~(X0f~lWl`#=MHNN-O>N@>J z!_)B~E8^wY%yvY2748An0Li)K5#V2eKTthoO3`mtbGg_E@BiwWcedDsjS2t&002ov JPDHLkV1n8tM-Bi0 literal 0 HcmV?d00001 diff --git a/bundles/ch.elexis.mednet.webapi.ui/icons/toggel_green.png b/bundles/ch.elexis.mednet.webapi.ui/icons/toggel_green.png deleted file mode 100644 index e836b15dc57658b348eaad5f0e3f3dcfe91cc14e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2407 zcmZ{m2{7CH7RUco?Jm!n+DfcxEur?RC8(%IEvcon6%i4{RRfRqAj(wN+{JE zijrGJE$^a0b3;_EqE1m%W;ZOir@dN;)A^?yGE`H-+ z%zEJTvbDAZj{k`=N>v`q;R%Mj-2#B$y8cPFo}g-PmdO=ngRtUa@X2r)v8$&k4gdhR zwvDAZ(zR>G6=#ohkv#knO&Q_S8PsU>Op^QPHNxi63APC~cd(Q>n`E2g-5~s-+grFW zBM&*Cm={8{@K7L%cquw+gwXE8&4lF3xK%qFEG$L^bOb2vgthIqzbtsX^GS{*nBmp6 zo|&QDAyQk+E*Qj4^9ziB({`eOd5vr9_HF4r!GIk|%~>f4dN~pW+$4XV3&h}vne%tn z`7O*gRm;srRD{P#gU%~~?uE~dAfc$g#=1XI_eu{RM(Q8wa_>9=G7Lt z`Gz`4H_2ZQs1}UN%fsnc?3mfirvnZ?lfsjebsJc`-jV%$DT+10WT66HE6NQ!*$0i8 zkPKe_UrOOaeeL#NY^XBW(RUL!e(NO{7*Cs}zwRtRpZBEg?4tS?OY9KW@%`i=F-14f znP=JBHUJvXxpu$~WN@`YT_rd>fHb)dx0PyfKC6>9|JrCXg?qT{50g_FA@w&J&iHL4 zal#T+=uUpFt!tVnu|eIqI$Ti9JDAf)2h4P=dQ7e$%;XD9Sg{M0)zk3ezSoO|pyxZQ z??Lcfj#u`dBrj+k&>u+@#<@++)|ALXPx)|MZlyKR0+QGGhRtmb@wupndoFN=XY(gt$&CXD8OTIrCO2Mn@6Fv$AKxmTk2c~jAtOg-BxM z_5)khM+In*>xv>c;7Hb_iZsJ$E|7JPR|XH?uqM+ zBb zuhHhbrh%gsy4eFc(N!Rgf^YIBy^o_9eXm|*&1xu7L2Q6fS_4V+Xb)Y|(=GBDzuo^r zOTv1xb2;cA?$CJIq%wgGnW7gkL7F_LHPX#A5#5gc)xrAV0aZ;&;e50_Bvk(V*n~oVmdbZ?XmEvR z#-5~wi|B`Hr(a$jPn9w6K;%cV*KwCeblf{Y-$X)q_Sic>^Ff;g2J#I=QV85~q{m@a z-KI-Op76`rddd6%B+8Ai@eXaZ_7-pCk=gF_Ug&W8!5Kw)s!cmtg)rgnjJ$F1S!GM~`)G86s#E2!_$3MF(D8X&H z{z6SAq+G4AF#K>%Bt&=lQ*hm)@~bm`uY&xWsi{)la-8%SkM=;3a|ae0sCWmo9M$!H z_+e+Qa^LrcfJqOA-j1=jU{460ImaU~DUKq9_xkG%DW94iQi=32$u6|eh}E@m_i%Xv z*J?bGk+=lmFJd8YhXP4H1=?OgW4Yn zaomZX*prA~<>V`I$*Mv1f$4li6H9O+;TiW8ErTqP8zeQ4;|)?Q>9p*XJnob1@V0z5 ziT==p`4;&eFgl#*w+6RS3V-Vt28{%|#dmhQ~u{w2#cMFM%wGqFl| zLHJZroliBb2}ZaIksi9h_F!r_um8AdHqWbQ;h;?kGNYVC^R&z97-~@r*x|aQ|6XD$ zBFJ;3RmxCKE|L-9kMDTWZyiBfz2+lmf`1ae4$sXaG9N2L4#-gh)Zzt3_rCs8-59%> zrX!d?69A!YoWEKXZWW_vFZOBIQLKOce(hyRcSED+dcAU!$Zkq@X*>2^e$f@ZZl%Yn z)To!b3TvVq*#c%5#OqFztvq;J~b%H}dozNmLGPT=cXfVUt93M(+^A!A{YEFk8 zT{Yr9kprfgGy$q+GB>+_?z+jqxSzp7mQKg0FyWCQd$WaD4XBTJagwQ3x8Qj6-q=;& zwXuXh?F<&DYO9Wm;+n%Ky?)NxYDpJA-`k2md;Iq3Xthb^COk8zt)RO7pt&@5jh?Lv zIP7bm_)|$6h)+1bo^v8qUJoK$Gr5v+^W~m3X~M5}6lA1jE)=1cb;}E{wqZuc3UCX= z2-coPMhH#q8m3k1E2yN%7B8EAJIrXBvYqkaY$y$y=HbO=C)6KH%}-}a`;PjfX1->Z zg@3ua>3cLmKb){e!*ltYNAfR?K6Se0TMO!9v>wg;#g9@UU0(8AL-wQUrxA-Whb1j8 zo5G!5kDmu!Pycf7N&@MUnCgt^+td1@^8RS~<{A*8t~MEQ&#|ojY45kE^U)VxPXDpE z_=B;syh2|XQh@WwZGAWC^aA*c-}gadSqssGR2)-G8C)KJ)Z)x6k;KfldYx-AGBD5Z z+rKY*d{VBtQWkbvZ-aGED1}+MhIymHFh=N53`+oQsJ4!}mX^A{>09QENegQVS@fV#}&66cl7thKPU+0pWlOvXm_% z1rBAXh=4)`EPE(J*+Z7B1A=Ai?a57Ua&vR@=6FhlJ(LmG5cX zsJ{p5muUf|4;(Bu(W+kl8l#nOntHjs?ZrpzBU-#mga}{&h#bq+tJ0Z4fW$!npxNfF z!OFLm(wbOH>QSzWGAwuW`j(^l?m}+mJO3(o0z54FL?34e%fDEj&vnlAYs1 z{GPHV)@>jmt9-QOjBV)DjYIQA1y2|#`k0KHVZ&lJ=dz>v>>p5)+Li6;=)EI~-%=1L zqtZLi1pqX_2IO4PTddFV!B#z&gW)M+F;IUpNs*ql@qR-|)=dQTt}lQ7*R1979q-+mC!~V zm=`~`y)pBu3ae&afe#Ppf*O)K1sYEf_^-htj!w{po{w(srK}jKeyOFt>P*~ZZhTPI z1cTNS?`l_dIPshANvoK5h4P)bU@=`=3RB}QnJ*O9{?ripal7*DhMzn!xwRl9uz^?? zy+X8l0}l?e9As`SkJfgF^@HVMLWi|+tlLX|qu)=G%rgyguTpS4cJqX1!sKG zi!&vfmj zE$>D+3^)`{ONi=2ln~>Jc9OhbMy~QjSGJ>5v9t*6UiQkZ^wJ?msW;RE{vqceo~c~~ zADL?+c%@3q1DPc<@(}`f!R}0Fou8EHqYa;HMlN;%J=1^rn)e}ef!iNdchAwbTs)*- z7+-t~h6rxpW8{#TI-Uwqotfek|8;a9<;q_3(P8aBu;reJvao&6(>kXSpg5yP8H+mn zIQgsjhpP=#n=Z_Bis3-*IE{+gu&(f33o`nv! zAD>e>wO7~Tp@h=RIx9S2uB5+8y+ugt%%FVoo|wE7UVb|-Mp!~6p;_Ld-iNz z*4MHuq0DoCqn;`iTw76qK^{MR{P;n|eN^4%m-!0IgwoxIwcOby8a7*a=}W9E;YL*t z;1OwLv3~Q|Tvi~oS8#QZTc5j;CUh#O-p)hKOP!`F+TeD*6Wz|wcl6@mrhqU8t16Qp zyem3lNz`U;vp_=u;PjHWtlipej$jf~aTvlWWYWe*Gp za&|%1Zr{Zum`l+v*u-?Uod&02>4>WD?xVB)`AU1{6e*nLS7n7f{?H_cES-Y&?P~#LoIh0#oUN&z8oAPE z`=|rj**tZprX^3pzJxj!_B$%nWl$Pv6QbbRb5_RARbUR5{o!iuJ*`f!9;>)^roUq(ag-y!ujvAH}3Fg7y7l^D>%{{pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10+C5X zK~z|U?Uv0;R8bhlf9Kx$bVjGuz+grn3$dYuifq}oXq>c!p!x?w3W5mQWcIa*sKmf+ z6fJ~^5OEQ-Y@-U#>tc0!SwA0oPXKfT-K#7VClQeyMyrAd?-f zC})&E#oHLFO|`rp^TTKODlR<+${BDe4q)QQfJm3QWdbOCxD2$dlW~~BVz(bk?Jbae zX9}?kKw^W`B9^&dwZ8hI!>jLr*!>#C0qO}lk9BFa1V}!666mOokA05w{!@d?1nHDq zCi_+<4Zt2}OqdUjwFjCFg1 zw*&d{Zs3^L=UBM3YNendYI&uBaD@EwC0_z0-y;&g=bTE|=3)`3*ALYC9@l>O> z0L1QNgFCMj#3Bv}Z~H4zk7Yj65+J$LCxA0Ltb3CS>`N}_qyn6kTzh+Ua7`#Bbs(yGb&CT`&4!tpjp(KW?1H76m4UJYQpg^_ zVGNIJSB-B!LtK4X()!@s6sa9cx*{x)qbmJo94Z}f zMFGe}wh4o2KP&*YlngYL_8F*sF2nB@z0000pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10>eo} zK~z|U?UqeX6Hyd~pF7iv@*zSfh=?L_rBS02F>&L@1tw?&3PusZ1(6RSE{F*mD}F9T zpwh&JHkue4T^fIc#0}An0Yb!J&;)3K7CQI302-)mnJKa`@~&piob#S1=ia$9u&MuD zBAKGoE|<-bJKPCe0ihJaD{=x4ebqk0s+TPp07ve~0}vg{_X2fS{7TONZdvuRJb{}2 zYe%FsK7xpbH$av8nqLf9@zbm%yId|!O6iHw96$%*alUct8wN0#JJJS}CP+EXL|UsA zPt!|K;i=8n4ciwWbB$EL5w;z8*Y@n28DG;A(8KmV6U_lKbX&OFtgk76>i+t(2z4Pk zUQ%?FQ~P7CNJUj|!}-4gQ0{3=Rg%8wctO@KI?8U)e&#yaX<2{N2~G7l`&8;&If;BvV% z4b21CV*-Q%k?X0s>3BA}6f)u25EtNc-f$~$GT!q*Xchp4VtURWFAan!Q9sj~Edf+` zYV(y6UGZHZI3L82l0a|(ImqUw;glNd+aUobIdVqQk3>;&M-8>Q-ZZ5ZGtNGsT{Qlm-h%*c=3mqEZj~ zTHKKxylMj5!V6tyn*$W*?4{UYIvrq-5;M0~1|k!1_S7FjXMi}bU9@&)=F)xX5h%F% zx|8pd<0ctYSPFIGZIkyCtek+Z+-94@;z2YyJH_PO6#igf?ShDeO;h4Ybm7usF!vzU%P=lHuaC`H&dPDkWAOmMF0Q*07*qoM6N<$f+;g= AUH||9 diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/Activator.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/Activator.java index 8e62ed201..05000a75f 100644 --- a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/Activator.java +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/Activator.java @@ -1,7 +1,33 @@ +/** + * ----------------------------------------------------------------------------- + * Programmed by: Dalibor Aksic + * Company: Medelexis AG + * Industry: Software Company + * Address: Täfernstrasse 16, 5405 Dättwil, Baden, Switzerland + * + * Description: + * This file is part of the Medelexis MedNet Web API project. It serves as an + * API integration with MedNet to manage patient data exchange in FHIR (Fast + * Healthcare Interoperability Resources) format. The exchanged data ensures + * that forms are created correctly and meet healthcare standards. + * + * The Activator class manages the plugin lifecycle and schedules periodic tasks + * to automatically download files from MedNet and import them into Omnivore. + * + * Date: 04.12.2024 + * + * NOTE: This code is proprietary and confidential. Unauthorized copying or + * distribution of this file, via any medium, is strictly prohibited. + * ----------------------------------------------------------------------------- + */ package ch.elexis.mednet.webapi.ui; -import org.eclipse.ui.plugin.AbstractUIPlugin; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + import org.eclipse.core.runtime.IStatus; +import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.slf4j.Logger; @@ -12,10 +38,6 @@ import ch.elexis.mednet.webapi.core.fhir.resources.util.FileDownloader; import ch.elexis.mednet.webapi.ui.handler.ImportOmnivore; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - public class Activator extends AbstractUIPlugin { private static final Logger logger = LoggerFactory.getLogger(Activator.class); @@ -41,9 +63,6 @@ public static Activator getInstance() { return instance; } - /** - * Startet den Scheduler und die wiederkehrende Aufgabe manuell. - */ public void startScheduler() { if (scheduler == null || scheduler.isShutdown()) { scheduler = Executors.newSingleThreadScheduledExecutor(); @@ -56,23 +75,34 @@ public void run() { .getServiceReference(IMednetAuthService.class); IMednetAuthService authService = context.getService(serviceReference); + boolean downloadSuccess = false; + if (authService != null) { FileDownloader downloader = new FileDownloader(authService); - downloader.downloadForms(); - logger.info("File download initiated successfully."); //$NON-NLS-1$ + downloadSuccess = downloader.downloadForms(); + if (downloadSuccess) { + logger.info("File download initiated successfully."); //$NON-NLS-1$ + } else { + logger.error("File download failed."); //$NON-NLS-1$ + } } else { logger.error("IMednetAuthService not available."); //$NON-NLS-1$ } - IStatus status = new ImportOmnivore().run(); // $NON-NLS-1$ - if (!status.isOK()) { - throw new TaskException(TaskException.EXECUTION_ERROR, - "Import failed with status: " + status.getMessage()); //$NON-NLS-1$ + if (downloadSuccess) { + IStatus status = new ImportOmnivore().run(); // $NON-NLS-1$ + if (!status.isOK()) { + throw new TaskException(TaskException.EXECUTION_ERROR, + "Import failed with status: " + status.getMessage()); //$NON-NLS-1$ + } else { + logger.info("Import completed successfully."); //$NON-NLS-1$ + } } else { - logger.info("Import completed successfully."); //$NON-NLS-1$ + notifySchedulerError(); } } catch (Exception ex) { logger.error("Error during task execution: {}", ex.getMessage(), ex); //$NON-NLS-1$ + notifySchedulerError(); } } }, 0, 5, TimeUnit.MINUTES); @@ -82,13 +112,24 @@ public void run() { } } - /** - * Stoppt den Scheduler. - */ + public void stopScheduler() { if (scheduler != null && !scheduler.isShutdown()) { scheduler.shutdownNow(); logger.info("Scheduler shut down."); //$NON-NLS-1$ } } + + private Runnable onSchedulerError; + + public void setOnSchedulerError(Runnable onSchedulerError) { + this.onSchedulerError = onSchedulerError; + } + + public void notifySchedulerError() { + if (onSchedulerError != null) { + onSchedulerError.run(); + } + } + } diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/MednetAuthUi.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/MednetAuthUi.java index 981a45631..9a5250e81 100644 --- a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/MednetAuthUi.java +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/MednetAuthUi.java @@ -52,7 +52,6 @@ public Object getWithCancelableProgress(String name, Supplier supplier) { RetrySupplierRunnableWithProgress runnable = new RetrySupplierRunnableWithProgress(name, supplier); progressDialog.run(true, true, runnable); supplierValue = runnable.getValue(); - logger.info("Supplier completed with value: {}", supplierValue); //$NON-NLS-1$ } catch (InvocationTargetException | InterruptedException e) { logger.error("Error while executing supplier: {}", e.getMessage(), e); //$NON-NLS-1$ } diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/DataHandler.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/DataHandler.java index 05328f917..c623d41df 100644 --- a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/DataHandler.java +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/DataHandler.java @@ -1,9 +1,10 @@ package ch.elexis.mednet.webapi.ui.handler; -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import com.google.gson.JsonSyntaxException; -import com.google.gson.reflect.TypeToken; +import java.lang.reflect.Type; +import java.util.List; +import java.util.Map; +import java.util.Optional; + import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.widgets.Display; @@ -12,6 +13,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import com.google.gson.reflect.TypeToken; + import ch.elexis.core.model.IDocument; import ch.elexis.core.model.IPatient; import ch.elexis.core.services.holder.ContextServiceHolder; @@ -19,11 +25,6 @@ import ch.elexis.mednet.webapi.core.messages.Messages; import ch.elexis.mednet.webapi.ui.parts.DocumentsSelectionDialog; -import java.lang.reflect.Type; -import java.util.List; -import java.util.Map; -import java.util.Optional; - public class DataHandler { private static final Logger logger = LoggerFactory.getLogger(DataHandler.class); diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/ImportOmnivoreUtil.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/ImportOmnivoreUtil.java index feeb744ae..94d1c90ae 100644 --- a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/ImportOmnivoreUtil.java +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/ImportOmnivoreUtil.java @@ -24,14 +24,9 @@ import ch.elexis.core.model.MimeType; import ch.elexis.core.services.IConfigService; import ch.elexis.core.services.IDocumentStore; -import ch.elexis.core.services.IQuery; -import ch.elexis.core.services.IQuery.COMPARATOR; -import ch.elexis.core.services.holder.CoreModelServiceHolder; import ch.elexis.data.Patient; import ch.elexis.data.Query; import ch.elexis.mednet.webapi.core.constants.PreferenceConstants; -import ch.elexis.mednet.webapi.core.constants.TransientCategory; -import ch.elexis.mednet.webapi.core.service.OmnivoreModelServiceHolder; @Component diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/PatientFetcher.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/PatientFetcher.java index 4b3651443..ee04ad3f1 100644 --- a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/PatientFetcher.java +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/PatientFetcher.java @@ -74,7 +74,8 @@ public PatientFetcher(String token) { public String fetchCustomerId() { String response = ""; try { - response = Request.Get(ApiConstants.CUSTOMERS_URL).addHeader("Authorization", "Bearer " + token).execute() + response = Request.Get(ApiConstants.getBaseApiUrl() + ApiConstants.CUSTOMERS_URL) + .addHeader("Authorization", "Bearer " + token).execute() .returnContent() .asString(); } catch (IOException e) { @@ -84,7 +85,7 @@ public String fetchCustomerId() { } public String fetchProvidersId(int customerID) { - String apiUrl = String.format(ApiConstants.PROVIDERS_URL, customerID); + String apiUrl = String.format(ApiConstants.getBaseApiUrl() + ApiConstants.PROVIDERS_URL, customerID); String response = ""; try { response = Request.Get(apiUrl).addHeader("Authorization", "Bearer " + token).execute().returnContent() @@ -96,7 +97,7 @@ public String fetchProvidersId(int customerID) { } public String fetchFormsByProviderIdWithRetry(Integer customerId, Integer providerId) { - String apiUrl = String.format(ApiConstants.FORMS_URL, customerId, providerId); + String apiUrl = String.format(ApiConstants.getBaseApiUrl() + ApiConstants.FORMS_URL, customerId, providerId); String response = ""; int retryCount = 0; boolean success = false; @@ -154,7 +155,7 @@ private boolean isValidJsonArray(String response) { } public String fetchSubmitFormsId(int customerID) { - String apiUrl = String.format(ApiConstants.SUBMITTED_FORMS_URL, customerID); + String apiUrl = String.format(ApiConstants.getBaseApiUrl() + ApiConstants.SUBMITTED_FORMS_URL, customerID); String response = ""; try { @@ -196,7 +197,7 @@ public String fetchSubmitFormsId(int customerID) { public String fillPatientData(IPatient sourcePatient, JsonObject patientJson, List selectedDocuments, boolean isEpdSelected) { - String apiUrl = ApiConstants.PATIENTS_URL; + String apiUrl = ApiConstants.getBaseApiUrl() + ApiConstants.PATIENTS_URL; Bundle patientOverviewBundle = new Bundle(); Patient fhirPatient = resourceFactory.getResource(sourcePatient, IPatient.class, Patient.class); diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/TableHelper.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/TableHelper.java index f24a62884..b517f05e2 100644 --- a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/TableHelper.java +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/handler/TableHelper.java @@ -1,19 +1,24 @@ package ch.elexis.mednet.webapi.ui.handler; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableItem; -import ch.elexis.mednet.webapi.ui.fhir.util.UIStyleHelper; - import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableItem; + +import ch.elexis.mednet.webapi.ui.util.UIStyleTableHelper; + public class TableHelper { + private static boolean ascending = true; public static void fillTableFromList(Table table, List> list, Display display, String[] keys, String[] defaultValues) { @@ -80,9 +85,9 @@ public static void fillTableFromList(Table table, List> list item.setData("packageId", packageId); // Speichere die packageId im TableItem } - UIStyleHelper.styleTableRows(item, table.indexOf(item), display); + UIStyleTableHelper.styleTableRows(item, table.indexOf(item), display); } - UIStyleHelper.addTableLines(table); + UIStyleTableHelper.addTableLines(table); } private static String convertToString(Object value) { @@ -129,4 +134,76 @@ private static String formatBirthDate(String birthDate) { return "Invalid Date"; //$NON-NLS-1$ } } + + /** + * Sorts the table by the values in the specified column index. + */ + public static void sortTable(Table table, int columnIndex) { + if (table.isDisposed()) { + return; + } + + List tableData = new ArrayList<>(); + for (TableItem item : table.getItems()) { + if (!item.isDisposed()) { + String[] rowData = new String[table.getColumnCount()]; + for (int i = 0; i < table.getColumnCount(); i++) { + rowData[i] = item.getText(i); + } + tableData.add(rowData); + } + } + + if (ascending) { + tableData.sort(Comparator.comparing(row -> row[columnIndex].toLowerCase())); + } else { + tableData.sort((row1, row2) -> row2[columnIndex].toLowerCase().compareTo(row1[columnIndex].toLowerCase())); + } + ascending = !ascending; + + table.removeAll(); + Display display = table.getDisplay(); + int rowIndex = 0; + for (String[] rowData : tableData) { + TableItem newItem = new TableItem(table, SWT.NONE); + newItem.setText(rowData); + UIStyleTableHelper.styleTableRows(newItem, rowIndex, display); + rowIndex++; + } + } + + /** + * Filters the table items based on the search text. + */ + public static void filterTable(Table table, String searchText) { + if (table.getData("originalData") == null) { + List originalData = new ArrayList<>(); + for (TableItem item : table.getItems()) { + String[] rowData = new String[table.getColumnCount()]; + for (int i = 0; i < table.getColumnCount(); i++) { + rowData[i] = item.getText(i); + } + originalData.add(rowData); + } + table.setData("originalData", originalData); + } + + table.removeAll(); + @SuppressWarnings("unchecked") + List originalData = (List) table.getData("originalData"); + + Display display = table.getDisplay(); + int rowIndex = 0; + for (String[] rowData : originalData) { + String name = rowData[1].toLowerCase(); + if (name.contains(searchText)) { + TableItem newItem = new TableItem(table, SWT.NONE); + newItem.setText(rowData); + newItem.setData("rowData", rowData); + UIStyleTableHelper.styleTableRows(newItem, rowIndex, display); + rowIndex++; + } + } + } + } diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/navigation/NavigationState.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/navigation/NavigationState.java new file mode 100644 index 000000000..6b22e9309 --- /dev/null +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/navigation/NavigationState.java @@ -0,0 +1,37 @@ +package ch.elexis.mednet.webapi.ui.navigation; + +import ch.elexis.mednet.webapi.core.constants.StateConstants; + +public class NavigationState { + public String state; + public Integer customerId; + public Integer providerId; + public Integer formId; + public String formName; + public String customerName; + public String providerName; + + public NavigationState(String state, Integer customerId, Integer providerId, Integer formId, String formName, + String customerName, String providerName) { + this.state = state; + this.customerId = customerId; + this.providerId = providerId; + this.formId = formId; + this.formName = formName; + this.customerName = customerName; + this.providerName = providerName; + } + + public String getDisplayName() { + switch (state) { + case StateConstants.CUSTOMER: + return customerName != null ? customerName : "Kunden"; + case StateConstants.PROVIDER: + return providerName != null ? providerName : "Anbieter"; + case StateConstants.FORM: + return formName != null ? formName : "Formulare"; + default: + return ""; + } + } +} diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/CustomerComposite.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/CustomerComposite.java index f61db6f8e..f4404ad62 100644 --- a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/CustomerComposite.java +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/CustomerComposite.java @@ -1,63 +1,102 @@ package ch.elexis.mednet.webapi.ui.parts; import java.util.function.Consumer; + import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Text; import ch.elexis.mednet.webapi.core.messages.Messages; -import ch.elexis.mednet.webapi.ui.fhir.util.UIStyleHelper; import ch.elexis.mednet.webapi.ui.handler.DataHandler; +import ch.elexis.mednet.webapi.ui.handler.TableHelper; +import ch.elexis.mednet.webapi.ui.util.UIStyleTableHelper; public class CustomerComposite { private Composite parent; private Consumer loadProvidersCallback; + private ICustomerSelectionListener customerSelectionListener; + + public interface ICustomerSelectionListener { + void onCustomerSelected(Integer customerId, String customerName); + } - public CustomerComposite(Composite parent, Consumer loadProvidersCallback) { + public CustomerComposite(Composite parent, ICustomerSelectionListener customerSelectionListener) { this.parent = parent; - this.loadProvidersCallback = loadProvidersCallback; + this.customerSelectionListener = customerSelectionListener; } public void show() { - parent.setLayout(UIStyleHelper.createStyledGridLayout()); - Table customerTable = UIStyleHelper.createStyledTable(parent); + parent.setLayout(UIStyleTableHelper.createStyledGridLayout()); + + Text searchBox = new Text(parent, SWT.SEARCH | SWT.ICON_SEARCH | SWT.CANCEL); + searchBox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + searchBox.setMessage(Messages.Composite_searchBoxMessage); + + Table customerTable = UIStyleTableHelper.createStyledTable(parent); - // Define column headers including new columns for "First Name" and "Last Name" String[] columnHeaders = { Messages.CustomerComposite_customerID, Messages.CustomerComposite_customerFirstName, Messages.CustomerComposite_customerLastName }; - int[] columnWidths = { 100, 150, 150 }; // Adjust widths as needed + int[] columnWidths = { 0, 150, 150 }; + + TableColumn[] columns = new TableColumn[columnHeaders.length]; - UIStyleHelper.addTableColumns(customerTable, columnHeaders, columnWidths); + for (int i = 0; i < columnHeaders.length; i++) { + TableColumn column = new TableColumn(customerTable, SWT.NONE); + column.setText(columnHeaders[i]); + column.setWidth(columnWidths[i]); + columns[i] = column; + + if (i == 0) { + column.setResizable(false); + } + + final int columnIndex = i; + column.addListener(SWT.Selection, event -> { + TableHelper.sortTable(customerTable, columnIndex); // Use TableHelper + }); + } - // Fetch and display customers in the table DataHandler.fetchAndDisplayCustomers(customerTable); - // Adjust column widths on table resize + searchBox.addModifyListener(event -> { + String searchText = searchBox.getText().toLowerCase(); + TableHelper.filterTable(customerTable, searchText); // Use TableHelper + }); + customerTable.addListener(SWT.Resize, event -> { int tableWidth = customerTable.getClientArea().width; int totalWidth = 0; + + // Calculate the width of all columns except the last one for (int i = 0; i < customerTable.getColumnCount() - 1; i++) { totalWidth += customerTable.getColumn(i).getWidth(); } + + // Adjust the last column to fill the remaining space int remainingWidth = Math.max(100, tableWidth - totalWidth); - customerTable.getColumn(customerTable.getColumnCount() - 1).setWidth(remainingWidth); + columns[columns.length - 1].setWidth(remainingWidth); }); - // Handle double-click events to load providers customerTable.addListener(SWT.MouseDoubleClick, event -> { TableItem[] selection = customerTable.getSelection(); if (selection.length > 0) { TableItem selectedItem = selection[0]; Integer customerId = Integer.parseInt(selectedItem.getText(0)); + String customerFirstName = selectedItem.getText(1); + String customerLastName = selectedItem.getText(2); + String customerName = customerFirstName + " " + customerLastName; if (customerId != null) { - loadProvidersCallback.accept(customerId); + customerSelectionListener.onCustomerSelected(customerId, customerName); } } }); + parent.layout(); } + } diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/FormComposite.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/FormComposite.java index fe9dd5e07..172751045 100644 --- a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/FormComposite.java +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/FormComposite.java @@ -1,22 +1,32 @@ package ch.elexis.mednet.webapi.ui.parts; import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Text; import ch.elexis.mednet.webapi.core.messages.Messages; -import ch.elexis.mednet.webapi.ui.fhir.util.UIStyleHelper; import ch.elexis.mednet.webapi.ui.handler.DataHandler; +import ch.elexis.mednet.webapi.ui.handler.TableHelper; +import ch.elexis.mednet.webapi.ui.util.UIStyleTableHelper; public class FormComposite { private Composite parent; private Integer customerId; private Integer providerId; - public FormComposite(Composite parent) { + public interface IFormSelectionListener { + void onFormSelected(Integer customerId, Integer providerId, Integer formId, String formName); + } + + private IFormSelectionListener formSelectionListener; + + public FormComposite(Composite parent, IFormSelectionListener formSelectionListener) { this.parent = parent; + this.formSelectionListener = formSelectionListener; } /** @@ -26,48 +36,86 @@ public FormComposite(Composite parent) { * @param providerId Die ID des Anbieters. */ public void show(Integer customerId, Integer providerId) { - this.customerId = customerId; - this.providerId = providerId; - parent.setLayout(UIStyleHelper.createStyledGridLayout()); + this.customerId = customerId; + this.providerId = providerId; + parent.setLayout(UIStyleTableHelper.createStyledGridLayout()); - Table formTable = UIStyleHelper.createStyledTable(parent); + // Create search text box + Text searchBox = new Text(parent, SWT.SEARCH | SWT.ICON_SEARCH | SWT.CANCEL); + searchBox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + searchBox.setMessage(Messages.Composite_searchBoxMessage); - String[] columnHeaders = { Messages.FormComposite_formId }; - int[] columnWidths = { 100 }; + Table formTable = UIStyleTableHelper.createStyledTable(parent); - UIStyleHelper.addTableColumns(formTable, columnHeaders, columnWidths); + // Define column headers + String[] columnHeaders = { Messages.FormComposite_formId, Messages.FormComposite_formName }; + int[] columnWidths = { 0, 150 }; // Set the ID column width to 0 to make it invisible - TableColumn nameColumn = new TableColumn(formTable, SWT.NONE); - nameColumn.setText(Messages.FormComposite_formName); - nameColumn.setResizable(true); + TableColumn[] columns = new TableColumn[columnHeaders.length]; - DataHandler.fetchAndDisplayFormsForProvider(formTable, providerId, customerId); + for (int i = 0; i < columnHeaders.length; i++) { + TableColumn column = new TableColumn(formTable, SWT.NONE); + column.setText(columnHeaders[i]); + column.setWidth(columnWidths[i]); + columns[i] = column; - formTable.addListener(SWT.Resize, event -> { - int tableWidth = formTable.getClientArea().width; - int totalWidth = 0; - for (int i = 0; i < formTable.getColumnCount() - 1; i++) { - totalWidth += formTable.getColumn(i).getWidth(); - } + if (i == 0) { + column.setResizable(false); // Disable resizing for the first (hidden) column + } - nameColumn.setWidth(Math.max(100, tableWidth - totalWidth)); - }); + final int columnIndex = i; + column.addListener(SWT.Selection, event -> { + TableHelper.sortTable(formTable, columnIndex); // Use TableHelper for sorting + }); + } + + // Fetch and display forms in the table + DataHandler.fetchAndDisplayFormsForProvider(formTable, providerId, customerId); - formTable.addListener(SWT.MouseDoubleClick, event -> { - TableItem[] selection = formTable.getSelection(); - if (selection.length > 0) { - TableItem selectedItem = selection[0]; - try { - Integer formId = Integer.parseInt(selectedItem.getText(0)); - if (formId != null) { - DataHandler.fillPatientData(customerId, providerId, formId); - } - } catch (NumberFormatException e) { - e.printStackTrace(); - } - } + // Add listener for search box + searchBox.addModifyListener(event -> { + String searchText = searchBox.getText().toLowerCase(); + TableHelper.filterTable(formTable, searchText); // Use TableHelper for filtering }); - parent.layout(); + // Adjust column widths dynamically to make the last column fill the remaining + // space + formTable.addListener(SWT.Resize, event -> { + int tableWidth = formTable.getClientArea().width; + int totalWidth = 0; + + // Sum up the widths of all columns except the last one + for (int i = 0; i < formTable.getColumnCount() - 1; i++) { + totalWidth += formTable.getColumn(i).getWidth(); + } + + // Set the last column to fill the remaining space + int remainingWidth = Math.max(100, tableWidth - totalWidth); + columns[columns.length - 1].setWidth(remainingWidth); + }); + + // Handle double-click events to fill patient data + formTable.addListener(SWT.MouseDoubleClick, event -> { + TableItem[] selection = formTable.getSelection(); + if (selection.length > 0) { + TableItem selectedItem = selection[0]; + try { + Integer formId = Integer.parseInt(selectedItem.getText(0)); + String formName = selectedItem.getText(1); // Annahme: FormName ist in Spalte 1 + if (formId != null) { + DataHandler.fillPatientData(customerId, providerId, formId); + if (formSelectionListener != null) { + formSelectionListener.onFormSelected(customerId, providerId, formId, formName); + } + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + }); + + + parent.layout(); } + } diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/MedNetMainComposite.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/MedNetMainComposite.java index 281a22617..27ab080b1 100644 --- a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/MedNetMainComposite.java +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/MedNetMainComposite.java @@ -7,18 +7,13 @@ import org.eclipse.e4.ui.services.EMenuService; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseTrackAdapter; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.wb.swt.ResourceManager; import org.osgi.framework.BundleContext; @@ -27,15 +22,16 @@ import org.osgi.service.component.annotations.ReferenceCardinality; import org.osgi.service.component.annotations.ReferencePolicyOption; -import ch.elexis.core.services.IConfigService; import ch.elexis.mednet.webapi.core.IMednetAuthUi; import ch.elexis.mednet.webapi.core.constants.IconConstants; import ch.elexis.mednet.webapi.core.constants.PreferenceConstants; +import ch.elexis.mednet.webapi.core.constants.StateConstants; import ch.elexis.mednet.webapi.core.constants.URLConstants; import ch.elexis.mednet.webapi.core.messages.Messages; -import ch.elexis.mednet.webapi.ui.Activator; import ch.elexis.mednet.webapi.ui.handler.PatientFetcher; - +import ch.elexis.mednet.webapi.ui.navigation.NavigationState; +import ch.elexis.mednet.webapi.ui.util.ButtonFactory; +import ch.elexis.mednet.webapi.ui.util.CompositeEffectHandler; public class MedNetMainComposite { @@ -50,8 +46,7 @@ public class MedNetMainComposite { private SubmittedFormsComposite submittedFormsComposite; private PatientFetcher patientFetcher; private Color customBlue; - private boolean isConnected = false; - + private Composite navigationBreadcrumbComposite; @PostConstruct public void createControls(Composite parent, EMenuService menuService) { @@ -63,138 +58,65 @@ public void createControls(Composite parent, EMenuService menuService) { navigationComposite.setLayout(new GridLayout(1, false)); this.customBlue = new Color(parent.getDisplay(), new RGB(42, 108, 155)); navigationComposite.setBackground(customBlue); + Composite mainContentComposite = new Composite(parent, SWT.NONE); + mainContentComposite.setLayout(new GridLayout(1, false)); + mainContentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + navigationBreadcrumbComposite = new Composite(mainContentComposite, SWT.NONE); + GridLayout breadcrumbLayout = new GridLayout(10, false); + breadcrumbLayout.marginHeight = 5; + breadcrumbLayout.marginWidth = 5; + navigationBreadcrumbComposite.setLayout(breadcrumbLayout); + GridData breadcrumbGridData = new GridData(SWT.FILL, SWT.TOP, true, false); + breadcrumbGridData.heightHint = 30; + navigationBreadcrumbComposite.setLayoutData(breadcrumbGridData); + medNetViewerComposite = new Composite(mainContentComposite, SWT.NONE); + medNetViewerComposite.setLayout(new GridLayout(1, false)); + medNetViewerComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + createLogoAndButtons(navigationComposite); + showInitialLogo(); + parent.addDisposeListener(e -> { + customBlue.dispose(); + }); + } + private void createLogoAndButtons(Composite navigationComposite) { Composite logoComposite = new Composite(navigationComposite, SWT.NONE); logoComposite.setLayout(new GridLayout(2, false)); logoComposite.setBackground(customBlue); GridData logoCompositeGridData = new GridData(SWT.CENTER, SWT.CENTER, true, false); logoCompositeGridData.heightHint = 80; logoComposite.setLayoutData(logoCompositeGridData); - Label imageLabel = new Label(logoComposite, SWT.NONE); imageLabel.setImage( ResourceManager.getPluginImage(PreferenceConstants.MEDNET_PLUGIN_STRING, IconConstants.ICON_HEARTBEAT)); imageLabel.setBackground(customBlue); - Label logoLabel = new Label(logoComposite, SWT.NONE); logoLabel.setImage(ResourceManager.getPluginImage(PreferenceConstants.MEDNET_PLUGIN_STRING, IconConstants.ICON_LOGO_MEDNET_WHITE)); - logoLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE)); + logoLabel.setForeground(navigationComposite.getDisplay().getSystemColor(SWT.COLOR_WHITE)); logoLabel.setBackground(customBlue); - GridData logoGridData = new GridData(SWT.CENTER, SWT.CENTER, true, false); - logoLabel.setLayoutData(logoGridData); - - Composite toggleComposite = new Composite(navigationComposite, SWT.NONE); - toggleComposite.setLayout(new GridLayout(2, false)); - toggleComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - toggleComposite.setBackground(customBlue); - - Image toggelRedImage = ResourceManager.getPluginImage(PreferenceConstants.MEDNET_PLUGIN_STRING, - IconConstants.ICON_TOGGEL_RED); - Image toggelGreenImage = ResourceManager.getPluginImage(PreferenceConstants.MEDNET_PLUGIN_STRING, - IconConstants.ICON_TOGGEL_GREEN); - Image warnungGelbImage = ResourceManager.getPluginImage(PreferenceConstants.MEDNET_PLUGIN_STRING, - IconConstants.ICON_WARNUNG_GELB); - Image warnungGruenImage = ResourceManager.getPluginImage(PreferenceConstants.MEDNET_PLUGIN_STRING, - IconConstants.ICON_WARNUNG_GRUEN); - - Label toggleLabel = new Label(toggleComposite, SWT.NONE); - toggleLabel.setBackground(customBlue); - toggleLabel.setImage(toggelRedImage); - - GridData toggleLabelGridData = new GridData(SWT.LEFT, SWT.CENTER, false, false); - toggleLabel.setLayoutData(toggleLabelGridData); - - Label warningLabel = new Label(toggleComposite, SWT.NONE); - warningLabel.setBackground(customBlue); - warningLabel.setImage(warnungGelbImage); - warningLabel.setToolTipText("die gesendete Formulare werden in Omnivore NICHT importiert"); - GridData warningLabelGridData = new GridData(SWT.RIGHT, SWT.CENTER, true, false); - - warningLabel.setLayoutData(warningLabelGridData); - toggleLabel.addMouseListener(new MouseAdapter() { - @Override - public void mouseUp(MouseEvent e) { - isConnected = !isConnected; - - if (isConnected) { - // Ãœberprüfen, ob ein Pfad hinterlegt ist - String downloadPath = getDownloadStore(); - if (downloadPath == null || downloadPath.trim().isEmpty()) { - // Setze auf Grün und zeige Warnung an - toggleLabel.setImage(toggelGreenImage); - warningLabel.setImage(warnungGelbImage); - warningLabel.setToolTipText(Messages.MedNetMainComposite_noPathConfigured); - - // Zeige Warnung und setze nach Bestätigung auf Rot - MessageDialog.openWarning( - toggleLabel.getShell(), - Messages.MedNetMainComposite_noPathWarningTitle, - Messages.MedNetMainComposite_noPathWarningMessage - ); - - // Verbindung deaktivieren nach Warnung - toggleLabel.setImage(toggelRedImage); - warningLabel.setImage(warnungGelbImage); - warningLabel.setToolTipText(Messages.MedNetMainComposite_disconnectedTooltip); - isConnected = false; - return; - } - - // Verbindung aktivieren - toggleLabel.setImage(toggelGreenImage); - warningLabel.setImage(warnungGruenImage); - warningLabel.setToolTipText(Messages.MedNetMainComposite_connectedTooltip); - Activator.getInstance().startScheduler(); - } else { - // Verbindung deaktivieren - toggleLabel.setImage(toggelRedImage); - warningLabel.setImage(warnungGelbImage); - warningLabel.setToolTipText(Messages.MedNetMainComposite_disconnectedTooltip); - Activator.getInstance().stopScheduler(); - } - } - }); - - - - - - createButtonComposite(navigationComposite, - IconConstants.ICON_BARCODE_WHITE, IconConstants.ICON_BARCODE_BLUE, - Messages.MedNetMainComposite_formWithPatientData, customBlue, this::connect - ); - createButtonComposite(navigationComposite, IconConstants.ICON_GROUP_WHITE, + logoLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false)); + + ButtonFactory.createToggleButtonComposite(navigationComposite, IconConstants.ICON_TOGGEL_RED, + IconConstants.ICON_TOGGEL_GREEN, Messages.MedNetMainComposite_activateImport, customBlue); + ButtonFactory.createButtonComposite(navigationComposite, IconConstants.ICON_BARCODE_WHITE, + IconConstants.ICON_BARCODE_BLUE, Messages.MedNetMainComposite_formWithPatientData, customBlue, + this::connect); + ButtonFactory.createButtonComposite(navigationComposite, IconConstants.ICON_GROUP_WHITE, IconConstants.ICON_GROUP_BLUE, Messages.MedNetMainComposite_showPatients, customBlue, - () -> openMednetDocuments(URLConstants.URL_PATIENTS) - ); - createButtonComposite(navigationComposite, IconConstants.ICON_BARS_WHITE, + () -> openMednetDocuments(URLConstants.getBaseApiUrl() + URLConstants.URL_PATIENTS)); + ButtonFactory.createButtonComposite(navigationComposite, IconConstants.ICON_BARS_WHITE, IconConstants.ICON_BARS_BLUE, Messages.MedNetMainComposite_tasks, customBlue, - () -> openMednetDocuments(URLConstants.URL_TASKS)); - createButtonComposite(navigationComposite, - IconConstants.ICON_GOOGLE_DOCS_WHITE, IconConstants.ICON_GOOGLE_DOCS_BLUE, - Messages.MedNetMainComposite_documents, customBlue, - () -> openMednetDocuments(URLConstants.URL_DOCUMENTS)); - createButtonComposite(navigationComposite, - IconConstants.ICON_ADDRESS_BOOK_REGULAR_WHITE, IconConstants.ICON_ADDRESS_BOOK_REGULAR_BLUE, - Messages.MedNetMainComposite_therapy, customBlue, () -> openMednetDocuments(URLConstants.URL_THERAPY)); - createButtonComposite(navigationComposite, IconConstants.ICON_IMPORT_WHITE, + () -> openMednetDocuments(URLConstants.getBaseApiUrl() + URLConstants.URL_TASKS)); + ButtonFactory.createButtonComposite(navigationComposite, IconConstants.ICON_GOOGLE_DOCS_WHITE, + IconConstants.ICON_GOOGLE_DOCS_BLUE, Messages.MedNetMainComposite_documents, customBlue, + () -> openMednetDocuments(URLConstants.getBaseApiUrl() + URLConstants.URL_DOCUMENTS)); + ButtonFactory.createButtonComposite(navigationComposite, IconConstants.ICON_ADDRESS_BOOK_REGULAR_WHITE, + IconConstants.ICON_ADDRESS_BOOK_REGULAR_BLUE, Messages.MedNetMainComposite_therapy, customBlue, + () -> openMednetDocuments(URLConstants.getBaseApiUrl() + URLConstants.URL_THERAPY)); + ButtonFactory.createButtonComposite(navigationComposite, IconConstants.ICON_IMPORT_WHITE, IconConstants.ICON_IMPORT_BLUE, Messages.MedNetMainComposite_forms, customBlue, this::showSubmittedForms); - medNetViewerComposite = new Composite(parent, SWT.NONE); - GridData medNetViewerCompositeData = new GridData(SWT.FILL, SWT.FILL, true, true); - medNetViewerComposite.setLayoutData(medNetViewerCompositeData); - medNetViewerComposite.setLayout(new GridLayout(1, false)); - - showInitialLogo(); - parent.addDisposeListener(e -> { - customBlue.dispose(); - - if (!imageLabel.isDisposed()) { - imageLabel.dispose(); - } - }); - } private void openMednetDocuments(String link) { @@ -209,33 +131,6 @@ private void openMednetDocuments(String link) { } } - private String getDownloadStore() { - String downloadPath = ""; - - try { - BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext(); - - if (context != null) { - ServiceReference serviceReference = context.getServiceReference(IConfigService.class); - - if (serviceReference != null) { - IConfigService configService = context.getService(serviceReference); - - if (configService != null) { - downloadPath = configService.getActiveUserContact(PreferenceConstants.MEDNET_DOWNLOAD_PATH, ""); - return downloadPath; - } - } - } - } catch (Exception e) { - e.printStackTrace(); - } - - return downloadPath; - } - - - private void showInitialLogo() { Composite logoContainer = new Composite(medNetViewerComposite, SWT.NONE); logoContainer.setLayout(new GridLayout(1, false)); @@ -251,64 +146,70 @@ private void showInitialLogo() { medNetViewerComposite.layout(); } - private void loadCustomers() { + public void loadCustomers() { clearPreviousData(); - - customerComposite = new CustomerComposite(medNetViewerComposite, this::loadProviders); + customerComposite = new CustomerComposite(medNetViewerComposite, this::onCustomerSelected); customerComposite.show(); + navigationStack.clear(); + updateBreadcrumbNavigation(); medNetViewerComposite.layout(); } + private void onCustomerSelected(Integer customerId, String customerName) { + loadProviders(customerId, customerName); + } + private void showSubmittedForms() { clearPreviousData(); - submittedFormsComposite = new SubmittedFormsComposite(medNetViewerComposite); submittedFormsComposite.showSubmittedForms(); medNetViewerComposite.layout(); - - } - - private Image getScaledImage(Display display, String path, int width, int height, Label label) { - Image originalImage = ResourceManager.getPluginImage(PreferenceConstants.MEDNET_PLUGIN_STRING, path); - if (originalImage == null || originalImage.isDisposed()) { - return null; - } - ImageData originalImageData = originalImage.getImageData(); - if (width <= 1 || height <= 1) { - width = originalImageData.width; - height = originalImageData.height; - } - ImageData scaledImageData = originalImageData.scaledTo(width, height); - Image scaledImage = new Image(display, scaledImageData); - label.addDisposeListener(e -> { - if (!scaledImage.isDisposed()) { - scaledImage.dispose(); - } - }); - - return scaledImage; } - private void loadProviders(Integer customerId) { + public void loadProviders(Integer customerId, String customerName) { clearPreviousData(); + removeStatesAfter(StateConstants.CUSTOMER); + if (!navigationStack.isEmpty() && StateConstants.CUSTOMER.equals(navigationStack.peek().state)) { + NavigationState customerState = navigationStack.peek(); + customerState.customerId = customerId; + customerState.customerName = customerName; + } else { - providerComposite = new ProviderComposite(medNetViewerComposite, this::loadForms, patientFetcher); + navigationStack.push( + new NavigationState(StateConstants.CUSTOMER, customerId, null, null, null, customerName, null)); + } + providerComposite = new ProviderComposite(medNetViewerComposite, this::onProviderSelected, patientFetcher); providerComposite.show(customerId); + updateBreadcrumbNavigation(); medNetViewerComposite.layout(); - navigationStack.push(new NavigationState("CUSTOMER", customerId, null)); //$NON-NLS-1$ } - private void loadForms(Integer providerId) { + private void onProviderSelected(Integer providerId, String providerName) { + loadForms(providerId, providerName); + } + + public void loadForms(Integer providerId, String providerName) { if (!navigationStack.isEmpty()) { NavigationState previousState = navigationStack.peek(); if (previousState.customerId != null) { clearPreviousData(); - - formComposite = new FormComposite(medNetViewerComposite); + if (StateConstants.PROVIDER.equals(previousState.state) + && previousState.providerId.equals(providerId)) { + } else { + removeStatesAfter(StateConstants.CUSTOMER); + navigationStack.push(new NavigationState(StateConstants.PROVIDER, previousState.customerId, + providerId, null, null, previousState.customerName, providerName)); + } + formComposite = new FormComposite(medNetViewerComposite, + (customerId, providerId1, formId, formName) -> { + removeStatesAfter(StateConstants.PROVIDER); + navigationStack.push(new NavigationState(StateConstants.FORM, customerId, providerId1, + formId, formName, previousState.customerName, providerName)); + updateBreadcrumbNavigation(); + }); formComposite.show(previousState.customerId, providerId); + updateBreadcrumbNavigation(); medNetViewerComposite.layout(); - navigationStack - .push(new NavigationState("PROVIDER", previousState.customerId, providerId)); //$NON-NLS-1$ } } } @@ -323,105 +224,78 @@ private void clearPreviousData() { } } - private void addHoverEffect(Composite composite, Label iconLabel, Label textLabel, Image defaultIcon, - Image hoverIcon, Color customBlue) { - MouseTrackAdapter hoverEffect = new MouseTrackAdapter() { - @Override - public void mouseEnter(MouseEvent e) { - composite.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_WHITE)); - iconLabel.setImage(hoverIcon); - textLabel.setForeground(customBlue); - textLabel.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_WHITE)); - iconLabel.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_WHITE)); - } - @Override - public void mouseExit(MouseEvent e) { - composite.setBackground(customBlue); - iconLabel.setImage(defaultIcon); - textLabel.setForeground(composite.getDisplay().getSystemColor(SWT.COLOR_WHITE)); - textLabel.setBackground(customBlue); - iconLabel.setBackground(customBlue); - } - }; - composite.addMouseTrackListener(hoverEffect); - iconLabel.addMouseTrackListener(hoverEffect); - textLabel.addMouseTrackListener(hoverEffect); - } - - private void addPressReleaseEffect(Composite composite, Label iconLabel, Label textLabel, Image hoverIcon, - Runnable onClickAction, Color customBlue) { - MouseAdapter pressReleaseEffect = new MouseAdapter() { - @Override - public void mouseDown(MouseEvent e) { - composite.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_GRAY)); - textLabel.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_GRAY)); - iconLabel.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_GRAY)); - } + private void updateBreadcrumbNavigation() { + for (Control child : navigationBreadcrumbComposite.getChildren()) { + child.dispose(); + } + for (int i = 0; i < navigationStack.size(); i++) { + NavigationState state = navigationStack.get(i); + final int stateIndex = i; + Composite breadcrumbComposite = new Composite(navigationBreadcrumbComposite, SWT.NONE); + breadcrumbComposite.setLayout(new GridLayout(2, false)); + breadcrumbComposite.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); + breadcrumbComposite + .setBackground(navigationBreadcrumbComposite.getDisplay().getSystemColor(SWT.COLOR_WHITE)); + Label iconLabel = new Label(breadcrumbComposite, SWT.NONE); + iconLabel.setBackground(breadcrumbComposite.getBackground()); + Image leftArrowIcon = ResourceManager.getPluginImage(PreferenceConstants.MEDNET_PLUGIN_STRING, + IconConstants.ICON_LEFT_ARROW); + Image leftArrowIconWhite = ResourceManager.getPluginImage(PreferenceConstants.MEDNET_PLUGIN_STRING, + IconConstants.ICON_LEFT_ARROW_WHITE); + iconLabel.setImage(leftArrowIcon); + Label textLabel = new Label(breadcrumbComposite, SWT.NONE); + textLabel.setText(getBreadcrumbText(state)); + textLabel.setBackground(breadcrumbComposite.getBackground()); + textLabel.setForeground(customBlue); + textLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false)); + + CompositeEffectHandler.addHoverEffectBreadcrumbNavigation(breadcrumbComposite, iconLabel, textLabel, + leftArrowIcon, leftArrowIconWhite, customBlue); + CompositeEffectHandler.addPressReleaseEffect(breadcrumbComposite, iconLabel, textLabel, leftArrowIconWhite, + () -> navigateToState(stateIndex), breadcrumbComposite.getBackground()); + } - @Override - public void mouseUp(MouseEvent e) { - if (composite.getBounds().contains(composite.getDisplay().map(null, composite, e.x, e.y))) { - composite.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_WHITE)); - textLabel.setForeground(customBlue); - textLabel.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_WHITE)); - iconLabel.setImage(hoverIcon); - } else { - composite.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_WHITE)); - iconLabel.setImage(hoverIcon); - textLabel.setForeground(customBlue); - textLabel.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_WHITE)); - iconLabel.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_WHITE)); - } - onClickAction.run(); - } - }; - composite.addMouseListener(pressReleaseEffect); - iconLabel.addMouseListener(pressReleaseEffect); - textLabel.addMouseListener(pressReleaseEffect); + navigationBreadcrumbComposite.layout(); } + private void navigateToState(int stateIndex) { + while (navigationStack.size() > stateIndex + 1) { + navigationStack.pop(); + } + NavigationState targetState = navigationStack.peek(); + if (StateConstants.CUSTOMER.equals(targetState.state)) { + loadCustomers(); + } else if (StateConstants.PROVIDER.equals(targetState.state)) { + loadProviders(targetState.customerId, targetState.customerName); + } else if (StateConstants.FORM.equals(targetState.state)) { + loadForms(targetState.providerId, targetState.providerName); + } + updateBreadcrumbNavigation(); + } - private Composite createButtonComposite(Composite parent, String iconPathDefault, String iconPathHover, - String buttonText, Color customBlue, Runnable onClickAction) { - Composite buttonComposite = new Composite(parent, SWT.NONE); - buttonComposite.setBackground(customBlue); - buttonComposite.setLayout(new GridLayout(1, false)); - GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false); - gridData.heightHint = 80; - buttonComposite.setLayoutData(gridData); - Label iconLabel = new Label(buttonComposite, SWT.NONE); - Image defaultIcon = getScaledImage(parent.getDisplay(), iconPathDefault, 32, 32, iconLabel); - Image hoverIcon = getScaledImage(parent.getDisplay(), iconPathHover, 32, 32, iconLabel); - iconLabel.setImage(defaultIcon); - iconLabel.setBackground(customBlue); - iconLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false)); - Label textLabel = new Label(buttonComposite, SWT.CENTER | SWT.WRAP); - textLabel.setText(buttonText); - textLabel.setBackground(customBlue); - textLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE)); - textLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false)); - addHoverEffect(buttonComposite, iconLabel, textLabel, defaultIcon, hoverIcon, customBlue); - addPressReleaseEffect(buttonComposite, iconLabel, textLabel, hoverIcon, onClickAction, customBlue); - buttonComposite.addDisposeListener(e -> { - if (defaultIcon != null && !defaultIcon.isDisposed()) { - defaultIcon.dispose(); + private void removeStatesAfter(String stateName) { + int index = -1; + for (int i = 0; i < navigationStack.size(); i++) { + if (stateName.equals(navigationStack.get(i).state)) { + index = i; + break; } - if (hoverIcon != null && !hoverIcon.isDisposed()) { - hoverIcon.dispose(); + } + if (index >= 0) { + while (navigationStack.size() > index + 1) { + navigationStack.pop(); } - }); - return buttonComposite; + } } - private class NavigationState { - String state; - Integer customerId; - Integer providerId; - - NavigationState(String state, Integer customerId, Integer providerId) { - this.state = state; - this.customerId = customerId; - this.providerId = providerId; + private String getBreadcrumbText(NavigationState state) { + if (StateConstants.CUSTOMER.equals(state.state)) { + return state.customerName != null ? state.customerName : Messages.BreadcrumbNavigation_customers; + } else if (StateConstants.PROVIDER.equals(state.state)) { + return state.providerName != null ? state.providerName : Messages.BreadcrumbNavigation_providers; + } else if (StateConstants.FORM.equals(state.state)) { + return state.formName != null ? state.formName : Messages.BreadcrumbNavigation_forms; } + return ""; } } diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/ProviderComposite.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/ProviderComposite.java index 76ab6eb45..1df773b4a 100644 --- a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/ProviderComposite.java +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/ProviderComposite.java @@ -1,65 +1,104 @@ package ch.elexis.mednet.webapi.ui.parts; import java.util.function.Consumer; + import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Text; import ch.elexis.mednet.webapi.core.messages.Messages; -import ch.elexis.mednet.webapi.ui.fhir.util.UIStyleHelper; import ch.elexis.mednet.webapi.ui.handler.DataHandler; import ch.elexis.mednet.webapi.ui.handler.PatientFetcher; +import ch.elexis.mednet.webapi.ui.handler.TableHelper; +import ch.elexis.mednet.webapi.ui.util.UIStyleTableHelper; public class ProviderComposite { private Composite parent; private Consumer loadFormsCallback; + private IProviderSelectionListener providerSelectionListener; private PatientFetcher patientFetcher; + private boolean ascending = true; - public ProviderComposite(Composite parent, Consumer loadFormsCallback, PatientFetcher patientFetcher) { + public ProviderComposite(Composite parent, IProviderSelectionListener providerSelectionListener, + PatientFetcher patientFetcher) { this.parent = parent; - this.loadFormsCallback = loadFormsCallback; + this.providerSelectionListener = providerSelectionListener; this.patientFetcher = patientFetcher; } - public void show(Integer customerId) { - parent.setLayout(UIStyleHelper.createStyledGridLayout()); + public interface IProviderSelectionListener { + void onProviderSelected(Integer providerId, String providerName); + } + + + public void show(Integer customerId) { + parent.setLayout(UIStyleTableHelper.createStyledGridLayout()); + Text searchBox = new Text(parent, SWT.SEARCH | SWT.ICON_SEARCH | SWT.CANCEL); + searchBox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + searchBox.setMessage(Messages.Composite_searchBoxMessage); - Table providerTable = UIStyleHelper.createStyledTable(parent); + Table providerTable = UIStyleTableHelper.createStyledTable(parent); - String[] columnHeaders = { Messages.ProviderComposite_Anbieter_ID }; - int[] columnWidths = { 100 }; + String[] columnHeaders = { Messages.ProviderComposite_Anbieter_ID, Messages.ProviderComposite_Anbieter_Name }; + int[] columnWidths = { 0, 250 }; - UIStyleHelper.addTableColumns(providerTable, columnHeaders, columnWidths); + TableColumn[] columns = new TableColumn[columnHeaders.length]; + + for (int i = 0; i < columnHeaders.length; i++) { + TableColumn column = new TableColumn(providerTable, SWT.NONE); + column.setText(columnHeaders[i]); + column.setWidth(columnWidths[i]); + columns[i] = column; + + if (i == 0) { + column.setResizable(false); + } - TableColumn nameColumn = new TableColumn(providerTable, SWT.NONE); - nameColumn.setText(Messages.ProviderComposite_Anbieter_Name); - nameColumn.setResizable(true); + final int columnIndex = i; + column.addListener(SWT.Selection, event -> { + TableHelper.sortTable(providerTable, columnIndex); // Use TableHelper + }); + } DataHandler.fetchAndDisplayProviders(providerTable, customerId); + searchBox.addModifyListener(event -> { + String searchText = searchBox.getText().toLowerCase(); + TableHelper.filterTable(providerTable, searchText); // Use TableHelper + }); + providerTable.addListener(SWT.Resize, event -> { int tableWidth = providerTable.getClientArea().width; int totalWidth = 0; + + // Calculate the width of all columns except the last one for (int i = 0; i < providerTable.getColumnCount() - 1; i++) { totalWidth += providerTable.getColumn(i).getWidth(); } - nameColumn.setWidth(Math.max(100, tableWidth - totalWidth)); + // Adjust the last column to fill the remaining space + int remainingWidth = Math.max(100, tableWidth - totalWidth); + columns[columns.length - 1].setWidth(remainingWidth); }); + providerTable.addListener(SWT.MouseDoubleClick, event -> { TableItem[] selection = providerTable.getSelection(); if (selection.length > 0) { TableItem selectedItem = selection[0]; Integer providerId = Integer.parseInt(selectedItem.getText(0)); + String providerName = selectedItem.getText(1); if (providerId != null) { - loadFormsCallback.accept(providerId); + providerSelectionListener.onProviderSelected(providerId, providerName); } } }); - parent.layout(); - } + parent.layout(); + } + } diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/SubmittedFormsComposite.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/SubmittedFormsComposite.java index d47435644..65fcc52a8 100644 --- a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/SubmittedFormsComposite.java +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/parts/SubmittedFormsComposite.java @@ -1,5 +1,9 @@ package ch.elexis.mednet.webapi.ui.parts; +import java.net.URI; +import java.util.List; +import java.util.Map; + import org.eclipse.core.runtime.IStatus; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; @@ -18,13 +22,9 @@ import ch.elexis.core.ui.icons.Images; import ch.elexis.mednet.webapi.core.handler.SingleFileDownloaderHandler; import ch.elexis.mednet.webapi.core.messages.Messages; -import ch.elexis.mednet.webapi.ui.fhir.util.UIStyleHelper; import ch.elexis.mednet.webapi.ui.handler.DataHandler; import ch.elexis.mednet.webapi.ui.handler.ImportOmnivore; - -import java.net.URI; -import java.util.List; -import java.util.Map; +import ch.elexis.mednet.webapi.ui.util.UIStyleTableHelper; public class SubmittedFormsComposite { private static final Logger logger = LoggerFactory.getLogger(SubmittedFormsComposite.class); @@ -57,14 +57,17 @@ public void showSubmittedForms() { refreshButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false)); refreshButton.addListener(SWT.Selection, e -> refreshTableData()); - customerCombo = UIStyleHelper.createStyledCCombo(parent); + customerCombo = UIStyleTableHelper.createStyledCCombo(parent); DataHandler.loadCustomersFromApi(customerCombo); customerCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - submittedFormsTable = UIStyleHelper.createStyledTable(parent); - String[] columnHeaders = {"Order No.", "Date", "Patient No.", "Patient Name", "Birthdate", "Type", "Exports and Attachments", "Sender", "Receiver"}; + submittedFormsTable = UIStyleTableHelper.createStyledTable(parent); + String[] columnHeaders = { Messages.ColumnHeaders_OrderNo, Messages.ColumnHeaders_Date, + Messages.ColumnHeaders_PatientNo, Messages.ColumnHeaders_PatientName, Messages.ColumnHeaders_Birthdate, + Messages.ColumnHeaders_Type, Messages.ColumnHeaders_ExportsAndAttachments, + Messages.ColumnHeaders_Sender, Messages.ColumnHeaders_Receiver }; int[] columnWidths = {80, 120, 90, 120, 100, 50, 120, 100, 100}; - UIStyleHelper.addTableColumns(submittedFormsTable, columnHeaders, columnWidths); + UIStyleTableHelper.addTableColumns(submittedFormsTable, columnHeaders, columnWidths); submittedFormsTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); loadSubmittedFormsCombo(); customerCombo.addListener(SWT.Selection, event -> { diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/preferences/MedNetWebPreferencePage.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/preferences/MedNetWebPreferencePage.java index 2289544cc..45d839109 100644 --- a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/preferences/MedNetWebPreferencePage.java +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/preferences/MedNetWebPreferencePage.java @@ -1,10 +1,14 @@ package ch.elexis.mednet.webapi.ui.preferences; - import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.DirectoryFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.StringFieldEditor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Group; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.preferences.ScopedPreferenceStore; @@ -23,6 +27,11 @@ public class MedNetWebPreferencePage extends FieldEditorPreferencePage implement private IConfigService configService; + private Button demoRadioButton; + private Button produktivRadioButton; + public static final String DEMO = "DEMO"; + public static final String PRODUKTIV = "PRODUKTIV"; + @Reference public void setConfigService(IConfigService configService) { this.configService = configService; @@ -51,8 +60,26 @@ public void createFieldEditors() { Messages.MedNetWebPreferencePage_loginName, getFieldEditorParent() )); + + createRadioButtonGroup(getFieldEditorParent()); } + private void createRadioButtonGroup(Composite parent) { + + Group group = new Group(parent, SWT.NONE); + group.setText(Messages.MedNetWebPreferencePage_operatingMode); + group.setLayout(new org.eclipse.swt.layout.GridLayout(1, false)); + + demoRadioButton = new Button(group, SWT.RADIO); + demoRadioButton.setText(Messages.MedNetWebPreferencePage_demoMode); + demoRadioButton.setSelection(DEMO.equals(getPreferenceStore().getString(PreferenceConstants.MEDNET_MODE))); + + produktivRadioButton = new Button(group, SWT.RADIO); + produktivRadioButton.setText(Messages.MedNetWebPreferencePage_produktivMode); + produktivRadioButton + .setSelection(PRODUKTIV.equals(getPreferenceStore().getString(PreferenceConstants.MEDNET_MODE))); + } + @Override public void init(IWorkbench workbench) { if (configService == null) { @@ -71,14 +98,17 @@ public void init(IWorkbench workbench) { String userName = configService.getActiveUserContact(PreferenceConstants.MEDNET_USER_STRING, ""); getPreferenceStore().setValue(PreferenceConstants.MEDNET_USER_STRING, userName); - } + + String mode = configService.getActiveUserContact(PreferenceConstants.MEDNET_MODE, DEMO); + getPreferenceStore().setValue(PreferenceConstants.MEDNET_MODE, mode); + } @Override public boolean performOk() { boolean result = super.performOk(); applyChanges(); return result; - } + } @Override protected void performApply() { @@ -90,9 +120,19 @@ private void applyChanges() { if (configService != null) { configService.setActiveUserContact(PreferenceConstants.MEDNET_DOWNLOAD_PATH, getPreferenceStore().getString(PreferenceConstants.MEDNET_DOWNLOAD_PATH)); - configService.setActiveUserContact(PreferenceConstants.MEDNET_USER_STRING, getPreferenceStore().getString(PreferenceConstants.MEDNET_USER_STRING)); + + String previousMode = getPreferenceStore().getString(PreferenceConstants.MEDNET_MODE); + + String selectedMode = demoRadioButton.getSelection() ? DEMO : PRODUKTIV; + configService.setActiveUserContact(PreferenceConstants.MEDNET_MODE, selectedMode); + + if (!previousMode.equals(selectedMode)) { + MessageDialog.openWarning(getShell(), Messages.MedNetMainComposite_restartRequiredTitle, + Messages.MedNetMainComposite_restartRequiredMessage); + } + } - } + } } diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/preferences/PreferenceInitializer.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/preferences/PreferenceInitializer.java index 27cab79c2..2990a9af2 100644 --- a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/preferences/PreferenceInitializer.java +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/preferences/PreferenceInitializer.java @@ -4,20 +4,18 @@ import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.osgi.framework.ServiceReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import ch.elexis.core.services.IConfigService; import ch.elexis.mednet.webapi.core.constants.PreferenceConstants; -/** - * Class used to initialize default preference values. - */ public class PreferenceInitializer extends AbstractPreferenceInitializer { private IConfigService configService; - - // Standardkonstruktor, wie von Eclipse erwartet + private static final Logger logger = LoggerFactory.getLogger(PreferenceInitializer.class); public PreferenceInitializer() { - // ConfigService über das OSGi-Framework abrufen + BundleContext context = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); if (context != null) { ServiceReference serviceReference = context.getServiceReference(IConfigService.class); @@ -29,17 +27,16 @@ public PreferenceInitializer() { if (configService != null) { initializeDefaultPreferences(); } else { - System.err.println("PreferenceInitializer: ConfigService could not be retrieved."); + logger.error("PreferenceInitializer: ConfigService could not be retrieved."); } } - // Methode zur Initialisierung der Standardwerte public void initializeDefaultPreferences() { if (configService != null) { configService.setActiveUserContact(PreferenceConstants.MEDNET_DOWNLOAD_PATH, ""); configService.setActiveUserContact(PreferenceConstants.MEDNET_USER_STRING, ""); } else { - System.err.println("initializeDefaultPreferences: ConfigService is null."); + logger.error("initializeDefaultPreferences: ConfigService is null."); } } } diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/ButtonFactory.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/ButtonFactory.java new file mode 100644 index 000000000..5d5d53361 --- /dev/null +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/ButtonFactory.java @@ -0,0 +1,168 @@ +package ch.elexis.mednet.webapi.ui.util; + +import org.apache.commons.lang3.StringUtils; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; + +import ch.elexis.core.services.IConfigService; +import ch.elexis.mednet.webapi.core.constants.PreferenceConstants; +import ch.elexis.mednet.webapi.core.messages.Messages; +import ch.elexis.mednet.webapi.ui.Activator; + +public class ButtonFactory { + + public static Composite createToggleButtonComposite(Composite parent, String iconPathDefault, String iconPathActive, + String buttonText, Color customBlue) { + Composite buttonComposite = new Composite(parent, SWT.NONE); + buttonComposite.setBackground(customBlue); + buttonComposite.setLayout(new GridLayout(1, false)); + GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false); + gridData.heightHint = 80; + buttonComposite.setLayoutData(gridData); + + Label iconLabel = new Label(buttonComposite, SWT.NONE); + Image defaultIcon = ImageUtil.getScaledImage(parent.getDisplay(), iconPathDefault, 32, 32, iconLabel); + Image activeIcon = ImageUtil.getScaledImage(parent.getDisplay(), iconPathActive, 32, 32, iconLabel); + iconLabel.setImage(defaultIcon); + iconLabel.setBackground(customBlue); + iconLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false)); + + Label textLabel = new Label(buttonComposite, SWT.CENTER | SWT.WRAP); + textLabel.setText(buttonText); + textLabel.setBackground(customBlue); + textLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE)); + textLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false)); + + final boolean[] isConnected = { false }; + + CompositeEffectHandler.addHoverEffectWithoutChangingActiveState(buttonComposite, iconLabel, textLabel, + defaultIcon, customBlue, isConnected); + + MouseAdapter clickListener = new MouseAdapter() { + @Override + public void mouseUp(MouseEvent e) { + isConnected[0] = !isConnected[0]; + if (isConnected[0]) { + String downloadPath = getDownloadStore(); + if (downloadPath == null || downloadPath.trim().isEmpty()) { + iconLabel.setImage(defaultIcon); + textLabel.setText(buttonText); + MessageDialog.openWarning(buttonComposite.getShell(), + Messages.MedNetMainComposite_noPathWarningTitle, + Messages.MedNetMainComposite_noPathWarningMessage); + isConnected[0] = false; + return; + } + iconLabel.setImage(activeIcon); + textLabel.setText(Messages.MedNetMainComposite_deactivateImport); + textLabel.setToolTipText(Messages.MedNetMainComposite_connectedTooltip); + Activator.getInstance().startScheduler(); + Activator.getInstance().setOnSchedulerError(() -> { + Display.getDefault().asyncExec(() -> { + iconLabel.setImage(defaultIcon); + textLabel.setText(buttonText); + textLabel.setToolTipText(Messages.MedNetMainComposite_schedulerErrorMessage); + isConnected[0] = false; + }); + }); + } else { + iconLabel.setImage(defaultIcon); + textLabel.setText(buttonText); + textLabel.setToolTipText(Messages.MedNetMainComposite_disconnectedTooltip); + Activator.getInstance().stopScheduler(); + } + } + }; + + buttonComposite.addMouseListener(clickListener); + iconLabel.addMouseListener(clickListener); + textLabel.addMouseListener(clickListener); + + Activator.getInstance().setOnSchedulerError(() -> parent.getDisplay().asyncExec(() -> { + isConnected[0] = false; + iconLabel.setImage(defaultIcon); + textLabel.setText(buttonText); + textLabel.setToolTipText(Messages.MedNetMainComposite_disconnectedTooltip); + MessageDialog.openError(parent.getShell(), Messages.MedNetMainComposite_schedulerErrorTitle, + Messages.MedNetMainComposite_schedulerErrorMessage); + })); + + buttonComposite.addDisposeListener(e -> { + if (defaultIcon != null && !defaultIcon.isDisposed()) { + defaultIcon.dispose(); + } + if (activeIcon != null && !activeIcon.isDisposed()) { + activeIcon.dispose(); + } + }); + + return buttonComposite; + } + + public static Composite createButtonComposite(Composite parent, String iconPathDefault, String iconPathHover, + String buttonText, Color customBlue, Runnable onClickAction) { + Composite buttonComposite = new Composite(parent, SWT.NONE); + buttonComposite.setBackground(customBlue); + buttonComposite.setLayout(new GridLayout(1, false)); + GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false); + gridData.heightHint = 80; + buttonComposite.setLayoutData(gridData); + Label iconLabel = new Label(buttonComposite, SWT.NONE); + Image defaultIcon = ImageUtil.getScaledImage(parent.getDisplay(), iconPathDefault, 32, 32, iconLabel); + Image hoverIcon = ImageUtil.getScaledImage(parent.getDisplay(), iconPathHover, 32, 32, iconLabel); + iconLabel.setImage(defaultIcon); + iconLabel.setBackground(customBlue); + iconLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false)); + Label textLabel = new Label(buttonComposite, SWT.CENTER | SWT.WRAP); + textLabel.setText(buttonText); + textLabel.setBackground(customBlue); + textLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE)); + textLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false)); + CompositeEffectHandler.addHoverEffect(buttonComposite, iconLabel, textLabel, defaultIcon, hoverIcon, + customBlue); + CompositeEffectHandler.addPressReleaseEffect(buttonComposite, iconLabel, textLabel, hoverIcon, onClickAction, + customBlue); + buttonComposite.addDisposeListener(e -> { + if (defaultIcon != null && !defaultIcon.isDisposed()) { + defaultIcon.dispose(); + } + if (hoverIcon != null && !hoverIcon.isDisposed()) { + hoverIcon.dispose(); + } + }); + return buttonComposite; + } + + private static String getDownloadStore() { + String downloadPath = StringUtils.EMPTY; + try { + BundleContext context = FrameworkUtil.getBundle(ButtonFactory.class).getBundleContext(); + if (context != null) { + ServiceReference serviceReference = context.getServiceReference(IConfigService.class); + if (serviceReference != null) { + IConfigService configService = context.getService(serviceReference); + if (configService != null) { + downloadPath = configService.getActiveUserContact(PreferenceConstants.MEDNET_DOWNLOAD_PATH, + StringUtils.EMPTY); + return downloadPath; + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return downloadPath; + } +} diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/CompositeEffectHandler.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/CompositeEffectHandler.java new file mode 100644 index 000000000..b5e3b5ade --- /dev/null +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/CompositeEffectHandler.java @@ -0,0 +1,128 @@ +package ch.elexis.mednet.webapi.ui.util; + +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseTrackAdapter; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + +public class CompositeEffectHandler { + + public static void addHoverEffect(Composite composite, Label iconLabel, Label textLabel, Image defaultIcon, + Image hoverIcon, Color customBlue) { + MouseTrackAdapter hoverEffect = new MouseTrackAdapter() { + @Override + public void mouseEnter(MouseEvent e) { + composite.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + iconLabel.setImage(hoverIcon); + textLabel.setForeground(customBlue); + textLabel.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + iconLabel.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + } + + @Override + public void mouseExit(MouseEvent e) { + composite.setBackground(customBlue); + iconLabel.setImage(defaultIcon); + textLabel.setForeground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + textLabel.setBackground(customBlue); + iconLabel.setBackground(customBlue); + } + }; + composite.addMouseTrackListener(hoverEffect); + iconLabel.addMouseTrackListener(hoverEffect); + textLabel.addMouseTrackListener(hoverEffect); + } + + public static void addHoverEffectBreadcrumbNavigation(Composite composite, Label iconLabel, Label textLabel, + Image defaultIcon, + Image hoverIcon, Color customBlue) { + MouseTrackAdapter hoverEffect = new MouseTrackAdapter() { + @Override + public void mouseEnter(MouseEvent e) { + composite.setBackground(customBlue); + iconLabel.setImage(hoverIcon); + textLabel.setForeground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + textLabel.setBackground(customBlue); + iconLabel.setBackground(customBlue); + } + + @Override + public void mouseExit(MouseEvent e) { + composite.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + iconLabel.setImage(defaultIcon); + textLabel.setForeground(customBlue); + textLabel.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + iconLabel.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + } + }; + composite.addMouseTrackListener(hoverEffect); + iconLabel.addMouseTrackListener(hoverEffect); + textLabel.addMouseTrackListener(hoverEffect); + } + + public static void addPressReleaseEffect(Composite composite, Label iconLabel, Label textLabel, Image hoverIcon, + Runnable onClickAction, Color customBlue) { + MouseAdapter pressReleaseEffect = new MouseAdapter() { + @Override + public void mouseDown(MouseEvent e) { + composite.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_GRAY)); + textLabel.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_GRAY)); + iconLabel.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_GRAY)); + } + + @Override + public void mouseUp(MouseEvent e) { + if (composite.getBounds().contains(composite.getDisplay().map(null, composite, e.x, e.y))) { + composite.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + textLabel.setForeground(customBlue); + textLabel.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + iconLabel.setImage(hoverIcon); + } else { + composite.setBackground(customBlue); + iconLabel.setImage(hoverIcon); + textLabel.setForeground(customBlue); + textLabel.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + iconLabel.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + } + onClickAction.run(); + } + }; + composite.addMouseListener(pressReleaseEffect); + iconLabel.addMouseListener(pressReleaseEffect); + textLabel.addMouseListener(pressReleaseEffect); + } + + public static void addHoverEffectWithoutChangingActiveState(Composite composite, Label iconLabel, Label textLabel, + Image defaultIcon, Color customBlue, boolean[] isActive) { + MouseTrackAdapter hoverEffect = new MouseTrackAdapter() { + @Override + public void mouseEnter(MouseEvent e) { + composite.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + if (!isActive[0]) { + iconLabel.setImage(defaultIcon); + } + textLabel.setForeground(customBlue); + textLabel.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + iconLabel.setBackground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + } + + @Override + public void mouseExit(MouseEvent e) { + composite.setBackground(customBlue); + if (!isActive[0]) { + iconLabel.setImage(defaultIcon); + } + textLabel.setForeground(composite.getDisplay().getSystemColor(org.eclipse.swt.SWT.COLOR_WHITE)); + textLabel.setBackground(customBlue); + iconLabel.setBackground(customBlue); + } + }; + composite.addMouseTrackListener(hoverEffect); + iconLabel.addMouseTrackListener(hoverEffect); + textLabel.addMouseTrackListener(hoverEffect); + } + +} diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/ImageUtil.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/ImageUtil.java new file mode 100644 index 000000000..932624d84 --- /dev/null +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/ImageUtil.java @@ -0,0 +1,32 @@ +package ch.elexis.mednet.webapi.ui.util; + +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.wb.swt.ResourceManager; + +import ch.elexis.mednet.webapi.core.constants.PreferenceConstants; + +public class ImageUtil { + + public static Image getScaledImage(Display display, String path, int width, int height, Label label) { + Image originalImage = ResourceManager.getPluginImage(PreferenceConstants.MEDNET_PLUGIN_STRING, path); + if (originalImage == null || originalImage.isDisposed()) { + return null; + } + ImageData originalImageData = originalImage.getImageData(); + if (width <= 1 || height <= 1) { + width = originalImageData.width; + height = originalImageData.height; + } + ImageData scaledImageData = originalImageData.scaledTo(width, height); + Image scaledImage = new Image(display, scaledImageData); + label.addDisposeListener(e -> { + if (!scaledImage.isDisposed()) { + scaledImage.dispose(); + } + }); + return scaledImage; + } +} diff --git a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/fhir/util/UIStyleHelper.java b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/UIStyleTableHelper.java similarity index 98% rename from bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/fhir/util/UIStyleHelper.java rename to bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/UIStyleTableHelper.java index 838da73ce..8b8531158 100644 --- a/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/fhir/util/UIStyleHelper.java +++ b/bundles/ch.elexis.mednet.webapi.ui/src/ch/elexis/mednet/webapi/ui/util/UIStyleTableHelper.java @@ -1,4 +1,4 @@ -package ch.elexis.mednet.webapi.ui.fhir.util; +package ch.elexis.mednet.webapi.ui.util; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; @@ -17,7 +17,7 @@ import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; -public class UIStyleHelper { +public class UIStyleTableHelper { private static Font tableFont = null;