/************************************************************************/
/* Created by MARIUS BANCILA
/*            www.mariusbancila.ro
/* Copyright (C) 2008 MARIUS BANCILA. All rights reserved.
/*
/* Permission is given by the author to freely redistribute and
/* include this code in any program as long as this credit is
/* given where due.
/*
/* CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
/* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
/* INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE CODE
/* IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
/* OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND
/* PERFORMANCE OF THE CODE IS WITH YOU. SHOULD ANY
/* CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL
/* DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY
/* NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF
/* WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE
/* OF ANY CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
/* THIS DISCLAIMER.
/*
/************************************************************************/



#pragma once

#include "GdiImageDrawer.h"
#include "Accels.h"
#include "DPI.h"

// CSymbolEdit

class CSymbolEdit : public CEdit
{
	DECLARE_DYNAMIC(CSymbolEdit)

	CFont m_fontPrompt;
	HICON m_hSymbolIcon;
	bool m_bInternalIcon;
	CString m_strPromptText;
	COLORREF m_colorPromptText;

	CBrush m_brush;
	COLORREF m_lastBrushColor;

	void DestroyIcon();

public:
	CSymbolEdit();
	virtual ~CSymbolEdit();

	virtual BOOL PreTranslateMessage(MSG* pMsg);

	void AddToSearchHistory();

	bool ShowSearchHistoryMenu();

	void SetSymbolIcon(HICON hIcon, BOOL redraw = TRUE);
	void SetSymbolIcon(UINT id, BOOL redraw = TRUE);

	void SetPromptText(CString text, BOOL redraw = TRUE);
	void SetPromptText(LPCTSTR szText, BOOL redraw = TRUE);

	void SetPromptTextColor(COLORREF color, BOOL redraw = TRUE);

	void SetPromptFont(CFont& font, BOOL redraw = TRUE);
	void SetPromptFont(const LOGFONT* lpLogFont, BOOL redraw = TRUE);

	bool ApplyLastSearch();

	void SetLastSearchAccel(CAccel a) { m_lastSearchShortCut = a; }

	CString SavePastSearches();
	void LoadPastSearches(CString values);

	void SetDpiInfo(CDPI *dpi);

	void OnDpiChanged();

	//void SetWindowTextEx(LPCSTR)

protected:
	
	//CGdiImageDrawer m_searchButton;
	CGdiImageDrawer m_closeButton;
	CRect m_closeButtonRect;
	bool m_mouseDownOnClose;
	bool m_mouseHoveringOverClose;

	CGdiImageDrawer m_searchesButton;
	CRect m_searchesButtonRect;
	bool m_mouseDownOnSearches;
	bool m_mouseHoveringOverSearches;

	CAccel m_lastSearchShortCut;

	CStringArray m_searches;

	void RecalcLayout();
	virtual void PreSubclassWindow();

	CDPI *m_windowDpi;

	int m_centerTextDiff;
	CString m_lastTextOnPaint;

	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg LRESULT OnSetFont(WPARAM wParam, LPARAM lParam);
	//afx_msg LRESULT OnMenuExit(WPARAM wParam, LPARAM lParam);
	afx_msg HBRUSH CtlColor(CDC* pDC, UINT n);
	afx_msg void OnSetFocus(CWnd* pOldWnd);
	afx_msg void OnKillFocus(CWnd* pNewWnd);
	afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg void OnSelectSearchString(UINT idIn);

	DECLARE_MESSAGE_MAP()

public:
	afx_msg void OnPaint();
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp);
	afx_msg void OnNcPaint();
	afx_msg void OnTimer(UINT_PTR nIDEvent);
};


