public void SendMessageToOpenProject(string messageType, string trackingId, string messagePayload) { if (!_isLoaded) { Log.Warning("Failed to send message to OpenProject: bridge web browser not loaded"); return; } Log.Information("Sending message of type {A} to OpenProject", messageType); switch (messageType) { case MessageTypes.CLOSE_DESKTOP_APPLICATION: // This message means we should exit the application Environment.Exit(0); return; case MessageTypes.GO_TO_SETTINGS: try { VisitUrl(LandingIndexPageUrl()); } catch (Exception e) { Log.Error(e, "error fetching landing page index url"); MessageHandler.ShowError("Cannot open OpenProject settings. Please contact an administrator."); } break; case MessageTypes.SET_BROWSER_TO_FOREGROUND: case MessageTypes.VIEWPOINT_GENERATED: OnAppForegroundRequestReceived?.Invoke(this); break; } var messageData = JsonConvert.SerializeObject(new { messageType, trackingId, messagePayload }); var encodedMessage = JsonConvert.ToString(messageData); Application.Current.Dispatcher.Invoke(() => { _webBrowser?.GetMainFrame() .ExecuteJavaScriptAsync($"{REVIT_BRIDGE_JAVASCRIPT_NAME}.sendMessageToOpenProject({encodedMessage})"); }); }
public void SendMessageToRevit(string messageType, string trackingId, string messagePayload) { if (!_isLoaded) { Log.Warning("Failed to send message to Revit: bridge web browser not loaded"); return; } Log.Information("Sending message of type {A} to Revit", messageType); switch (messageType) { case MessageTypes.INSTANCE_SELECTED: // This is the case at the beginning when the user selects which instance of OpenProject // should be accessed. We're not relaying this to Revit. HandleInstanceNameReceived(messagePayload); break; case MessageTypes.ADD_INSTANCE: // Simply save the instance to the white list and do nothing else. ConfigurationHandler.SaveSelectedInstance(messagePayload); break; case MessageTypes.REMOVE_INSTANCE: ConfigurationHandler.RemoveSavedInstance(messagePayload); break; case MessageTypes.ALL_INSTANCES_REQUESTED: { var allInstances = JsonConvert.SerializeObject(ConfigurationHandler.Settings.GetOpenProjectInstances()); SendMessageToOpenProject(MessageTypes.ALL_INSTANCES, trackingId, allInstances); break; } case MessageTypes.FOCUS_REVIT_APPLICATION: RevitMainWindowHandler.SetFocusToRevit(); break; case MessageTypes.GO_TO_SETTINGS: VisitUrl(LandingIndexPageUrl()); break; case MessageTypes.SET_BROWSER_TO_FOREGROUND: OnAppForegroundRequestReceived?.Invoke(this); break; case MessageTypes.VALIDATE_INSTANCE: Task.Run(async() => await ValidateInstanceAsync(trackingId, messagePayload)); break; default: { var eventArgs = new WebUiMessageEventArgs(messageType, trackingId, messagePayload); OnWebUiMessageReceived?.Invoke(this, eventArgs); // For some UI operations, revit should be focused RevitMainWindowHandler.SetFocusToRevit(); break; } } // Hacky solution to directly send focus back to OP. if (messageType == MessageTypes.VIEWPOINT_DATA) { OnAppForegroundRequestReceived?.Invoke(this); } }