// Windows/Control/StatusBar.h

#ifndef __WINDOWS_CONTROL_STATUSBAR_H
#define __WINDOWS_CONTROL_STATUSBAR_H

#include "../Window.h"

namespace NWindows {
namespace NControl {

class CStatusBar: public NWindows::CWindow
{
public:
  bool Create(LONG style, LPCTSTR text, HWND hwndParent, UINT id)
    { return (_window = ::CreateStatusWindow(style, text, hwndParent, id)) != 0; }
  bool SetText(LPCTSTR text)
    { return CWindow::SetText(text); }
  bool SetText(unsigned index, LPCTSTR text, UINT type)
    { return LRESULTToBool(SendMessage(SB_SETTEXT, index | type, (LPARAM)text)); }
  bool SetText(unsigned index, LPCTSTR text)
    { return SetText(index, text, 0); }

  #ifndef _UNICODE
  bool Create(LONG style, LPCWSTR text, HWND hwndParent, UINT id)
    { return (_window = ::CreateStatusWindowW(style, text, hwndParent, id)) != 0; }
  bool SetText(LPCWSTR text)
    { return CWindow::SetText(text); }
  bool SetText(unsigned index, LPCWSTR text, UINT type)
    { return LRESULTToBool(SendMessage(SB_SETTEXTW, index | type, (LPARAM)text)); }
  bool SetText(unsigned index, LPCWSTR text)
    { return SetText(index, text, 0); }
  #endif

  bool SetParts(unsigned numParts, const int *edgePostions)
    { return LRESULTToBool(SendMessage(SB_SETPARTS, numParts, (LPARAM)edgePostions)); }
  void Simple(bool simple)
    { SendMessage(SB_SIMPLE, BoolToBOOL(simple), 0); }
};

}}

#endif
