#include "FileZilla.h"
#include "Options.h"
#include "settingsdialog.h"
#include "optionspage.h"
#include "optionspage_themes.h"
#include "themeprovider.h"

BEGIN_EVENT_TABLE(COptionsPageThemes, COptionsPage)
EVT_CHOICE(XRCID("ID_THEME"), COptionsPageThemes::OnThemeChange)
END_EVENT_TABLE();

COptionsPageThemes::~COptionsPageThemes()
{
	for (int i = 0; i < 3; i++)
	{
		for (std::list<wxBitmap*>::iterator iter = m_preview[i].begin(); iter != m_preview[i].end(); iter++)
			delete *iter;
	}
}
bool COptionsPageThemes::LoadPage()
{
	m_previewInitialized = false;

	bool failure = false;

	wxChoice* pTheme = XRCCTRL(*this, "ID_THEME", wxChoice);
	wxScrolledWindow* pPanelSmall = XRCCTRL(*this, "ID_SMALL", wxScrolledWindow);
	wxScrolledWindow* pPanelMedium = XRCCTRL(*this, "ID_MEDIUM", wxScrolledWindow);
	wxScrolledWindow* pPanelLarge = XRCCTRL(*this, "ID_LARGE", wxScrolledWindow);

	if (!pTheme || !XRCCTRL(*this, "ID_PREVIEW", wxNotebook) ||
		!pPanelSmall || !pPanelMedium ||
		!pPanelLarge || !XRCCTRL(*this, "ID_AUTHOR", wxStaticText) ||
		!XRCCTRL(*this, "ID_EMAIL", wxStaticText))
		return false;

	std::list<wxString> themes = CThemeProvider::GetThemes();
	if (themes.empty())
		return false;

	wxString theme = m_pOptions->GetOption(OPTION_THEME);
	for (std::list<wxString>::const_iterator iter = themes.begin(); iter != themes.end(); iter++)
	{
		int n = pTheme->Append(*iter);
		if (*iter == theme)
			pTheme->SetSelection(n);
	}
	if (pTheme->GetSelection() == wxNOT_FOUND)
		pTheme->SetSelection(pTheme->FindString(themes.front()));

	pPanelSmall->Connect(wxID_ANY, wxEVT_PAINT, wxPaintEventHandler(COptionsPageThemes::OnPanelPaint), 0, this);
	pPanelMedium->Connect(wxID_ANY, wxEVT_PAINT, wxPaintEventHandler(COptionsPageThemes::OnPanelPaint), 0, this);
	pPanelLarge->Connect(wxID_ANY, wxEVT_PAINT, wxPaintEventHandler(COptionsPageThemes::OnPanelPaint), 0, this);

	wxString author, mail;
	CThemeProvider::GetThemeData(pTheme->GetString(pTheme->GetSelection()), author, mail);
	if (author == _T(""))
		author = _("N/a");
	if (mail == _T(""))
		mail = _("N/a");

	SetStaticText(XRCID("ID_AUTHOR"), author, failure);
	SetStaticText(XRCID("ID_EMAIL"), mail, failure);

	return !failure;
}

bool COptionsPageThemes::SavePage()
{
	wxChoice* pTheme = XRCCTRL(*this, "ID_THEME", wxChoice);
	
	m_pOptions->SetOption(OPTION_THEME, pTheme->GetString(pTheme->GetSelection()));
	return true;
}

bool COptionsPageThemes::Validate()
{
	return true;
}

