package commons.ui.views.script;
import java.awt.Color;
import java.util.StringTokenizer;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import basics.utl.FormatterUtl;
import basics.utl.SysUtl;
import basics.utl.SUtl;
import commons.ui.toolbox.GU;
public class ScriptDocument extends DefaultStyledDocument
{

private static final long serialVersionUID = 1L;
SimpleAttributeSet        defaultStyle     = new SimpleAttributeSet();
SimpleAttributeSet        blackStyle       = new SimpleAttributeSet();
SimpleAttributeSet        redStyle         = new SimpleAttributeSet();
SimpleAttributeSet        greenStyle       = new SimpleAttributeSet();
SimpleAttributeSet        grayStyle        = new SimpleAttributeSet();
ScriptController          controller       = null;
boolean                   dirty            = false;

public ScriptDocument(ScriptController controller)
{
   super();
   StyleConstants.setFontSize(defaultStyle, GU.defaultFontSize);
   StyleConstants.setFontFamily(defaultStyle, GU.defaultFontFamily);
   StyleConstants.setForeground(defaultStyle, Color.blue);
   StyleConstants.setFontSize(greenStyle, GU.defaultFontSize);
   StyleConstants.setFontFamily(greenStyle, GU.defaultFontFamily);
   StyleConstants.setForeground(greenStyle, Color.decode("0x00661A"));
   StyleConstants.setFontSize(redStyle, GU.defaultFontSize);
   StyleConstants.setFontFamily(redStyle, GU.defaultFontFamily);
   StyleConstants.setForeground(redStyle, Color.red);
   StyleConstants.setFontSize(blackStyle, GU.defaultFontSize);
   StyleConstants.setFontFamily(blackStyle, GU.defaultFontFamily);
   StyleConstants.setForeground(blackStyle, Color.black);
   StyleConstants.setFontSize(grayStyle, GU.defaultFontSize);
   StyleConstants.setFontFamily(grayStyle, GU.defaultFontFamily);
   StyleConstants.setForeground(grayStyle, Color.gray);
   this.controller = controller;
}

public ScriptController getController ()
{
   return controller;
}

public void setDirty (boolean d)
{
   dirty = d;
}

public void insertLine (int pos, String text)
{
   try
   {
      insertString(pos, text, null);
   }
   catch (Exception e)
   {
      SysUtl.trace(e.getMessage());
      e.printStackTrace();
   }
}

public void insertString (int pos, String line, AttributeSet a) throws BadLocationException
{
   if (line.startsWith("#"))
   {
      super.insertString(pos, line, grayStyle);
   }
   else
   {
      String text = "";
      String comment = "";
      final String separator = "//";
      int separatorPos = line.indexOf(separator);
      if (separatorPos == -1)
         text = line;
      else
      {
         comment = line.substring(separatorPos);
         text = line.substring(0, separatorPos);
      }
      formatText(pos, text);
      super.insertString(pos + text.length(), comment, grayStyle);
   }
   dirty = true;
}

private void formatText (int pos, String text) throws BadLocationException
{
   String black[] = new String[] { "timer ", "$", "echo " };
   String red[] = new String[] { "stop", "resume", "skip", "if " };
   String green[] = new String[] { "set ", "unset ", "bind", "unbind" };
   for (String b : black)
   {
      if (text.startsWith(b))
      {
         super.insertString(pos, text, blackStyle);
         return;
      }
   }
   for (String r : red)
   {
      if (text.startsWith(r))
      {
         // hack
         if (!r.equals("stop") || ((text.trim().equals("stop") || text.startsWith("stop "))))
         {
            super.insertString(pos, text, redStyle);
            return;
         }
      }
   }
   for (String r : green)
   {
      if (text.startsWith(r))
      {
         super.insertString(pos, text, greenStyle);
         return;
      }
   }
   super.insertString(pos, text, defaultStyle);
}

public boolean isDirty ()
{
   return dirty;
}

public synchronized void remove (int offset, int length) throws BadLocationException
{
   int signs = getLength();
   String text = getText(0, signs);
   super.remove(0, signs);
   text = SUtl.extinct(text, offset, length);
   text = FormatterUtl.removeWhitespaceTail(text);
   formatLines(text, offset);
   dirty = true;
}

void formatLines (String text, int caretPosition)
{
   StringTokenizer st = new StringTokenizer(text, "\n");
   int x = 0;
   while (st.hasMoreTokens())
   {
      String t = st.nextToken() + "\n";
      insertLine(x, t);
      x += t.length();
   }
   controller.setCaretPosition(caretPosition);
}

public String toString ()
{
   return this.toString();
}
}
