using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;
using LabelShop;

/*
 此文件演示 LabelShop API 接口的使用
 如果您有任何问题，可以发邮件到：
 yanhs@360Code.com

 您可以直接通过 LabelShop.TlxLabelPaint.dll 引用使用 LabelShop.TLXLabelPaintCLS
 此方式下，请确认 LabelShop.TlxLabelPaint.dll 和 TLXLabelPaint.dll 与应用程序在同一目录中

 也可以通过直接使用 TLXLabelPaintCLS.cs 文件，使用 LabelShop.TLXLabelPaintCLS
 此方式下，请确认 TLXLabelPaint.dll 与应用程序在同一目录中

 */

namespace TestCS
{
    public partial class Form1 : Form
    {
        private int handle = 0;     //  用于保存标签模板的句柄
        private string strFileName; //  标签模板文件名称

        public Form1()
        {
            InitializeComponent();
            TLXLabelPaintCLS.RET ret;
            TLXLabelPaintCLS.LICENSETYPE license = 0;

            //  以下是关于授权的操作
            //  通过授权密码对接口进行授权，如果您有企业版授权码，请在此输入授权码
            //  更多授权相关信息，请咨询 ： 400-0987-360
            //  00000-00000-00000-00000-00000
//            ret = TLXLabelPaintCLS.SetLicense("00000-00000-00000-00000-00000");

            TLXLabelPaintCLS.InitLibrary();

            String strVersion = "";
            TLXLabelPaintCLS.GetVersionString(ref strVersion);

            //  获取授权状态
            ret = TLXLabelPaintCLS.GetLicense(ref license);

            switch (license)
            {
                case TLXLabelPaintCLS.LICENSETYPE.TLXLP_LICENSE_BASIC:
                    lbLicense.Text = "授权模式：标准版";
                    break;
                case TLXLabelPaintCLS.LICENSETYPE.TLXLP_LICENSE_PROFESSIONAL:
                    lbLicense.Text = "授权模式：专业版";
                    break;
                case TLXLabelPaintCLS.LICENSETYPE.TLXLP_LICENSE_ENTERPRISE:
                    lbLicense.Text = "授权模式：企业版";
                    break;
                case TLXLabelPaintCLS.LICENSETYPE.TLXLP_LICENSE_NONE:
                    lbLicense.Text = "授权模式：未授权";
                    break;
            }

            //  系统中的所有打印机
            //foreach (string sPrint in PrinterSettings.InstalledPrinters)
            //    cbPrinters.Items.Add(sPrint);

            //  获取 LabelShop 支持的打印机列表
            //  LabelShop 从 5.30 版本起，支持内置打印机驱动模式，使用 GetSysPrinterNames 接口，可以获取系统中已经安装的此类打印机
            //  需要注意的是，此类打印机在WINDOWS中是不可见的
            //  另外，此类打印机一般是需要在 LabelShop 中手工安装的
            //  但是如果打开的一个标签模板中使用了一台未安装的此类打印机，则系统会自动安装此打印机
            //  因此在打开了一个模板后，可能需要刷新打印机列表

            string strPrinters = "";
            ret = TLXLabelPaintCLS.GetSysPrinterNames(ref strPrinters);

            //  打印机名称是用 \n 分隔开的
            string[] sPrinterArray = strPrinters.Split(new char[] { '\n' });
            foreach (string sPrint in sPrinterArray)
                cbPrinters.Items.Add(sPrint);


            tbQty.Text = "1";
            tbCopy.Text = "1";
        }

        //  返回值及错误信息
        private string ErrorMessage(TLXLabelPaintCLS.RET id)
        {
            string strMessage = "未知错误";
            switch (id)
            {
                case TLXLabelPaintCLS.RET.TLXLP_OK:
                    strMessage = "成功返回";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_ERROR:
                    strMessage = "出错";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_INVALIDDOCUMENT:
                    strMessage = "无效的文档";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_OPENDOCUMENT:
                    strMessage = "打开文档失败";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_SAVEDOCUMENT:
                    strMessage = "保存文档失败";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_NOTFOUNDRECORD:
                    strMessage = "未查找到数据库记录";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_PRINTLABELS:
                    strMessage = "打印标签失败";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_INVALIDVARIABLE:
                    strMessage = "无效的变量";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_BUFFERTOOSMALL:
                    strMessage = "缓冲区内存空间太小";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_INVALIDLICENSEKEY:
                    strMessage = "无效的授权码";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_UNAUTHORIZED:
                    strMessage = "未授权";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_NOTFOUNDPRINTER:
                    strMessage = "未找到目标打印机";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_NOTFOUNDLABELSHOP:
                    strMessage = "没有安装 LabelShop";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_VERSIONTOOLOW:
                    strMessage = "LabelShop 版本太低，需要 LabelShop 5.21 或者更高的版本";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_NOTCHANGE:
                    strMessage = "未发生改变";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_INVALIDROWNUMBER:
                    strMessage = "无效的记录行号";
                    break;
                case TLXLabelPaintCLS.RET.TLXLP_NONSUPPORT:
                    strMessage = "不支持的功能";
                    break;
            }

            return strMessage;
        }

