How to fill the plug-in interface correctly

The complete code is included in our SDK, you can download it here

This example is for an extra tool bar, if you need a button for the new ribbon menu use the included class "PluginMenuItemDemo.cs", there is the interfache IPluginRibbonCommand used with some examples.

using System;
using System.Collections.Generic;
using System.Text;
using PCBI.Plugin;
using PCBI.Plugin.Interfaces;
using System.Windows.Forms;
using System.Drawing;
using PCBI.Automation;
 
namespace PluginDemo
{
 
  [Plugin("PluginToolBarDemo", "FG", "PluginToolBarDemo shows two demo-actions for change the display in PCB-Investigator.", "1.0.0.0")]
  public class PluginToolBarDemo : ToolStrip, IPluginToolStrip
  {
    #region IPluginToolStrip Members
    //On which position should the toolbar dock.
    private ContainerPosition position = ContainerPosition.Left;
    public ContainerPosition Position
    {
      get
      {
        return position;
      }
      set
      {
        position = value;
      }
    }
    #endregion
 
    #region IPlugin Members
    //interface information
    private bool pluginEnabled;
    public bool PluginEnabled
    {
      get
      {
        return pluginEnabled;
      }
      set
      {
        pluginEnabled = value;
      }
    }
    private string assembly;
    public string Assembly
    {
      get
      {
        return assembly;
      }
      set
      {
        assembly = value;
      }
    }
    private string path;
    public string Path
    {
      get
      {
        return path;
      }
      set
      {
        path = Path;
      }
    }
    private Type type;
    public Type Type
    {
      get
      {
        return type;
      }
      set
      {
        type = value;
      }
    }
    IPCBIWindow parent;
    public IPCBIWindow Parent
    {
      get
      {
        return parent;
      }
      set
      {
        parent = value;
      }
    }
    private PluginDestinationWindow pluginDestination = PluginDestinationWindow.MainWindow;
    public PluginDestinationWindow PluginDestination
    {
      get
      {
        return pluginDestination;
      }
      set
      {
        pluginDestination = value;
      }
    }
    public bool IsActionAllowed(ID_ActionItem action)
    {
      return false;
    }
    public void InitEvents(IPCBIWindow Parent)
    {
    }
    #endregion
 
    #region Konstruktor
    public PluginToolBarDemo()
    {
 
      this.BackColor = Color.Red; //for the demo we want to highlight the tool bar
      this.Items.Add("Top View");
      this.Items[0].Click += new EventHandler(PluginToolBarDemoTopView_Click);
      position = ContainerPosition.Top;
      this.Items.Add("Bot View");
      this.Items[1].Click += new EventHandler(PluginToolBarDemoBotView_Click);
    }
    #endregion
 