void COptionsPageThemes::GetPreview()
{
	if (m_previewInitialized)
		return;

	m_previewInitialized = true;

	wxChoice* pTheme = XRCCTRL(*this, "ID_THEME", wxChoice);

	wxString theme = pTheme->GetString(pTheme->GetSelection());
	wxScrolledWindow* pPanels[3];
	pPanels[0] = XRCCTRL(*this, "ID_SMALL", wxScrolledWindow);
	pPanels[1] = XRCCTRL(*this, "ID_MEDIUM", wxScrolledWindow);
	pPanels[2] = XRCCTRL(*this, "ID_LARGE", wxScrolledWindow);

	int step[3] = {16,32,48};

	for (int i = 0; i < 3; i++)
	{
		for (std::list<wxBitmap*>::iterator iter = m_preview[i].begin(); iter != m_preview[i].end(); iter++)
			delete *iter;

		wxSize size = pPanels[i]->GetClientSize();
		
		wxSize imageSize(step[i], step[i]);
		m_preview[i] = CThemeProvider::GetAllImages(theme, imageSize);
		if (!m_preview[i].empty())
		{
			int lines = (m_preview[i].size() - 1) / ((size.GetWidth() - 5) / (step[i] + 5)) + 1;
			int vheight = lines * (step[i] + 5) + 5;
			if (vheight > size.GetHeight())
			{
				size.SetHeight(vheight);
				pPanels[i]->SetVirtualSize(size);
				pPanels[i]->SetVirtualSizeHints(size, size);
				pPanels[i]->SetScrollRate(0, step[i] + 5);

				wxSize size2 = pPanels[i]->GetClientSize();
				size.SetWidth(size2.GetWidth());
			
				lines = (m_preview[i].size() - 1) / ((size.GetWidth() - 5) / (step[i] + 5)) + 1;
				vheight = lines * (step[i] + 5) + 5;
				if (vheight > size.GetHeight())
					size.SetHeight(vheight);
			}
		}
		pPanels[i]->SetVirtualSize(size);
		pPanels[i]->SetVirtualSizeHints(size, size);
		pPanels[i]->SetScrollRate(0, step[i] + 5);
	}
}

void COptionsPageThemes::OnPanelPaint(wxPaintEvent& event)
{
	GetPreview();

	wxScrolledWindow* pPanels[3];
	pPanels[0] = XRCCTRL(*this, "ID_SMALL", wxScrolledWindow);
	pPanels[1] = XRCCTRL(*this, "ID_MEDIUM", wxScrolledWindow);
	pPanels[2] = XRCCTRL(*this, "ID_LARGE", wxScrolledWindow);

	int step[3] = {16,32,48};

	wxObject* object = event.GetEventObject();
	int page;
	if (object == pPanels[0])
		page = 0;
	else if (object == pPanels[1])
		page = 1;
	else if (object == pPanels[2])
		page = 2;
	else
	{
		event.Skip();
		return;
	}

	wxPaintDC dc(pPanels[page]);
	pPanels[page]->DoPrepareDC(dc);

	wxSize size = pPanels[page]->GetClientSize();

	if (m_preview[page].empty())
	{
		dc.SetFont(pPanels[page]->GetFont());
		wxString text = _("No images available");
		wxCoord w, h;
		dc.GetTextExtent(text, &w, &h);
		dc.DrawText(text, (size.GetWidth() - w) / 2, (size.GetHeight() - h) / 2);
		return;
	}

	int x = 5;
	int y = 5;

	for (std::list<wxBitmap*>::iterator iter = m_preview[page].begin(); iter != m_preview[page].end(); iter++)
	{
		wxBitmap* bitmap = *iter;
		dc.DrawBitmap(*bitmap, x, y, true);
		x += step[page] + 5;
		if ((x + step[page] + 5 + 5) >= size.GetWidth())
		{
			x = 5;
			y += step[page] + 5;
		}
	}
}

void COptionsPageThemes::OnThemeChange(wxCommandEvent& event)
{
	m_previewInitialized = false;
	XRCCTRL(*this, "ID_SMALL", wxScrolledWindow)->Refresh();
	XRCCTRL(*this, "ID_MEDIUM", wxScrolledWindow)->Refresh();
	XRCCTRL(*this, "ID_LARGE", wxScrolledWindow)->Refresh();
	
	wxChoice* pTheme = XRCCTRL(*this, "ID_THEME", wxChoice);

	wxString author, mail;
	CThemeProvider::GetThemeData(pTheme->GetString(pTheme->GetSelection()), author, mail);
	if (author == _T(""))
		author = _("N/a");
	if (mail == _T(""))
		mail = _("N/a");

	bool failure = false;
	SetStaticText(XRCID("ID_AUTHOR"), author, failure);
	SetStaticText(XRCID("ID_EMAIL"), mail, failure);
}


syntax highlighted by Code2HTML, v. 0.9.1