        //  打开模板文件
        private void button1_Click(object sender, EventArgs e)
        {
            TLXLabelPaintCLS.RET ret;

            //  获取需要打开的模板文件的名称
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "LabelShop标签模板文件(*.lsdx)|*.lsdx";
            ofd.ValidateNames = true;
            ofd.CheckPathExists = true;
            ofd.CheckFileExists = true;
            if (ofd.ShowDialog() != DialogResult.OK)
                return;

            strFileName = ofd.FileName;

            lbFileName.Text = "模板文件：" + strFileName;

            ret = TLXLabelPaintCLS.OpenDocument(strFileName, ref handle);
            if (ret != TLXLabelPaintCLS.RET.TLXLP_OK)
            {
                MessageBox.Show(ErrorMessage(ret),"出错",MessageBoxButtons.OK,MessageBoxIcon.Warning);
                return;
            }

            //  模板文件是否被授权。我们将使用付费版本的 LabelShop 编辑保存的标签模板提前为被授权的标签模板文件
            //  在使用企业版授权模式打印时，需要使用授权的标签模板
            TLXLabelPaintCLS.DOCLEVEL level = TLXLabelPaintCLS.DOCLEVEL.TLXLP_DOCUMENT_BASIC;
            ret = TLXLabelPaintCLS.GetDocumentLevel(handle, ref level);
            lbDocLevel.Text = "模板授权：";
            if (ret != TLXLabelPaintCLS.RET.TLXLP_OK)
            {
                MessageBox.Show(ErrorMessage(ret),"出错",MessageBoxButtons.OK,MessageBoxIcon.Warning);
            }
            else
            {
                switch (level)
                {
                    case TLXLabelPaintCLS.DOCLEVEL.TLXLP_DOCUMENT_BASIC:
                        lbDocLevel.Text = "模板授权：未授权的模板";
                        break;
                    case TLXLabelPaintCLS.DOCLEVEL.TLXLP_DOCUMENT_PROFESSIONAL:
                        lbDocLevel.Text = "模板授权：已授权的模板";
                        break;
                }
            }

            /*  关于模板授权状态的特别说明：
                在企业版授权模式下，只有模板授权状态为已授权的标签模板，才可以被接口2正常打印
                而打印未授权的模板时，会被加入特殊的标记

                使用付费版本的LabelShop编辑并保存的模板是已授权的模板，付费的版本包括LabelShop专业版和企业版
                使用免费的LabelShop以及OEM版本的LabelShop编辑的标签模板，是未授权的模板
            */

            /*
             关于标签中的命名变量
             可以通过接口，对标签模板上的命名变量进行赋值，以达到动态设置标签打印内容的目的
             接口允许从标签模板中读出所有的命名变量名称，并分别获取其当前值
             */
            string strNames = "";
            ret = TLXLabelPaintCLS.GetNamedVarNames(handle, ref strNames);

            //  命令变量是用 \n 分隔开的
            string[] sNameArray = strNames.Split(new char[] { '\n' });

            cbVarNames.Items.Clear();

            foreach (string sVarName in sNameArray)
            {
                cbVarNames.Items.Add(sVarName);
            }
            cbVarNames.SelectedIndex = 0;

            /*
             关于标签略图
             接口支持获取标签模板的略图，以便于显示给用户参考
             */
            Bitmap bmp = null;
            ret = TLXLabelPaintCLS.GetThumbnailEx(handle, ref bmp ,this.pictureBox1.Size.Width - 2, this.pictureBox1.Size.Height - 2,
                TLXLabelPaintCLS.TLXLP_THUMB_WORKSPACECOLOR, 0);

            //  在此处更新打印机列表
            //  LabelShop 从5.30 版本起，支持内置打印机驱动模式，请参考 窗体初始化时相关代码的说明
            //  打开一个新的模板，可能会自动安装一台内置驱动的打印机，因此需要更新打印机列表
            string strPrinters = "";
            ret = TLXLabelPaintCLS.GetSysPrinterNames(ref strPrinters);
            cbPrinters.Items.Clear();
            //  打印机名称是用 \n 分隔开的
            string[] sPrinterArray = strPrinters.Split(new char[] { '\n' });
            foreach (string sPrint in sPrinterArray)
                cbPrinters.Items.Add(sPrint);


            string strPrinter = "";
            TLXLabelPaintCLS.GetPrinterName(handle, ref strPrinter);

            cbPrinters.Text = strPrinter;
            if (cbPrinters.SelectedIndex == -1)
            {
                //  程序不会执行到这里，因为在标签模板打开时，如果没有找到标签模板中记录的打印机，则试图匹配一台近似的打印机，否则自动转换到系统默认打印机上
                PrintDocument print = new PrintDocument();
                string sDefault = print.PrinterSettings.PrinterName;//默认打印机名
                cbPrinters.Text = sDefault;
            }


            pictureBox1.Image = bmp;
        }

