// Copyright (c) 2005, Rodrigo Braz Monteiro
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
//   * Redistributions of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//   * Redistributions in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//   * Neither the name of the Aegisub Group nor the names of its contributors
//     may be used to endorse or promote products derived from this software
//     without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// Aegisub Project http://www.aegisub.org/
//
// $Id$

/// @file subs_edit_box.h
/// @see subs_edit_box.cpp
/// @ingroup main_ui
///


#pragma once


////////////
// Includes
#include <wx/wxprec.h>
#include <wx/spinctrl.h>
#include "subs_edit_ctrl.h"


//////////////
// Prototypes
class SubtitlesGrid;
class TimeEdit;
class SubsEditBox;
class AudioDisplay;
class HiliModTextCtrl;
class wxStyledTextCtrl;



/// DOCME
/// @class SubsEditBox
/// @brief DOCME
///
/// DOCME
class SubsEditBox : public wxPanel {
	friend class SubsTextEditHandler;
	friend class SubsTextEditCtrl;
	friend class AudioDisplay;

private:

	/// DOCME
	bool splitLineMode;

	/// DOCME
	bool setupDone;

	/// DOCME
	bool enabled;

	/// DOCME
	bool textEditReady;

	/// DOCME
	bool controlState;

	/// DOCME
	wxColour origBgColour;

	/// DOCME
	wxColour disabledBgColour;


	/// DOCME
	SubtitlesGrid *grid;

	/// DOCME
	wxCheckBox *CommentBox;

	/// DOCME
	wxComboBox *StyleBox;

	/// DOCME
	wxComboBox *ActorBox;

	/// DOCME
	TimeEdit *StartTime;

	/// DOCME
	TimeEdit *EndTime;

	/// DOCME
	TimeEdit *Duration;

	/// DOCME
	wxSpinCtrl *Layer;

	/// DOCME
	HiliModTextCtrl *MarginL;

	/// DOCME
	HiliModTextCtrl *MarginR;

	/// DOCME
	HiliModTextCtrl *MarginV;

	/// DOCME
	HiliModTextCtrl *Effect;

	/// DOCME
	wxRadioButton *ByTime;

	/// DOCME
	wxRadioButton *ByFrame;

	/// DOCME
	wxCheckBox *SyntaxHighlight;


	/// DOCME
	wxButton *Bold;

	/// DOCME
	wxButton *Italics;

	/// DOCME
	wxButton *Underline;

	/// DOCME
	wxButton *Strikeout;

	/// DOCME
	wxButton *FontName;

	/// DOCME
	wxButton *Color1;

	/// DOCME
	wxButton *Color2;

	/// DOCME
	wxButton *Color3;

	/// DOCME
	wxButton *Color4;

	/// DOCME
	wxButton *CommitButton;


	/// DOCME
	wxSizer *TopSizer;

	/// DOCME
	wxSizer *MiddleBotSizer;

	/// DOCME
	wxSizer *MiddleSizer;

	/// DOCME
	wxSizer *MainSizer;

	/// DOCME
	wxSizer *DummySizer;

	/// DOCME
	wxSizer *BottomSizer;

	void SetControlsState(bool state);
	void CommitTimes(bool start,bool end,bool fromStart,bool commit=true);

	int BlockAtPos(int pos);

	void OnEditText(wxStyledTextEvent &event);
	void OnNeedStyle(wxStyledTextEvent &event);
	void OnCharAdded(wxStyledTextEvent &event);
	void OnUpdateUI(wxStyledTextEvent &event);

	void OnButtonColor1(wxCommandEvent &event);
	void OnButtonColor2(wxCommandEvent &event);
	void OnButtonColor3(wxCommandEvent &event);
	void OnButtonColor4(wxCommandEvent &event);
	void OnButtonFontFace(wxCommandEvent &event);
	void OnButtonBold(wxCommandEvent &event);
	void OnButtonItalics(wxCommandEvent &event);
	void OnButtonUnderline(wxCommandEvent &event);
	void OnButtonStrikeout(wxCommandEvent &event);
	void OnButtonCommit(wxCommandEvent &event);

