package com.dasatti.uhtml;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import javax.swing.border.*;
import javax.swing.text.html.*;
public class TableDlg extends JDialog
{
protected boolean m_succeeded = false;
protected HTMLDocument m_doc;
protected JSpinner m_rowsSpn;
protected JSpinner m_colsSpn;
protected JSpinner m_spacingSpn;
protected JSpinner m_paddingSpn;
protected JSpinner m_borderWidthSpn;
protected JSpinner m_tableWidthSpn;
protected JSpinner m_tableHeightSpn;
protected JComboBox m_tableUnitsCb;
protected JTextPane m_previewPane;
protected Color m_borderColor;
protected Color m_backgroundColor;
protected HTMLEditorKit m_kit = new HTMLEditorKit();
public TableDlg(JFrame parent, HTMLDocument doc)
{
super(parent, "Insert Table", true);
m_doc = doc;
ActionListener lst;
JButton bt;
//JPanel pp = new JPanel(new DialogLayout2());
JPanel pp = new JPanel();
pp.setBorder(new EmptyBorder(10, 10, 5, 10));
//JPanel p1 = new JPanel(new DialogLayout2());
JPanel p1 = new JPanel();
p1.setBorder(new EmptyBorder(10, 10, 5, 10));
p1.add(new JLabel("Rows:"));
m_rowsSpn = new JSpinner(new SpinnerNumberModel(new Integer(2), new Integer(0), null, new Integer(1)));
p1.add(m_rowsSpn);
p1.add(new JLabel("Columns:"));
m_colsSpn = new JSpinner(new SpinnerNumberModel(new Integer(2), new Integer(0), null, new Integer(1)));
p1.add(m_colsSpn);
p1.add(new JLabel("Cell spacing:"));
m_spacingSpn = new JSpinner(new SpinnerNumberModel(new Integer(2), new Integer(0), null, new Integer(1)));
p1.add(m_spacingSpn);
p1.add(new JLabel("Cell padding:"));
m_paddingSpn = new JSpinner(new SpinnerNumberModel(new Integer(2), new Integer(0), null, new Integer(1)));
p1.add(m_paddingSpn);
//JPanel p2 = new JPanel(new DialogLayout2());
JPanel p2 = new JPanel();
p2.setBorder(new EmptyBorder(10, 10, 5, 10));
p2.add(new JLabel("Border width:"));
m_borderWidthSpn = new JSpinner(new SpinnerNumberModel(new Integer(2), new Integer(0), null, new Integer(1)));
p2.add(m_borderWidthSpn);
p2.add(new JLabel("Table width:"));
m_tableWidthSpn = new JSpinner(new SpinnerNumberModel(new Integer(100), new Integer(0), null, new Integer(1)));
p2.add(m_tableWidthSpn);
p2.add(new JLabel("Table height:"));
m_tableHeightSpn = new JSpinner(new SpinnerNumberModel(new Integer(0), new Integer(0), null, new Integer(1)));
p2.add(m_tableHeightSpn);
p2.add(new JLabel("Units:"));
m_tableUnitsCb = new JComboBox(new String[]{"Percent", "Pixels" });
p2.add(m_tableUnitsCb);
JPanel p3 = new JPanel(new FlowLayout());
p3.setBorder(new EmptyBorder(10, 10, 5, 10));
JPanel pb = new JPanel(new GridLayout(2, 1, 5, 5));
p3.add(pb);
bt = new JButton("Border");
bt.setMnemonic('b');
lst = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
m_borderColor = JColorChooser.showDialog(TableDlg.this, "Border Color", m_borderColor);
}
};
bt.addActionListener(lst);
pb.add(bt);
bt = new JButton("Background");
bt.setMnemonic('c');
lst = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
m_backgroundColor = JColorChooser.showDialog(TableDlg.this, "Background Color", m_backgroundColor);
}
};
bt.addActionListener(lst);
pb.add(bt);
JPanel p4 = new JPanel(new BorderLayout());
p4.setBorder(new EmptyBorder(10, 10, 5, 10));
m_previewPane = new JTextPane();
m_previewPane.setEditorKit(m_kit);
m_previewPane.setBackground(Color.white);
m_previewPane.setEditable(false);
JScrollPane sp = new JScrollPane(m_previewPane);
sp.setPreferredSize(new Dimension(200, 100));
p4.add(sp, BorderLayout.CENTER);
final JTabbedPane tb = new JTabbedPane();
tb.addTab("Table", p1);
tb.addTab("Size", p2);
tb.addTab("Color", p3);
tb.addTab("Preview", p4);
pp.add(tb);
ChangeListener chl = new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
if (tb.getSelectedIndex() != 3)
return;
setCursor(Cursor.getPredefinedCursor(
Cursor.WAIT_CURSOR));
try
{
HTMLDocument doc =
(HTMLDocument)m_kit.createDefaultDocument();
doc.setAsynchronousLoadPriority(0);
StringReader sr = new StringReader(generateHTML());
m_kit.read(sr, doc, 0);
sr.close();
m_previewPane.setDocument(doc);
validate();
repaint();
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
};
tb.addChangeListener(chl);
bt = new JButton("Insert");
lst = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
m_succeeded = true;
dispose();
}
};
bt.addActionListener(lst);
pp.add(bt);
bt = new JButton("Cancel");
lst = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
dispose();
}
};
bt.addActionListener(lst);
pp.add(bt);
getContentPane().add(pp, BorderLayout.CENTER);
pack();
setResizable(true);
setLocationRelativeTo(parent);
}
public boolean succeeded()
{
return m_succeeded;
}
public String generateHTML()
{
StringBuffer buff = new StringBuffer();
buff.append("<table");
int tableWidth =((Integer) m_tableWidthSpn.getValue()).intValue();
int tableHeight =((Integer)m_tableHeightSpn.getValue()).intValue();
String unit = "";
if (m_tableUnitsCb.getSelectedIndex()==0)
unit = "%";
if (tableWidth > 0)
buff.append(" width=\"").append(tableWidth).append(unit).append("\"");
if (tableHeight > 0)
buff.append(" height=\"").append(tableHeight).append(unit).append("\"");
buff.append(" cellspacing=\"").append(m_spacingSpn.getValue()).append("\"");
buff.append(" cellpadding=\"").append(m_paddingSpn.getValue()).append("\"");
buff.append(" border=\"").append(m_borderWidthSpn.getValue()).append("\"");
if (m_borderColor != null)
buff.append(" bordercolor=\"").append(colorToHex(m_borderColor)).append("\"");
if (m_backgroundColor != null)
buff.append(" bgcolor=\"").append(colorToHex(m_backgroundColor)).append("\"");
buff.append(">\n");
int nRows = ((Integer)m_rowsSpn.getValue()).intValue();
int nCols = ((Integer)m_colsSpn.getValue()).intValue();
for (int k=0; k<nRows; k++)
{
buff.append("<tr>\n");
for (int s=0; s<nCols; s++)
buff.append("<td> </td>\n");
buff.append("</tr>\n");
}
buff.append("</table>\n");
return buff.toString();
}
public static String colorToHex(Color color)
{
String colorstr = new String("#");
// Red
String str = Integer.toHexString(color.getRed());
if (str.length() > 2)
str = str.substring(0, 2);
else if (str.length() < 2)
colorstr += "0" + str;
else
colorstr += str;
// Green
str = Integer.toHexString(color.getGreen());
if (str.length() > 2)
str = str.substring(0, 2);
else if (str.length() < 2)
colorstr += "0" + str;
else
colorstr += str;
// Blue
str = Integer.toHexString(color.getBlue());
if (str.length() > 2)
str = str.substring(0, 2);
else if (str.length() < 2)
colorstr += "0" + str;
else
colorstr += str;
return colorstr;
}
}