git-svn-id: svn://10.65.10.50/branches/R_10_00@22947 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			408 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			408 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "wxinc.h"
 | 
						|
#include "gtArt.h"
 | 
						|
 | 
						|
#include <wx/filename.h>
 | 
						|
#include <wx/rawbmp.h> 
 | 
						|
 | 
						|
extern wxColor wxAuiStepColour(const wxColor& c, int ialpha);
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// HSLColor
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
inline wxColourBase::ChannelType Y601(wxColourBase::ChannelType r, 
 | 
						|
                                      wxColourBase::ChannelType g, 
 | 
						|
                                      wxColourBase::ChannelType b)
 | 
						|
{ return 0.299*r + 0.587*g + 0.114*b; }
 | 
						|
 | 
						|
 | 
						|
inline wxColourBase::ChannelType Luma(const wxColour& col)
 | 
						|
{ return Y601(col.Red(), col.Green(), col.Blue()); }
 | 
						|
 | 
						|
static wxColourBase::ChannelType ModulatedChannel(wxColourBase::ChannelType c, int val)
 | 
						|
{
 | 
						|
  int k = c;
 | 
						|
  if (val > 0)
 | 
						|
    k = (c * (100-val) + 255 * val) / 100;
 | 
						|
  else
 | 
						|
    k = c * (100+val) / 100;
 | 
						|
 | 
						|
  if (k < 0) k = 0; else
 | 
						|
  if (k > 255) k = 255;
 | 
						|
  return k;
 | 
						|
}
 | 
						|
 | 
						|
// val: -100 = wxBLACK; 0 = Same color; +100 = wxWHITE
 | 
						|
wxColour ModulatedColor(const wxColour& col, int val) 
 | 
						|
{
 | 
						|
  // return col.ChangeLightness(100 + val);
 | 
						|
  wxColourBase::ChannelType r = ModulatedChannel(col.Red(),   val); 
 | 
						|
  wxColourBase::ChannelType g = ModulatedChannel(col.Green(), val); 
 | 
						|
  wxColourBase::ChannelType b = ModulatedChannel(col.Blue(),  val); 
 | 
						|
  return wxColour(r, g, b);
 | 
						|
}
 | 
						|
 | 
						|
inline wxColour GrayedColor(const wxColour& col) 
 | 
						|
{
 | 
						|
  const wxColourBase::ChannelType y1 = Luma(col);
 | 
						|
  return wxColour(y1,y1,y1);
 | 
						|
}
 | 
						|
 | 
						|
wxColour gtContrastingColor(const wxColour& col) 
 | 
						|
{
 | 
						|
  const wxColourBase::ChannelType y1 = Luma(col);
 | 
						|
  return y1 > 128 ? *wxBLACK : *wxWHITE;
 | 
						|
}
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// gtToolBarArt
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
void gtToolBarArt::DrawBackground(wxDC& dc, wxWindow* window, int orientation, const wxRect &rect)
 | 
						|
{
 | 
						|
  if (!gtAuiManager::DrawBackground(dc, window, orientation, rect))
 | 
						|
    wxAuiDefaultDockArt::DrawBackground(dc, window, orientation, rect);
 | 
						|
}
 | 
						|
 | 
						|
void gtToolBarArt::DrawSash(wxDC& dc, wxWindow *window, int orientation, const wxRect& rect)
 | 
						|
{ DrawBackground(dc, window, orientation, rect); }
 | 
						|
 | 
						|