    #region ToolBarClicks
    private void PluginToolBarDemoBotView_Click(object sender, EventArgs e)
    {
      //activate signal-bot, component-bot, drills and solder mask bot
      PCBI.Automation.IMatrix matrix = parent.GetMatrix();
      if (matrix == null) { MessageBox.Show("Error in matrix.", "MATRIX-ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }
      PCBI.Automation.IStep step = parent.GetStep(matrix.GetStepNames()[0]);
      if (step == null) { MessageBox.Show("Error in step.", "NO STEP", MessageBoxButtons.OK, MessageBoxIcon.Information); return; }
 
      ActivateBotView(matrix, step);
 
      parent.UpdateView();
    }
 
    private void PluginToolBarDemoTopView_Click(object sender, EventArgs e)
    {
      //activate signal-top, component-top, drills and solder mask top
      if (!parent.JobIsLoaded) { MessageBox.Show("First load a job.", "NO JOB", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }
 
      PCBI.Automation.IMatrix matrix = parent.GetMatrix();
      if (matrix == null) { MessageBox.Show("Error in matrix.", "MATRIX-ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }
      PCBI.Automation.IStep step = parent.GetStep(matrix.GetStepNames()[0]);
      if (step == null) { MessageBox.Show("Error in step.", "NO STEP", MessageBoxButtons.OK, MessageBoxIcon.Information); return; }
      
      ActivateTopView(matrix, step);
 
      parent.UpdateView();
    }
 
    #endregion
 
    #region helper methodes
    /// <summary>
    /// This methode deaktivate all layer in a step.
    /// </summary>
    /// <param name="step">the relevant step</param>
    private static void DeactivateAllLayer(PCBI.Automation.IStep Step)
    {
      //make the same like: Step.TurnOffAllLayer();
 
      if (Step == null) return;
 
      foreach (string layerName in Step.GetAllLayerNames())
      {
        ILayer layer = Step.GetLayer(layerName);
        if (layer == null) continue;
 
        layer.DisableLayer();
      }
    }
    /// <summary>
    /// Activate all relevant layer for top view.
    /// </summary>
    /// <param name="Step">the relevant step</param>
    /// <param name="Matrix">the job matrix</param>
    private static void ActivateTopView(PCBI.Automation.IMatrix Matrix, PCBI.Automation.IStep Step)
    {
      if (Step == null || Matrix == null) return;
 
      DeactivateAllLayer(Step);
 
      string name = Matrix.GetTopComponentLayer();
      //If there is a error in the matrix you get null or "".
      if (name == null || name.Length < 1) { MessageBox.Show("Error in Top Component Layer.", "NO Top-CMP-Layer", MessageBoxButtons.OK, MessageBoxIcon.Error); }
      else
      {
        ILayer TopCMPLayer = Step.GetLayer(name);
        if (TopCMPLayer == null) { MessageBox.Show("Error in Top Component Layer.", "NO Top-CMP-Layer", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        else TopCMPLayer.EnableLayer(true);
      }
 
      name = Matrix.GetTopSignalLayer();
      if (name == null || name.Length < 1) { MessageBox.Show("Error in top signal layer.", "NO Top-Signal-Layer", MessageBoxButtons.OK, MessageBoxIcon.Error); }
      else
      {
        ILayer TopSigLayer = Step.GetLayer(name);
        if (TopSigLayer == null) { MessageBox.Show("Error in top signal layer.", "NO Top-Signal-Layer", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        else TopSigLayer.EnableLayer(true);
        ActivateDrillLayer(name, Step, Matrix);
      }
      FindAndAktivateMaskLayer(true, Step, Matrix);
      
    }
    /// <summary>
    /// Activate all relevant layer for bottom view.
    /// </summary>
    /// <param name="Step">the relevant step</param>
    /// <param name="Matrix">the job matrix</param>
    private static void ActivateBotView(PCBI.Automation.IMatrix Matrix, PCBI.Automation.IStep Step)
    {
      if (Step == null || Matrix == null) return;
 
      DeactivateAllLayer(Step);
 
      string name = Matrix.GetBotComponentLayer();
      //If there is a error in the matrix you get null or "".
      if (name == null || name.Length < 1) { MessageBox.Show("Error in Bot Component Layer.", "NO Bot-CMP-Layer", MessageBoxButtons.OK, MessageBoxIcon.Error); }
      else
      {
        ILayer BotCMPLayer = Step.GetLayer(name);
        if (BotCMPLayer == null) { MessageBox.Show("Error in Bot Component Layer.", "NO Bot-CMP-Layer", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        else BotCMPLayer.EnableLayer(true);
      }
      name = Matrix.GetBotSignalLayer();
      if (name == null || name.Length < 1) { MessageBox.Show("Error in bot signal layer.", "NO Bot-Signal-Layer", MessageBoxButtons.OK, MessageBoxIcon.Error); }
      else
      {
        ILayer BotSigLayer = Step.GetLayer(name);
        if (BotSigLayer == null) { MessageBox.Show("Error in bot signal layer.", "NO Bot-Signal-Layer", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        else BotSigLayer.EnableLayer(true);
        ActivateDrillLayer(name, Step, Matrix);
      }
      FindAndAktivateMaskLayer(false, Step, Matrix);
    }
    /// <summary>
    /// This methode search for solder mask layer and activate the first/last one.
    /// </summary>
    /// <param name="TopOne">Take the first mask layer?</param>
    /// <param name="Step">the relevant step</param>
    /// <param name="Matrix">the job matrix</param>
    private static void FindAndAktivateMaskLayer(bool TopOne, PCBI.Automation.IStep Step, PCBI.Automation.IMatrix Matrix)
    {
      if(Step==null|| Matrix==null) return;
 
      int IndexMask = -1;
      foreach (string layerName in Step.GetAllLayerNames())
      {
        if (Matrix.GetMatrixLayerContext(layerName) == MatrixLayerContext.Board && Matrix.GetMatrixLayerType(layerName) == MatrixLayerType.Solder_mask)
        {
          if (TopOne && (Matrix.GetRawIndexByName(layerName) < IndexMask || IndexMask < 0))
          {
            IndexMask = Matrix.GetRawIndexByName(layerName);
            break;
          }
          else if (!TopOne && (Matrix.GetRawIndexByName(layerName) > IndexMask))
            IndexMask = Matrix.GetRawIndexByName(layerName);
        }
      }
 
      string nameMaskLayer = Matrix.GetNameByRowIndex(IndexMask);
 
      if (nameMaskLayer != null && nameMaskLayer.Length > 0)
      {
        ILayer layer = Step.GetLayer(nameMaskLayer);
        if (layer != null) layer.EnableLayer(true);
      }
    }
 
    /// <summary>
    /// This methode activate all drill layer who dill through the relevantSignalLayer.
    /// </summary>
    /// <param name="RelevantSignalLayer">the relevant layer</param>
    /// <param name="Step">the relevant step</param>
    /// <param name="Matrix">the job matrix</param>
    private static void ActivateDrillLayer(string RelevantSignalLayer, PCBI.Automation.IStep Step, PCBI.Automation.IMatrix Matrix)
    {
      //check always for errors:
      if (Step == null || Matrix == null) return;
 
      int RowIndexMainLayer = Matrix.GetRawIndexByName(RelevantSignalLayer);
      if(RowIndexMainLayer<0) return;
 
      foreach (string layerName in Step.GetAllLayerNames())
      {
        if (Matrix.GetMatrixLayerType(layerName) == MatrixLayerType.Drill) //check is it a drill layer?
        {
          int startDrill = Matrix.GetStartDrillLayer(layerName);
          int endDrill = Matrix.GetEndDrillLayer(layerName);
 
          if ((startDrill <= RowIndexMainLayer && endDrill >= RowIndexMainLayer)||(startDrill==endDrill && startDrill==0))
          {
            ILayer drillLayer = Step.GetLayer(layerName);
            if (drillLayer != null) drillLayer.EnableLayer(true);
          }
        }
      }
    }
    #endregion
  }
}