	void OnSyntaxBox(wxCommandEvent &event);
	void OnFrameRadio(wxCommandEvent &event);
	void OnTimeRadio(wxCommandEvent &event);
	void OnKeyDown(wxStyledTextEvent &event);
	void OnStyleChange(wxCommandEvent &event);
	void OnActorChange(wxCommandEvent &event);
	void OnLayerEnter(wxCommandEvent &event);
	void OnLayerChange(wxSpinEvent &event);
	void OnStartTimeChange(wxCommandEvent &event);
	void OnEndTimeChange(wxCommandEvent &event);
	void OnDurationChange(wxCommandEvent &event);
	void OnMarginLChange(wxCommandEvent &event);
	void OnMarginRChange(wxCommandEvent &event);
	void OnMarginVChange(wxCommandEvent &event);
	void OnCommentChange(wxCommandEvent &event);
	void OnEffectChange(wxCommandEvent &event);
	void OnSize(wxSizeEvent &event);

public:

	/// DOCME
	int linen;

	/// DOCME
	AudioDisplay *audio;

	/// DOCME
	SubsTextEditCtrl *TextEdit;

	SubsEditBox(wxWindow *parent,SubtitlesGrid *gridp);
	~SubsEditBox();

	void SetOverride (wxString tag,wxString preValue=_T(""),int pos=-1,bool getFocus=true);
	void SetStyleFlag (wxString tag,wxString preValue=_T(""),int pos=-1);

	void SetSplitLineMode(wxSize size=wxSize(-1,-1));
	void CommitText(bool weak=false);
	void Update(bool timeOnly=false,bool weak=false);
	void UpdateGlobals();
	void SetToLine(int n,bool weak=false);
	void UpdateFrameTiming();
	void DoKeyPress(wxKeyEvent &event);
	void Commit(bool stay);

	DECLARE_EVENT_TABLE()
};



/// DOCME
/// @class SubsEditBoxEvent
/// @brief DOCME
///
/// DOCME
class SubsEditBoxEvent : public wxEvtHandler {
private:

	/// DOCME
	SubsEditBox *control;
	void OnKeyPress(wxKeyEvent &event);

public:
	SubsEditBoxEvent(SubsEditBox *control);
	DECLARE_EVENT_TABLE()
};


///////
// IDs
enum {

	/// DOCME
	EDIT_BOX = 1300,

	/// DOCME
	SYNTAX_BOX,

	/// DOCME
	RADIO_TIME_BY_FRAME,

	/// DOCME
	RADIO_TIME_BY_TIME,

	/// DOCME
	STYLE_COMBOBOX,

	/// DOCME
	ACTOR_COMBOBOX,

	/// DOCME
	LAYER_BOX,

	/// DOCME
	STARTTIME_BOX,

	/// DOCME
	ENDTIME_BOX,

	/// DOCME
	DURATION_BOX,

	/// DOCME
	MARGINL_BOX,

	/// DOCME
	MARGINR_BOX,

	/// DOCME
	MARGINV_BOX,

	/// DOCME
	EFFECT_BOX,

	/// DOCME
	COMMENT_CHECKBOX,


	/// DOCME
	BUTTON_BOLD,

	/// DOCME
	BUTTON_ITALICS,

	/// DOCME
	BUTTON_UNDERLINE,

	/// DOCME
	BUTTON_STRIKEOUT,

	/// DOCME
	BUTTON_FONT_NAME,

	/// DOCME
	BUTTON_COLOR1,

	/// DOCME
	BUTTON_COLOR2,

	/// DOCME
	BUTTON_COLOR3,

	/// DOCME
	BUTTON_COLOR4,

	/// DOCME
	BUTTON_COMMIT
};