gtToolBarArt::gtToolBarArt()
 | 
						|
{
 | 
						|
  wxColour base, light, dark, text;
 | 
						|
  if (gtAuiManager::BaseColours(base, light, dark, text))
 | 
						|
  {
 | 
						|
    SetColour(wxAUI_DOCKART_BACKGROUND_COLOUR, base);
 | 
						|
    SetColour(wxAUI_DOCKART_SASH_COLOUR, base);
 | 
						|
 | 
						|
    SetColour(wxAUI_DOCKART_ACTIVE_CAPTION_COLOUR, base);
 | 
						|
    SetColour(wxAUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR, light);
 | 
						|
    SetColour(wxAUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR, text);
 | 
						|
 | 
						|
    SetColour(wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR, dark);
 | 
						|
    SetColour(wxAUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR, base);
 | 
						|
 | 
						|
    const wxColourBase::ChannelType g = Luma(dark) > 128 ? 64 : 192;
 | 
						|
    SetColour(wxAUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR,  wxColour(g,g,g));
 | 
						|
 | 
						|
    SetColour(wxAUI_DOCKART_BORDER_COLOUR, dark);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// gtTabArt
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
wxAuiTabArt* gtTabArt::Clone()
 | 
						|
{
 | 
						|
  gtTabArt* ta = new gtTabArt;
 | 
						|
  return ta;
 | 
						|
}
 | 
						|
 | 
						|
gtTabArt::gtTabArt()
 | 
						|
{
 | 
						|
  wxColour base, light, dark, text;
 | 
						|
  if (gtAuiManager::BaseColours(base, light, dark, text))
 | 
						|
  {
 | 
						|
    m_border_pen = wxPen(ModulatedColor(base, 75));
 | 
						|
    m_base_colour = base;
 | 
						|
    m_base_colour_pen = wxPen(base);
 | 
						|
    m_base_colour_brush = wxBrush(base);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// gtAuiManager
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
bool gtAuiManager::BaseColours(wxColour& base, wxColour& light, wxColour& dark, wxColour& text)
 | 
						|
{
 | 
						|
  const wxSize sz(256,256);
 | 
						|
  wxBitmap bmp = wxArtProvider::GetBitmap(wxArtID(wxT("Skin")), wxART_OTHER, sz);
 | 
						|
  if (bmp.IsOk())
 | 
						|
  {
 | 
						|
    wxColourBase::ChannelType ldark = 255, llight = 0;
 | 
						|
    dark = *wxWHITE;
 | 
						|
    light = *wxBLACK;
 | 
						|
 | 
						|
    wxNativePixelData data(bmp);
 | 
						|
    const int dim = data.GetHeight();
 | 
						|
    wxNativePixelData::Iterator p(data);
 | 
						|
    double r = 0, g = 0, b = 0;
 | 
						|
    for (int i = 0; i < dim; i++)
 | 
						|
    {
 | 
						|
      p.MoveTo(data, i, i);
 | 
						|
      r += p.Red();
 | 
						|
      g += p.Green();
 | 
						|
      b += p.Blue();
 | 
						|
 | 
						|
      const wxColour col(p.Red(), p.Green(), p.Blue());
 | 
						|
      const wxColourBase::ChannelType lcol = Luma(col);
 | 
						|
      if (lcol < ldark)
 | 
						|
      {
 | 
						|
        dark = col;
 | 
						|
        ldark = lcol;
 | 
						|
      }
 | 
						|
      if (lcol > llight)
 | 
						|
      {
 | 
						|
        light = col;
 | 
						|
        llight = lcol;
 | 
						|
      }
 | 
						|
    }
 | 
						|
    r /= dim; g /= dim; b /= dim;
 | 
						|
 | 
						|
    base = wxColour(r, g, b);
 | 
						|
    const wxColourBase::ChannelType lbase = Luma(base);
 | 
						|
    if (lbase - ldark < 40)
 | 
						|
      dark = ModulatedColor(dark, -(40 - lbase + ldark));
 | 
						|
 | 
						|
    if (llight - lbase < 40)
 | 
						|
      light = ModulatedColor(light, +(40 - llight + lbase));
 | 
						|
 | 
						|
    text = gtContrastingColor(base);
 | 
						|
  }
 | 
						|
  return bmp.IsOk();
 | 
						|
}
 | 
						|
 | 
						|
bool gtAuiManager::DrawBackground(wxDC& dc, wxWindow* WXUNUSED(window), 
 | 
						|
                                  int WXUNUSED(orientation), const wxRect &rect)
 | 
						|
{
 | 
						|
  const wxBitmap bmp = wxArtProvider::GetBitmap(wxArtID(wxT("Skin")), wxART_OTHER, wxSize(256,256));
 | 
						|
  if (bmp.IsOk())
 | 
						|
  {
 | 
						|
    const wxSize szBm(bmp.GetWidth(), bmp.GetHeight());
 | 
						|
    for (wxCoord y = rect.y; y < rect.GetBottom(); y += szBm.y)
 | 
						|
    {
 | 
						|
      for (wxCoord x = rect.x; x < rect.GetRight(); x += szBm.x)
 | 
						|
        dc.DrawBitmap(bmp, x, y);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return bmp.IsOk();
 | 
						|
}
 | 
						|
  
 | 
						|
gtAuiManager::gtAuiManager()
 | 
						|
{
 | 
						|
  SetArtProvider(new gtToolBarArt);
 | 
						|
}
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// plnHolidayAutority
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
class gtHolidayAutority : public wxDateTimeWorkDays
 | 
						|
{
 | 
						|
protected:
 | 
						|
  virtual bool DoIsHoliday(const wxDateTime& dt) const;
 | 
						|
  virtual size_t DoGetHolidaysInRange(const wxDateTime& dtStart, const wxDateTime& dtEnd,
 | 
						|
                                      wxDateTimeArray& holidays) const;
 | 
						|
};
 | 
						|
 | 
						|
bool gtHolidayAutority::DoIsHoliday(const wxDateTime& dt) const
 | 
						|
{
 | 
						|
  const wxDateTime::Month m = dt.GetMonth();
 | 
						|
  const wxDateTime::wxDateTime_t d = dt.GetDay();
 | 
						|
  switch (m)
 | 
						|
  {
 | 
						|
  case wxDateTime::Jan:
 | 
						|
    if (d == 1 || d == 6)    // Capodanno ed Epifania
 | 
						|
      return true;
 | 
						|
    break;
 | 
						|
  case wxDateTime::Apr:
 | 
						|
    if (d == 25)             // 25 Aprile
 | 
						|
      return true;
 | 
						|
    break;
 | 
						|
  case wxDateTime::May:
 | 
						|
    if (d == 1)
 | 
						|
      return true;           // I Maggio
 | 
						|
    break;
 | 
						|
  case wxDateTime::Jun:
 | 
						|
    if (d == 2)              // Festa della Repubblica
 | 
						|
      return true;
 | 
						|
    break;
 | 
						|
  case wxDateTime::Aug:
 | 
						|
    if (d == 15)             // Ferragosto
 | 
						|
      return true;
 | 
						|
    break;
 | 
						|
  case wxDateTime::Nov:
 | 
						|
    if (d == 1)              // Ognissanti
 | 
						|
      return true;
 | 
						|
    break;
 | 
						|
  case wxDateTime::Dec:
 | 
						|
    if (d == 8 || d == 25 || d == 26) // Immacolata, Natale e Santo Stefano
 | 
						|
      return true;
 | 
						|
    break;
 | 
						|
  default: break;
 | 
						|
  }
 | 
						|
 | 
						|
  const wxDateTime::WeekDay wd = dt.GetWeekDay();
 | 
						|
  if (wd == wxDateTime::Sun || wd == wxDateTime::Sat)
 | 
						|
    return true;
 | 
						|
 | 
						|
  if (wd == wxDateTime::Mon && (m == wxDateTime::Mar || m == wxDateTime::Apr))
 | 
						|
  {
 | 
						|
    const int y = dt.GetYear();
 | 
						|
    const int correction = y < 2100 ? 0 : 1; // Semplificazione tabella dal 1600 al 2500
 | 
						|
    int d = (19 * (y%19) + 24) % 30;
 | 
						|
    d += 22 + ((2*(y%4) + 4*(y%7) + 6*d + 5 + correction) % 7);
 | 
						|
 | 
						|
    int m = 3;
 | 
						|
    if (d > 31)
 | 
						|
    {
 | 
						|
      d -= 31;
 | 
						|
      m++;
 | 
						|
    }
 | 
						|
    const wxDateTime easter(d, wxDateTime::Month(m-1), y);
 | 
						|
    if (easter == dt - wxDateSpan(0,0,0,1))
 | 
						|
      return true;
 | 
						|
  }
 | 
						|
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
size_t gtHolidayAutority::DoGetHolidaysInRange(const wxDateTime& dtStart, const wxDateTime& dtEnd,
 | 
						|
                                                wxDateTimeArray& holidays) const
 | 
						|
{
 | 
						|
  for (wxDateTime dt = dtStart; dt <= dtEnd; dt += wxDateSpan(0,0,0,1))
 | 
						|
  {
 | 
						|
    if (DoIsHoliday(dt))
 | 
						|
      holidays.Add(dt);
 | 
						|
  }
 | 
						|
  return holidays.GetCount();
 | 
						|
}
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// gtArtProvider
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
class gtArtProvider : public wxArtProvider
 | 
						|
{
 | 
						|
  wxString m_strSkin;
 | 
						|
 | 
						|
protected:
 | 
						|
  wxSize AdjustedSize(const wxArtClient& client, const wxSize& size) const;
 | 
						|
  virtual wxBitmap CreateBitmap(const wxArtID& id, const wxArtClient& client, const wxSize& size);
 | 
						|
 | 
						|
public:
 | 
						|
  gtArtProvider();
 | 
						|
};
 | 
						|
 | 
						|
wxSize gtArtProvider::AdjustedSize(const wxArtClient& client, const wxSize& size) const
 | 
						|
{
 | 
						|
  if (size != wxDefaultSize)
 | 
						|
    return size;
 | 
						|
 | 
						|
  if (client == wxART_MENU)
 | 
						|
    return wxSize(16,16);
 | 
						|
  if (client == wxART_TOOLBAR)
 | 
						|
    return wxSize(48,48);
 | 
						|
 | 
						|
  wxSize sz = wxArtProvider::GetSizeHint(client);
 | 
						|
  if (sz == wxDefaultSize)
 | 
						|
  {
 | 
						|
    if (client == wxART_OTHER)
 | 
						|
      sz = size;
 | 
						|
    else
 | 
						|
      sz.x = sz.y = 32;
 | 
						|
  }
 | 
						|
 | 
						|
  return sz;
 | 
						|
}
 | 
						|
 | 
						|
wxBitmap gtArtProvider::CreateBitmap(const wxArtID& id, const wxArtClient& client, const wxSize& size)
 | 
						|
{
 | 
						|
  const wxSize sz = AdjustedSize(client, size);
 | 
						|
  wxString strName = id;
 | 
						|
  long tool = 0;
 | 
						|
  bool bOverriding = false;
 | 
						|
  if (strName.StartsWith(wxT("wxART")))
 | 
						|
  {
 | 
						|
    if (id == wxART_FILE_OPEN)    tool = wxID_OPEN;   else
 | 
						|
    if (id == wxART_FILE_SAVE)    tool = wxID_SAVE;   else
 | 
						|
    if (id == wxART_FILE_SAVE_AS) tool = wxID_SAVEAS; else
 | 
						|
    if (id == wxART_NEW)          tool = wxID_NEW;    else
 | 
						|
    if (id == wxART_HELP)         tool = wxID_HELP;   else
 | 
						|
      return wxNullBitmap;
 | 
						|
    bOverriding = true;
 | 
						|
  } 
 | 
						|
  else
 | 
						|
  {
 | 
						|
    if (strName.CmpNoCase(wxT("Skin"))==0 && !m_strSkin.IsEmpty())
 | 
						|
      strName = m_strSkin;
 | 
						|
  }
 | 
						|
 | 
						|
  if (tool > 0 || id.ToLong(&tool))
 | 
						|
  {
 | 
						|
    if (client == wxART_TOOLBAR || client == wxART_BUTTON)
 | 
						|
      strName.Printf(wxT("res/tool_%ld.png"), tool); else
 | 
						|
    if (client == wxART_OTHER)
 | 
						|
      strName.Printf(wxT("res/image_%ld.png"), tool);
 | 
						|
    else
 | 
						|
      strName.Printf(wxT("res/icon_%ld.png"), tool);
 | 
						|
  }
 | 
						|
  else
 | 
						|
    strName.MakeLower();
 | 
						|
  
 | 
						|
  if (!strName.EndsWith(wxT(".png")))
 | 
						|
    strName << wxT(".png");
 | 
						|
 | 
						|
  bool bFound = wxFileName::FileExists(strName);
 | 
						|
  if (!bFound && !strName.StartsWith(wxT("res/")))
 | 
						|
  {
 | 
						|
    strName.Prepend(wxT("res/"));
 | 
						|
    bFound = wxFileName::FileExists(strName);
 | 
						|
  }
 | 
						|
 | 
						|
  if (!bFound && !bOverriding && tool > wxID_LOWEST && tool < wxID_HIGHEST)
 | 
						|
  {
 | 
						|
    switch (tool) 
 | 
						|
    {
 | 
						|
    case wxID_OPEN         : strName = wxART_FILE_OPEN;     break;
 | 
						|
    case wxID_SAVE         : strName = wxART_FILE_SAVE;     break;
 | 
						|
    case wxID_SAVEAS       : strName = wxART_FILE_SAVE_AS;  break;
 | 
						|
    case wxID_NEW          : strName = wxART_NEW;           break;
 | 
						|
    case wxID_HELP         : strName = wxART_HELP;          break;
 | 
						|
    case wxID_PREFERENCES  : strName = wxART_HELP_SETTINGS; break;
 | 
						|
    default                : strName = wxEmptyString;       break;
 | 
						|
    }
 | 
						|
    if (strName.StartsWith(wxT("wxART")))
 | 
						|
      return wxArtProvider::GetBitmap(strName, client, sz);
 | 
						|
  }
 | 
						|
  
 | 
						|
  if (!bFound)
 | 
						|
    return wxNullBitmap;
 | 
						|
 | 
						|
  wxBitmap bmp;
 | 
						|
  if (bmp.LoadFile(strName, wxBITMAP_TYPE_ANY))
 | 
						|
  {
 | 
						|
    const wxSize szOld(bmp.GetWidth(), bmp.GetHeight());
 | 
						|
    if (szOld != sz)
 | 
						|
    {
 | 
						|
      wxSize szNew = sz;
 | 
						|
      if (szOld.x >= szOld.y) 
 | 
						|
        szNew.y = sz.x * szOld.y / szOld.x;
 | 
						|
      else
 | 
						|
        szNew.x = sz.y * szOld.x / szOld.y;
 | 
						|
      bmp = wxBitmap(bmp.ConvertToImage().Scale(szNew.x, szNew.y, wxIMAGE_QUALITY_HIGH));
 | 
						|
    }
 | 
						|
  }
 | 
						|
  else
 | 
						|
    bmp.Create(sz.x, sz.y);
 | 
						|
  return bmp;
 | 
						|
}
 | 
						|
 | 
						|
gtArtProvider::gtArtProvider()
 | 
						|
{
 | 
						|
  const wxString strSkin = wxT("res/skin.png");
 | 
						|
  if (wxFileName::FileExists(strSkin))
 | 
						|
     m_strSkin = strSkin;
 | 
						|
}
 | 
						|
 | 
						|
void gtInitArtProvider()
 | 
						|
{
 | 
						|
  ::wxInitAllImageHandlers();
 | 
						|
 | 
						|
  wxArtProvider::Push(new gtArtProvider);
 | 
						|
 | 
						|
  wxDateTimeHolidayAuthority::AddAuthority(new gtHolidayAutority);
 | 
						|
}
 |