        //  使用免费的打印接口一打印标签
        private void button2_Click(object sender, EventArgs e)
        {
            if (handle == 0)
                return;
            
            //  如果目标打印机不同，请设置目标打印机
            TLXLabelPaintCLS.SetPrinterName(handle, cbPrinters.Text);
            TLXLabelPaintCLS.RET ret;
            int copy = int.Parse(tbCopy.Text);
            ret = TLXLabelPaintCLS.OutputLabel(handle, copy, true);

        }


        //  设置命名变量的值
        private void button3_Click(object sender, EventArgs e)
        {
            if (handle == 0)
                return;
            TLXLabelPaintCLS.RET ret;

            string strVarName = cbVarNames.Text;
            string strVarValue = tbVarValue.Text;
            if (strVarName.Length <= 0)
                return;

            ret = TLXLabelPaintCLS.SetNamedVariable(handle, strVarName, strVarValue);

            //  重画标签
            Bitmap bmp = null;
            ret = TLXLabelPaintCLS.GetThumbnailEx(handle, ref bmp, this.pictureBox1.Size.Width - 2, this.pictureBox1.Size.Height - 2,
                TLXLabelPaintCLS.TLXLP_THUMB_WORKSPACECOLOR, 0);

            pictureBox1.Image = bmp;
        }

        //  保存标签模板文档
        private void button4_Click(object sender, EventArgs e)
        {
            if (handle == 0)
                return;
            TLXLabelPaintCLS.RET ret;
            //           ret = TLXLabelPaintCLS.SaveDocument(handle);

            //  如果需要换名保存，请使用  TLXLabelPaintCLS.SaveAsDocument();
            //  注意：如果编辑过这个标签，最好使用换名保存的方式保存
            ret = TLXLabelPaintCLS.SaveAsDocument(handle, strFileName);
        }

