Page 1 of 1

Any Plugin Code Examples in C#?

Posted: Fri Aug 28, 2015 11:22 am
by dandam
Has anyone written a Flare API plugin using C#? If so, are you willing to share the code? I'd like to learn more about how to write plugins. Partly because I'd like to automate some tasks in my 3,000+ page reference guide, but mostly because I'd like to practice coding in C#.

FYI--Although I've been studying C# for about a year now, I had no idea I could use that knowledge to improve my Flare skills. I just read Chapter 10 of "MadCap Flare for Programmers" by Tregner and Owens, and my head nearly exploded. Cool stuff. Thanks guys!

Re: Any Plugin Code Examples in C#?

Posted: Sun Aug 30, 2015 3:38 pm
by Paulie
Hi there,

Here is a real basic, but working example that adds a toolbar strip and button. Clicking the button will copy the inner html of the currently selected topic's body tag to the clipboard.

I assume you have downloaded the Flare API documentation already. Most of the below code was originally sourced from there, with a few hacks of my own to get things working.

Code: Select all

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using B3.PluginAPIKit;
using System.Windows.Forms;
using System.Windows.Input;
using System.Drawing;
using System.Windows.Media.Imaging;
using System.Xml;

namespace DemoPlugin
    
{
    
//This class is required for the Flare application to connect to:
    public class DemoPlugin : IPlugin
    {
        public IHost mHost; 
        private bool mActivated;
        
        private INavContext mNav;
        

        public bool IsActivated
        {
            get { return mActivated; }
        }

        public string GetVersion()
        {
            return Application.ProductVersion;
        }

        public string GetAuthor()
        {
            return "Company Name";
        }

        public string GetDescription()
        {
            return "Plugin description. ";
        }

        public string GetName()
        {
            return "Plugin name";
        }

        public void Initialize(IHost host)
        {
            mHost = host;


        }




        //This function is called when Flare starts the plugin:
        public void Execute()
        {
            mActivated = true;
            
            //Create the custom toolbar:
            mNav = mHost.GetNavContext();
            CreateCustombar();

            
        }

        //Stop the plugin:
        public void Stop()
        {
            mHost.Dispose();
            mActivated = false;
            MessageBox.Show(GetName() + " deactivated!");
        }




        //Add the toolbar and button:
        private void CreateCustombar()
        {
            ICustomToolBar toolBar = mNav.CreateCustomToolBar("Name shown in the View > Toolbars menu");
            toolBar.AddButton("Button Name", new ButtonCommand(mHost));
           // toolBar.AddSeparator();
         //   toolBar.AddMenuButton(RibbonViewModel.MenuData);

        
            
        }



    }



    //Class to handle the custom button click event:
    public class ButtonCommand : ICommand
    {
        private IHost _host;
        public ButtonCommand(IHost host)
        {
            _host = host;

        }
        
        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
           //button clicked so get the <body> tag contents and send it to the clipboard:

            String Tempstr = _host.GetEditorContext().GetActiveDocument().GetDocumentXml();
            if(Tempstr.Length>0)
            {

                XmlTextReader reader = new XmlTextReader(new System.IO.StringReader(Tempstr));
                reader.ReadToDescendant("body");
                StringBuilder sb = new StringBuilder();
                sb.Append(reader.ReadInnerXml());
                //convert bold to strong (try find and replace for now - if issues do a better solution)
                sb.Replace("<b", "<strong");
                sb.Replace("</b", "</strong");
                String OutputText = sb.ToString();


                try
                {
                    System.Windows.Forms.Clipboard.SetText(OutputText);
                    MessageBox.Show("Text successfully copied to the clipboard","Text Copied",MessageBoxButtons.OK,MessageBoxIcon.Information);
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message,"Cannot Copy to the Clipboard",MessageBoxButtons.OK,MessageBoxIcon.Error);
                                       
                }
               

              
            }
          
        
        }


        public  event EventHandler CanExecuteChanged
        {
            add
            {
                
            }
            remove
            {
               
            }
        }


   

    }




}

Re: Any Plugin Code Examples in C#?

Posted: Tue Sep 01, 2015 2:31 pm
by dandam
Thanks! It's neat to see how others use the Plugin capabilities in Flare.

FWIW: I'm trying to build a plugin that reads the selected text, generates a string that includes the selected text, then inserts a bookmark using that string as the bookmark name.