Example #1
0
		/// <summary>
		/// Imprime etiquetas
		/// </summary>
		/// <param name="etiquetas">Etiquetas a serem impressas</param>
		/// <param name="layout">Layout de etiquetas</param>
		private void ImprimirEtiquetas(EtiquetaFormato [] etiquetas, LabelLayout layout)
		{
            ArrayList saquinhosImpressos = new ArrayList();

			int deEtiqueta, atéEtiqueta;	// Seleção de etiquetas a serem impressas
			int nEtiquetas;					// Total de etiquetas a serem impressas
			int etiquetasPágina;			// Etiquetas por página
			int iEtiqueta;					// Iterador

			nEtiquetas      = CalcularNúmeroEtiquetas(etiquetas);
			etiquetasPágina = layout.LabelsPerPage;

			printDlg.PrinterSettings.MaximumPage = (int) Math.Ceiling(nEtiquetas / (float) etiquetasPágina);
			printDlg.PrinterSettings.MinimumPage = 1;
			printDlg.PrinterSettings.DefaultPageSettings.PaperSize = layout.PaperSize;
			printDlg.PrinterSettings.FromPage = 1;
			printDlg.PrinterSettings.ToPage = printDlg.PrinterSettings.MaximumPage;

			if (printDlg.ShowDialog(this.ParentForm) != DialogResult.OK)
			{
				MessageBox.Show(this, "Impressão cancelada pelo usuário", "Impressão", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);	
				return;
			}

			aguardeImpressão = new Aguarde(
					   "Preparando impressão...",
					   2 + printDlg.PrinterSettings.ToPage - printDlg.PrinterSettings.FromPage,
					   "Imprimindo etiquetas",
					   "Aguarde enquanto o sistema imprime as etiquetas solicitadas.");

			// Mostrar janela de espera
            aguardeImpressão.Abrir();
			
			aguardeImpressão.Tag = 0;			// Usado para numeração de página

			try
			{
				// Preparar impressão
				layout.Document = printDoc;
				deEtiqueta      = (printDlg.PrinterSettings.FromPage - 1) * etiquetasPágina;
				atéEtiqueta     = (printDlg.PrinterSettings.ToPage) * etiquetasPágina - 1;
				iEtiqueta       = 0;

				// Inserir objetos de impressão
				layout.Objects = new ArrayList();

				// Atualizando dados
				aguardeImpressão.Passo("Sincronizando dados com o banco de dados");
				bandeja.AtualizaObjetosInstrínsecosDosSaquinhos();

				// Formata a impressão
				aguardeImpressão.Passo("Formatando dados para impressão de etiquetas");
 
				foreach (SaquinhoEtiqueta saquinho in bandeja)
				{
					/* Verificar se saquinho contém formato a ser
						* impresso. Não é a melhor implementação,
						* porém o número de formatos é bem pequeno,
						* levando a um pior desempenho caso utilizado
						* busca binária, já que deve ordenar os itens.
						*/
					for (int i = 0; i < etiquetas.Length; i++)
						if (saquinho.Etiqueta == etiquetas[i])
						{
#if DEBUG
                            if (saquinho.Mercadoria == null)
                                throw new NullReferenceException("Mercadoria de saquinho está nula!");
#endif
							if (iEtiqueta >= deEtiqueta && iEtiqueta <= atéEtiqueta)
							{
								layout.Objects.Add(
									new RepeatedObject(
									layout.Items[i],
									saquinho.Mercadoria,
									( Convert.ToInt32(saquinho.Quantidade) > atéEtiqueta - iEtiqueta + 1
									? atéEtiqueta - iEtiqueta + 1
									: Convert.ToInt32(saquinho.Quantidade))));

                                saquinho.Impresso = true;

                                if (saquinhosImpressos.Contains(saquinho)) throw new Exception("Lista ja contem o item de etiqueta");
                                saquinhosImpressos.Add(saquinho);
							}
							else if (iEtiqueta <= atéEtiqueta && iEtiqueta + saquinho.Quantidade >= deEtiqueta)
							{
								layout.Objects.Add(
									new RepeatedObject(
									layout.Items[i],
									saquinho.Mercadoria,
									Convert.ToInt32(saquinho.Quantidade) - (deEtiqueta - iEtiqueta) > atéEtiqueta - iEtiqueta + 1
									? atéEtiqueta - iEtiqueta + 1
									: Convert.ToInt32(saquinho.Quantidade) - (deEtiqueta - iEtiqueta)));

                                saquinho.Impresso = true;

                                if (saquinhosImpressos.Contains(saquinho)) throw new Exception("Lista ja contem o item de etiqueta");
                                saquinhosImpressos.Add(saquinho);
							}

							iEtiqueta += Convert.ToInt32(saquinho.Quantidade);
						}
				}

				bool loop;

				do
				{
#if !DEBUG
					try
#endif
				{
					printDoc.Print();

					loop = false;
				}
#if !DEBUG
					catch (Exception e)
					{
						loop = MessageBox.Show(
							this.ParentForm,
							"Não foi possível imprimir o documento. Verifique se a impressora está ligada e conectada corretamente ao computador.",
							"Impressão de etiquetas - " + e.Message,
							MessageBoxButtons.RetryCancel) == DialogResult.Retry;

						if (loop)
						{
							printDlg.AllowSomePages = false;
							printDlg.ShowDialog(this.ParentForm);
						}
					}
#endif
				} while (loop);
			}
			finally
			{
				layout.Dispose();
                aguardeImpressão.Close();
                aguardeImpressão.Dispose();
                aguardeImpressão = null;
			}

            bandeja.FoiImpresso(saquinhosImpressos);

            opçãoImprimir.Enabled = true;
		}