        //  使用打印接口2打印标签，需要授权才可以正常使用
        private void button5_Click(object sender, EventArgs e)
        {
            if (handle == 0)
                return;
            TLXLabelPaintCLS.RET ret;
            /*
                    err 取值
                    0   授权不符时，输出标签，但是标签上会包含额外的标记
                    1   授权不符时，不输出标签
                    2   授权不符时，给出提示，用户选择是否输出标签，如果希望尽量避免输出带额外标记的标签，可以用这个方法提供用户选择的机会
            */
            int qty = int.Parse(tbQty.Text);
            int copy = int.Parse(tbCopy.Text);
            //  如果目标打印机不同，请设置目标打印机
            TLXLabelPaintCLS.SetPrinterName(handle, cbPrinters.Text);
            ret = TLXLabelPaintCLS.OutputDocument(handle, qty, copy, 0);

            MessageBox.Show(ErrorMessage(ret), "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }

        //  调用安装的 LabelShop 编辑标签模板
        private void button6_Click(object sender, EventArgs e)
        {
            if (handle == 0)
                return;

            //  本演示是编辑XML格式的标签，也可以使用 TLXEditTemplate 直接编辑标签文件
            TLXLabelPaintCLS.RET ret;
            string strXML = "";
            //  获取标签模板的XML格式文档，可以用于网络传输和保存
            ret = TLXLabelPaintCLS.GetDocumentXML(handle, ref strXML);
            string strNewXML = "";
            //  编辑标签模板
            ret = TLXLabelPaintCLS.EditTemplateXML(strXML, ref strNewXML);

            if (ret != TLXLabelPaintCLS.RET.TLXLP_OK)
            {
                MessageBox.Show(ErrorMessage(ret), "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            //  重新打开编辑后的文档
            ret = TLXLabelPaintCLS.CloseDocument(handle);
            //  使用XML文档格式打开文档
            ret = TLXLabelPaintCLS.OpenDocumentXML(strNewXML, ref handle, false);

            //  编辑完成的模板，可能会更换了目标打印机，要进行相关的处理
            //  在此处更新打印机列表
            //  LabelShop 从5.30 版本起，支持内置打印机驱动模式，请参考 窗体初始化时相关代码的说明
            //  打开一个新的模板，可能会自动安装一台内置驱动的打印机，因此需要更新打印机列表
            string strPrinters = "";
            ret = TLXLabelPaintCLS.GetSysPrinterNames(ref strPrinters);
            cbPrinters.Items.Clear();
            //  打印机名称是用 \n 分隔开的
            string[] sPrinterArray = strPrinters.Split(new char[] { '\n' });
            foreach (string sPrint in sPrinterArray)
                cbPrinters.Items.Add(sPrint);


            string strPrinter = "";
            TLXLabelPaintCLS.GetPrinterName(handle, ref strPrinter);

            cbPrinters.Text = strPrinter;
            if (cbPrinters.SelectedIndex == -1)
            {
                //  程序不会执行到这里，因为在标签模板打开时，如果没有找到标签模板中记录的打印机，则试图匹配一台近似的打印机，否则自动转换到系统默认打印机上
                PrintDocument print = new PrintDocument();
                string sDefault = print.PrinterSettings.PrinterName;//默认打印机名
                cbPrinters.Text = sDefault;
            }


            Bitmap bmp = null;
            ret = TLXLabelPaintCLS.GetThumbnailEx(handle, ref bmp, this.pictureBox1.Size.Width - 2, this.pictureBox1.Size.Height - 2,
                TLXLabelPaintCLS.TLXLP_THUMB_WORKSPACECOLOR, 0);

            pictureBox1.Image = bmp;
        }

        //  关闭模板文件
        private void button7_Click(object sender, EventArgs e)
        {
            if (handle == 0)
                return;
            TLXLabelPaintCLS.RET ret;
            ret = TLXLabelPaintCLS.CloseDocument(handle);
            pictureBox1.Image = null;
            handle = 0;
        }

        //  配置打印机
        private void button8_Click(object sender, EventArgs e)
        {
            if (handle == 0)
                return;

            // 如果标签模板需要在不同的打印机上进行打印，此处需要先设置新的目标打印机
            TLXLabelPaintCLS.SetPrinterName(handle,cbPrinters.Text);
            TLXLabelPaintCLS.PrinterProperties(handle, IntPtr.Zero);

            //  如果希望保存打印机的参数，需要保存整个标签模板
        }

        //  打印预览
        private void button9_Click(object sender, EventArgs e)
        {
            if (handle == 0)
                return;

            TLXLabelPaintCLS.RET ret;
            int qty = int.Parse(tbQty.Text);
            int copy = int.Parse(tbCopy.Text);
            //  如果目标打印机不同，请设置目标打印机
            TLXLabelPaintCLS.SetPrinterName(handle, cbPrinters.Text);
            ret = TLXLabelPaintCLS.PreviewDocument(handle, qty, copy, 0);
        }

        //  批量打印
        private void button10_Click(object sender, EventArgs e)
        {
//            MessageBox.Show("此接口的使用方法，请参考源代码！", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
//              return;

            if (handle == 0)
                return;

            TLXLabelPaintCLS.RET ret;

            //  如果目标打印机不同，请设置目标打印机
            TLXLabelPaintCLS.SetPrinterName(handle, cbPrinters.Text);
            //  清空数据
            ret = TLXLabelPaintCLS.NamedVarsClearData(handle);
            //  第一行数据
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 0, "NAME", "读卡机");
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 0, "BARCODE", "00000000");
            //  使用数据源图片模式，动态设置图片
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 0, "PICTURE", "CE.BMP");
            //  第二行数据
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 1, "NAME", "扫描仪");
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 1, "BARCODE", "12345678");
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 1, "PICTURE", "CD.BMP");
            //  打印
            ret = TLXLabelPaintCLS.OutputDocument(handle, 2, 1, 0);

            //  清空数据，再打一次
            ret = TLXLabelPaintCLS.NamedVarsClearData(handle);
            //  第一行数据
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 0, "NAME", "小汽车");
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 0, "BARCODE", "88888888");
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 0, "PICTURE", "CE.BMP");
            //  第二行数据
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 1, "NAME", "智能手机");
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 1, "BARCODE", "55555555");
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 1, "PICTURE", "CD.BMP");
            //  第三行数据
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 2, "NAME", "无人机");
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 2, "BARCODE", "67676677");
            ret = TLXLabelPaintCLS.NamedVarsAddVarData(handle, 2, "PICTURE", "CE.BMP");
            //  打印
            ret = TLXLabelPaintCLS.OutputDocument(handle, 3, 2, 0);

        }
    }
}
