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 
41 ColumnData TableData[40];
42 bool inTabular = false;
43 
44 bool startRows = false;
45 bool tableVerticalLineLeft = false;
46 bool tableVerticalLineRight = false;
47 int noColumns = 0;   // Current number of columns in table
48 int ruleTop = 0;
49 int ruleBottom = 0;
50 int currentRowNumber = 0;
51 
52 /*
53  * Parse table argument
54  *
55  */
56 
ParseTableArgument(wxChar * value)57 bool 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