Search code examples
javascriptvb.nettinymce-4awesomium

Awesomium - vb.net get html content


I am using TinyMce from within a Windows Form through the Awesomium browser. I created a User Control like this that I am placing on the Windows Form:

Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Drawing
Imports System.Data
Imports System.Text
Imports System.Windows.Forms
Imports System.IO
Imports Awesomium.Core
Imports Awesomium.Windows

Partial Public Class TinyMCE
    Inherits UserControl

    Public Sub New()
        InitializeComponent()
    End Sub

    Public Property HtmlContent() As String
        Get
            Dim content As String = String.Empty

            If Not WebCore.IsInitialized Then
                WebCore.Initialize(New WebConfig() With {.LogLevel = LogLevel.Verbose})
            Else

                Dim html As JSValue = webBrowserControl.ExecuteJavascriptWithResult("GetContent")

                content = html.ToString

            End If

            Return content
        End Get
        Set(value As String)
            If WebCore.IsInitialized Then
                Dim objResult As JSObject = webBrowserControl.ExecuteJavascriptWithResult("window")
                objResult.InvokeAsync("SetContent", value)
            End If

        End Set
    End Property

    Public Sub CreateEditor()
        If File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "html\template\tinymce\js\tinymce\tinymce.min.js")) Then
            webBrowserControl.Source = New Uri("file:///" & Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "html\template\tinymce.htm").Replace("\"c, "/"c))
        Else
            MessageBox.Show("Could not find the tinyMCE script directory. " & (Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "html\template\tinymce\js\tinymce\tinymce.min.js")), "Error", MessageBoxButtons.OK, MessageBoxIcon.[Error])
        End If
    End Sub
End Class

My HTML is fairly simplistic as far as the TinyMCE goes:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
  <title>tinyMCE WYSIWYG Editor</title>
</head>

<script type="text/javascript" src="tinymce/js/tinymce/tinymce.min.js"></script>

<!-- Script functions to expose tinyMCE internals that get called from code using InvokeScript method. -->
<script type="text/javascript">
  function GetContent() {
    return tinyMCE.get('tinyMceEditor').getContent();
  }

  function SetContent(htmlContent) {
    tinyMCE.get('tinyMceEditor').setContent(htmlContent);
  }
</script>

<!-- TinyMCE -->
  <script type="text/javascript">
      tinymce.init({
          selector: 'textarea',
          menu: {
              file: { title: 'File', items: 'newdocument' },
              edit: { title: 'Edit', items: 'undo redo | cut copy paste pastetext | selectall' },
              insert: { title: 'Insert', items: 'link media | template hr' },
              view: { title: 'View', items: 'visualaid' },
              format: { title: 'Format', items: 'bold italic underline strikethrough superscript subscript | formats | removeformat' },
              table: { title: 'Table', items: 'inserttable tableprops deletetable | cell row column' },
              tools: { title: 'Tools', items: 'spellchecker code' },
              plantwatch: { title: 'My Menu', items: 'dataloop collectorloop processloop historian emailgroup alertgroup menusave' }
          },
          menubar : 'plantwatch file edit insert view format table tools',
          plugins: [
    'advlist autolink lists link image charmap print preview hr anchor pagebreak',
    'searchreplace wordcount visualblocks visualchars code fullscreen',
    'insertdatetime media nonbreaking save table contextmenu directionality',
    'emoticons template paste textcolor colorpicker textpattern imagetools codesample toc'
          ],
          toolbar1: 'undo redo | insert | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image',
          toolbar2: 'forecolor backcolor emoticons | codesample',
          image_advtab: true,

          setup: function (editor) {
              editor.addMenuItem('dataloop', {
                  text: 'Data Loop',
                  onclick: function () {
                      editor.insertContent('{LOOP:Data}');
                  }
              });
              editor.addMenuItem('collectorloop', {
                  text: 'Collector Loop',
                  onclick: function () {
                      editor.insertContent('{LOOP:Collector}');
                  }
              });
              editor.addMenuItem('processloop', {
                  text: 'Process Loop',
                  onclick: function () {
                      editor.insertContent('{LOOP:Process}');
                  }
              });
              editor.addMenuItem('historian', {
                  text: 'Historian Server Name',
                  onclick: function () {
                      editor.insertContent('{HistorianServerName}');
                  }

              });
              editor.addMenuItem('emailgroup', {
                  text: 'Email Group Name',
                  onclick: function () {
                      editor.insertContent('{EmailGroupName}');
                  }

              });
              editor.addMenuItem('alertgroup', {
                  text: 'Alert Group Name',
                  onclick: function () {
                      editor.insertContent('{AlertGroupName}');
                  }
              });

          }

      });


  </script>
<!-- /TinyMCE -->

<body>
  <form method="post">
    <!-- Gets replaced with TinyMCE, remember HTML in a textarea should be encoded -->
      <textarea name="tinyMceEditor" cols="1" rows="1" style="width:100%; height: 78%"></textarea>
  </form>
</body>
</html>

I then have a button on my Windows Form that calls the following:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click MsgBox(tinyMceEditor.HtmlContent) End Sub

I would have expected that to return the content, but instead it is only returning the full text of the function itself, which is this:

function GetContent() {
        return tinyMCE.get('tinyMceEditor').getContent();
      }

It is returning that in string form, of course, since that is how my code structured it. I'm not sure why it isn't returning the HTML, though.


Solution

  • Right now you're just referencing the GetContent function so it's returning the definition, you need to call it to get the result.

    Change:

    Dim html As JSValue = webBrowserControl.ExecuteJavascriptWithResult("GetContent")

    To:

    Dim html As JSValue = webBrowserControl.ExecuteJavascriptWithResult("GetContent();‌​")