1/////////////////////////////////////////////////////////////////////////////
2// Name:        table.cpp
3// Purpose:     Utilities for manipulating tables
4// Author:      Julian Smart
5// Modified by: Wlodzimiez ABX Skiba 2003/2004 Unicode support
6//              Ron Lee
7// Created:     01/01/99
8// RCS-ID:      $Id: table.cpp 35650 2005-09-23 12:56:45Z MR $
9// Copyright:   (c) Julian Smart
10// Licence:     wxWindows licence
11/////////////////////////////////////////////////////////////////////////////
12
13// For compilers that support precompilation, includes "wx.h".
14#include "wx/wxprec.h"
15
16#ifdef __BORLANDC__
17#pragma hdrstop
18#endif
19
20#ifndef WX_PRECOMP
21#endif
22
23#include "wx/hash.h"
24
25#ifdef new
26#undef new
27#endif
28
29#if wxUSE_IOSTREAMH
30#include <iostream.h>
31#include <fstream.h>
32#else
33#include <iostream>
34#include <fstream>
35#endif
36
37#include <ctype.h>
38#include "tex2any.h"
39#include "table.h"
40
41ColumnData TableData[40];
42bool inTabular = false;
43
44bool startRows = false;
45bool tableVerticalLineLeft = false;
46bool tableVerticalLineRight = false;
47int noColumns = 0;   // Current number of columns in table
48int ruleTop = 0;
49int ruleBottom = 0;
50int currentRowNumber = 0;
51
52/*
53 * Parse table argument
54 *
55 */
56
57bool ParseTableArgument(wxChar *value)
58{
59  noColumns = 0;
60  int i = 0;
61  int len = wxStrlen(value);
62  bool isBorder = false;
63  while (i < len)
64  {
65    int ch = value[i];
66    if (ch == '|')
67    {
68      i ++;
69      isBorder = true;
70    }
71    else if (ch == 'l')
72    {
73      TableData[noColumns].leftBorder = isBorder;
74      TableData[noColumns].rightBorder = false;
75      TableData[noColumns].justification = 'l';
76      TableData[noColumns].width = 2000; // Estimate
77      TableData[noColumns].absWidth = false;
78//      TableData[noColumns].spacing = ??
79      noColumns ++;
80      i ++;
81      isBorder = false;
82    }
83    else if (ch == 'c')
84    {
85      TableData[noColumns].leftBorder = isBorder;
86      TableData[noColumns].rightBorder = false;
87      TableData[noColumns].justification = 'c';
88      TableData[noColumns].width = defaultTableColumnWidth; // Estimate
89      TableData[noColumns].absWidth = false;
90//      TableData[noColumns].spacing = ??
91      noColumns ++;
92      i ++;
93      isBorder = false;
94    }
95    else if (ch == 'r')
96    {
97      TableData[noColumns].leftBorder = isBorder;
98      TableData[noColumns].rightBorder = false;
99      TableData[noColumns].justification = 'r';
100      TableData[noColumns].width = 2000; // Estimate
101      TableData[noColumns].absWidth = false;
102//      TableData[noColumns].spacing = ??
103      noColumns ++;
104      i ++;
105      isBorder = false;
106    }
107    else if (ch == 'p')
108    {
109      i ++;
110      int j = 0;
111      wxChar numberBuf[50];
112      ch = value[i];
113      if (ch == '{')
114      {
115        i++;
116        ch = value[i];
117      }
118
119      while ((i < len) && (isdigit(ch) || ch == '.'))
120      {
121        numberBuf[j] = (wxChar)ch;
122        j ++;
123        i ++;
124        ch = value[i];
125      }
126      // Assume we have 2 characters for units
127      numberBuf[j] = value[i];
128      j ++; i++;
129      numberBuf[j] = value[i];
130      j ++; i++;
131      numberBuf[j] = 0;
132      if (value[i] == '}') i++;
133
134      TableData[noColumns].leftBorder = isBorder;
135      TableData[noColumns].rightBorder = false;
136      TableData[noColumns].justification = 'l';
137      TableData[noColumns].width = 20*ParseUnitArgument(numberBuf);
138      TableData[noColumns].absWidth = true;
139//      TableData[noColumns].spacing = ??
140      noColumns ++;
141      isBorder = false;
142    }
143    else
144    {
145      wxChar *buf = new wxChar[wxStrlen(value) + 80];
146      wxSnprintf(buf, wxStrlen(value) + 80, _T("Tabular first argument \"%s\" too complex!"), value);
147      OnError(buf);
148      delete[] buf;
149      return false;
150    }
151  }
152  if (isBorder)
153    TableData[noColumns-1].rightBorder = true;
154  return true;
155}
156