Patch level : 10.0

Files correlati     : xvaga.dll
Ricompilazione Demo : [ ]
Commento            :
Aggiunto supporto per docking panes ed outlook bars
Aggiunto supporto per esecuzione all'interno di una finestra invece che a tutto schermo
Migliorata gestione font delle status bar


git-svn-id: svn://10.65.10.50/trunk@16065 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2008-01-31 14:15:52 +00:00
parent 263a3a962c
commit db6f95f715
8 changed files with 424 additions and 111 deletions

@ -501,30 +501,41 @@ struct TFindWindowInfo
TFindWindowInfo() : _instance(NULL), _hwnd(NULL) { }
};
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
TFindWindowInfo* w = (TFindWindowInfo*)lParam;
HINSTANCE inst = (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE);
if (inst == w->_instance)
{
const LONG style = GetWindowLong(hwnd, GWL_STYLE);
if ((style & WS_CAPTION) != 0) // Ha la caption?
{
w->_hwnd = hwnd;
return FALSE;
}
return TRUE;
}
char str[256];
GetWindowText(hwnd, str, sizeof(str));
wxString title = str;
title.MakeUpper();
if (title.Find(w->_file) >= 0)
if (w->_instance != NULL)
{
w->_hwnd = hwnd;
return FALSE;
// Cerco di capire se e' la finetra principale dal fatto che
// abbia la caption ed i bottoni di chiusura
const DWORD dwWanted = WS_CAPTION | WS_SYSMENU;
HINSTANCE inst = (HINSTANCE)::GetWindowLong(hwnd, GWL_HINSTANCE);
if (inst == w->_instance)
{
const DWORD style = ::GetWindowLong(hwnd, GWL_STYLE);
if ((style & dwWanted) == dwWanted)
{
w->_hwnd = hwnd;
return FALSE;
}
return TRUE;
}
}
if (!w->_file.IsEmpty())
{
char str[_MAX_PATH];
if (::GetWindowText(hwnd, str, sizeof(str)))
{
wxString title = str;
title.MakeUpper();
if (title.Find(w->_file) >= 0)
{
w->_hwnd = hwnd;
return FALSE;
}
}
}
return TRUE;
@ -556,6 +567,46 @@ void OsWin32_PlaceProcessInWindow(unsigned int instance, const char* name, unsig
}
}
static BOOL CALLBACK EnumCampoChildrenProc(HWND hwnd, LPARAM lParam)
{
char str[_MAX_PATH];
if (::GetWindowText(hwnd, str, sizeof(str)))
{
TFindWindowInfo* w = (TFindWindowInfo*)lParam;
if (w->_file == str)
{
w->_hwnd = hwnd;
return FALSE;
}
}
return TRUE;
}
static BOOL CALLBACK EnumCampoWindowsProc(HWND hwnd, LPARAM lParam)
{
char str[_MAX_PATH];
if (::GetWindowText(hwnd, str, sizeof(str)))
{
const wxString title = str;
if (title.StartsWith("Base - "))
{
::EnumChildWindows(hwnd, EnumCampoChildrenProc, lParam);
TFindWindowInfo* w = (TFindWindowInfo*)lParam;
if (w->_hwnd != NULL)
return FALSE;
}
}
return TRUE;
}
unsigned int OsWin32_FindMenuContainer()
{
TFindWindowInfo w;
w._file = "__CAMPO_MENU__";
::EnumWindows(EnumCampoWindowsProc, LPARAM(&w));
return (unsigned int)w._hwnd;
}
///////////////////////////////////////////////////////////
// Hardlock Support
///////////////////////////////////////////////////////////
@ -930,3 +981,4 @@ bool OsWin32_IsWindowsServer()
{
return ::GetSystemMetrics(SM_REMOTESESSION) != 0;
}

@ -16,6 +16,7 @@ void OsWin32_SetCaptionStyle(WXHWND handle, bool set);
void* OsWin32_GetPrinterInfo(int& size, const char* printer);
void OsWin32_PlaceProcessInWindow(unsigned int instance, const char* name, unsigned int parent);
unsigned int OsWin32_FindMenuContainer();
void OsWin32_UpdateWindow(unsigned int handle);
int OsWin32_Help(WXHWND handle, const char* hlp, unsigned int cmd, const char* topic);

@ -1,6 +1,6 @@
/* STATBAR.H for dynamic custom control for XVT/Design 2.01
$Revision: 1.2 $ $Author: guy $ $Date: 2003-04-30 15:43:51 $
$Revision: 1.3 $ $Author: guy $ $Date: 2008-01-31 14:15:52 $
This code was written by Christopher Williamson,
May be distributed in object form only when embedded in a
@ -38,6 +38,8 @@ XVTDLL WINDOW statbar_create
int prop_count, char **prop_list, WINDOW parent_win,
int parent_rid, long parent_flags, char *parent_class);
XVTDLL BOOLEAN statbar_destroy(WINDOW win);
#if defined(_cplusplus) || defined(__cplusplus)
} /* extern "C" */
#endif

@ -11,6 +11,7 @@
#include "wx/image.h"
#include "wx/filefn.h"
#include <wx/snglinst.h>
#include <wx/tokenzr.h>
#include <wx/thread.h>
#include "xvt.h"
@ -300,49 +301,63 @@ void xvt_app_create(int argc, char **argv, unsigned long flags,
const wxString title = config->taskwin_title;
#ifdef WIN32
wxPoint pos = wxDefaultPosition;
wxSize size = wxDefaultSize;
#else
wxRect rect = wxGetClientDisplayRect();
wxPoint pos;
wxSize size ;
pos.x = rect.x;
pos.y = rect.y;
size.x = rect.width;
size.y = rect.height;
#endif
long style = wxDEFAULT_FRAME_STYLE;
long style = wxDEFAULT_FRAME_STYLE - wxRESIZE_BORDER;
if (_startup_rect.right > _startup_rect.left)
{
pos.x = _startup_rect.left;
pos.y = _startup_rect.top;
size.x = _startup_rect.right - _startup_rect.left;
size.y = _startup_rect.bottom - _startup_rect.top;
}
else
#ifdef WIN32
HWND hwndParent = (HWND)OsWin32_FindMenuContainer();
if (hwndParent != NULL)
{
RECT rct; ::GetWindowRect(hwndParent, &rct);
if (rct.right - rct.left >= 720)
xvt_rect_set(&_startup_rect, rct.left, rct.top, rct.right, rct.bottom);
}
#endif
if (_startup_rect.right > _startup_rect.left)
{
pos.x = _startup_rect.left;
pos.y = _startup_rect.top;
size.x = _startup_rect.right - _startup_rect.left;
size.y = _startup_rect.bottom - _startup_rect.top;
}
else
{
#ifdef WIN32
style |= wxMAXIMIZE;
const wxRect rect = wxGetClientDisplayRect();
#else
style &= ~wxMAXIMIZE;
style &= ~wxMAXIMIZE;
const wxRect rect = wxGetClientDisplayRect();
pos = rect.GetPosition();
size = rect.GetSize();;
#endif
}
_task_win = new TTaskWin(ICON_RSRC, title, pos, size, style);
_task_win->SetBackgroundStyle(wxBG_STYLE_CUSTOM); // Lo sfondo viene disegnato nella OnPaint
_nice_windows.Put((WINDOW)_task_win, _task_win);
#ifdef WIN32
if (hwndParent != NULL)
{
HWND hwndChild = (HWND)_task_win->GetHandle();
::SetWindowPos(hwndChild, HWND_TOPMOST, pos.x, pos.y, size.x, size.y, SWP_NOMOVE|SWP_NOSIZE);
}
#endif
wxMenu* Menus[3];
wxString Title[3];
Title[0] = "&File";
Menus[0] = new wxMenu;
Menus[0]->Append(M_FILE_NEW, "Scelta &Ditta...");
Menus[0]->AppendSeparator();
if (hwndParent == NULL)
{
Menus[0]->Append(M_FILE_NEW, "Scelta &Ditta...");
Menus[0]->AppendSeparator();
}
Menus[0]->Append(M_FILE_PG_SETUP, "&Impostazione Stampante...");
Menus[0]->Append(M_FILE_PRINT, "&Stampa");
Menus[0]->AppendSeparator();
@ -414,6 +429,7 @@ void xvt_app_process_pending_events(void)
{
while (a->Pending())
a->Dispatch();
a->ProcessIdle(); // Necessario per wxAUI
a->Yield(true);
}
}
@ -1150,9 +1166,7 @@ wxFont& TFontId::Font(wxDC* dc, WINDOW win) const
nSize = (int)(nSize * dPrintScale + 0.5);
}
// return wxTheFontList->FindOrCreateFont(nSize, Family(), Style(), Weight(), Underline(), FaceName());
return XVT_FONT_CACHE.FindOrCreate(nSize, Family(), Style(), Weight(), Underline(), FaceName());
}
void TFontId::Copy(const wxFont& rFont)
@ -3380,13 +3394,16 @@ long xvt_sys_execute(const char* cmdline, BOOLEAN sync, BOOLEAN iconizetask)
long xvt_sys_execute_in_window(const char* cmdline, WINDOW win)
{
long inst = xvt_sys_execute(cmdline, FALSE, FALSE);
if (inst > 0)
const long inst = xvt_sys_execute(cmdline, FALSE, FALSE);
if (inst > 0 && win != NULL_WIN)
{
CAST_WIN(win, w);
#ifdef WIN32
OsWin32_PlaceProcessInWindow(inst, "", xvt_vobj_get_attr(ATTR_NATIVE_WINDOW, win));
OsWin32_PlaceProcessInWindow(inst, "", (unsigned int)w.GetHandle());
#else
OsLinux_PlaceProcessInWindow(inst, "", xvt_vobj_get_attr(ATTR_NATIVE_WINDOW, win));
OsLinux_PlaceProcessInWindow(inst, "", w.GetHandle());
#endif
}
return inst;
}
@ -3784,7 +3801,7 @@ long xvt_vobj_get_attr(WINDOW win, long data)
case ATTR_DISPLAY_TYPE:
switch (::wxDisplayDepth()) // Test ormai ridicolo?
{
case 1: ret = XVT_DISPLAY_MONO; break;
case 1: ret = XVT_DISPLAY_MONO; break; // Ridicolissimo :-)
case 4: ret = XVT_DISPLAY_COLOR_16; break;
case 8: ret = XVT_DISPLAY_COLOR_256; break;
default: ret = XVT_DISPLAY_DIRECT_COLOR; break;
@ -4192,40 +4209,59 @@ void xvt_win_trap_pointer(WINDOW win)
// Status bar
///////////////////////////////////////////////////////////
static wxStatusBar* WIN2StatBar(WINDOW win)
{
wxStatusBar* pStatusBar = NULL;
if (win == NULL_WIN || win == TASK_WIN)
{
wxFrame* w = (wxFrame*)_task_win;
pStatusBar = w->GetStatusBar();
}
else
pStatusBar = (wxStatusBar*)win;
return pStatusBar;
}
const char* statbar_set_title(WINDOW win, const char* text)
{
XVT_ASSERT(win == TASK_WIN);
wxFrame& w = *(wxFrame*)win;
if (text == NULL)
text = _strDefaultStatbarText;
char* tab = (char*)strchr(text, '\t');
if (tab)
{
w.SetStatusText(tab+1, 1);
*tab = '\0';
w.SetStatusText(text);
*tab = '\t';
}
else
w.SetStatusText(text);
wxStatusBar* pStatusBar = WIN2StatBar(win);
if (pStatusBar != NULL)
{
if (text == NULL)
text = _strDefaultStatbarText;
wxStringTokenizer tok(text, "\t", wxTOKEN_RET_EMPTY);
for (int t = 0; tok.HasMoreTokens(); t++)
pStatusBar->SetStatusText(tok.GetNextToken(), t);
}
return text;
}
const char* statbar_set_default_title(WINDOW win, const char *text)
{
_strDefaultStatbarText = text;
return statbar_set_title(win, _strDefaultStatbarText);
return statbar_set_title(win, text);
}
XVT_FNTID statbar_set_fontid(WINDOW win, XVT_FNTID fontid)
{
return fontid; // TBI???
wxStatusBar* pStatBar = WIN2StatBar(win);
if (pStatBar != NULL && fontid != NULL)
{
const TFontId& font = *(const TFontId*)fontid;
pStatBar->SetFont(font.Font(NULL, win));
}
return fontid;
}
XVT_FNTID statbar_get_fontid(WINDOW win, XVT_FNTID fontid)
{
return fontid; // VERIFICARE
wxStatusBar* pStatBar = WIN2StatBar(win);
if (pStatBar != NULL && fontid != NULL)
{
TFontId& font = *(TFontId*)fontid;
font.Copy(pStatBar->GetFont());
}
return fontid;
}
WINDOW statbar_create(int cid, int left, int top, int right, int bottom,
@ -4233,17 +4269,28 @@ WINDOW statbar_create(int cid, int left, int top, int right, int bottom,
int parent_rid, long parent_flags, char *parent_class)
{
XVT_ASSERT(parent_win == TASK_WIN);
TTaskWin& w = *(TTaskWin*)_task_win;
w.CreateStatusBar(2);
w.GetStatusBar()->Show();
wxSize sz = w.GetClientSize();
int widths[2];
widths[0] = -1;
widths[1] = sz.x / 4;
w.SetStatusWidths(2, widths);
wxFrame& w = *(wxFrame*)_task_win;
wxStatusBar* pStatusBar = w.CreateStatusBar(2, 0); // NOT w.CreateStatusBar(2, wxST_SIZEGRIP)
if (pStatusBar != NULL)
{
const wxSize sz = pStatusBar->GetSize();
const int widths[2] = { -1, 256 };
pStatusBar->SetStatusWidths(2, widths);
}
return (WINDOW)pStatusBar;
}
return (WINDOW)&w;
BOOLEAN statbar_destroy(WINDOW win)
{
wxStatusBar* pStatusBar = WIN2StatBar(win);
if (pStatusBar != NULL)
{
wxFrame& w = *(wxFrame*)_task_win;
if (w.GetStatusBar() == pStatusBar)
w.SetStatusBar(NULL);
pStatusBar->Destroy();
}
return pStatusBar != NULL;
}
void xvt_btn_set_images(WINDOW win, XVT_IMAGE up, XVT_IMAGE down)

@ -28,7 +28,6 @@ IMPLEMENT_DYNAMIC_CLASS(TMainApp, wxApp)
DECLARE_APP(TMainApp)
IMPLEMENT_APP(TMainApp)
#define TIMER_ID 883
BEGIN_EVENT_TABLE(TMainApp, wxApp)

@ -207,6 +207,11 @@ XVTDLL void xvt_image_set_ncolors(XVT_IMAGE image, short ncolors);
XVTDLL void xvt_image_set_pixel(XVT_IMAGE image, short x, short y, COLOR color);
XVTDLL void xvt_image_transfer(XVT_IMAGE dstimage, XVT_IMAGE srcimage, RCT *dstrctp, RCT *srcrctp);
XVTDLL int xvt_list_add_item(WINDOW win, short icon, const char* text, int flags);
XVTDLL BOOLEAN xvt_list_clear(WINDOW win);
XVTDLL BOOLEAN xvt_list_get_sel_index(WINDOW win);
XVTDLL BOOLEAN xvt_list_set_sel(WINDOW win, int index, BOOLEAN select);
XVTDLL DATA_PTR xvt_mem_alloc(size_t size);
XVTDLL void xvt_mem_free(DATA_PTR p);
XVTDLL DATA_PTR xvt_mem_realloc(DATA_PTR p, size_t size);

@ -230,7 +230,8 @@ WC_HGAUGE, /* horizontal progress bar */
WC_VGAUGE, /* vertical progress bar */
WC_NOTEBK, /* notebook control */
WC_HTML, /* HTML control */
WC_TREE, /* tree view */
WC_TREE, /* tree view */
WC_OUTLOOKBAR, /* Barra di outlook */
} WIN_TYPE;
typedef enum {

@ -4,12 +4,14 @@
#include "xvt.h"
#include "xvtwin.h"
#include "wx/image.h"
#include "wx/notebook.h"
#include "wx/treectrl.h"
#if wxCHECK_VERSION(2,8,7)
#include "wx/aui/aui.h"
#endif
#include "wx/notebook.h"
#include "wx/treectrl.h"
#include "wx/vlbox.h"
///////////////////////////////////////////////////////////
// Utilities
///////////////////////////////////////////////////////////
@ -514,9 +516,9 @@ BEGIN_EVENT_TABLE(TwxWindow, TwxWindowBase)
EVT_SET_FOCUS(TwxWindow::OnSetFocus)
EVT_SIZE(TwxWindow::OnSize)
EVT_TIMER(TIMER_ID, TwxWindow::OnTimer)
EVT_COMMAND_RANGE(1, 9999, wxEVT_COMMAND_BUTTON_CLICKED, TwxWindow::OnButton)
EVT_COMMAND_RANGE(1, 9999, wxEVT_COMMAND_CHECKBOX_CLICKED, TwxWindow::OnCheckBox)
EVT_COMMAND_RANGE(1, 9999, wxEVT_COMMAND_RADIOBUTTON_SELECTED, TwxWindow::OnRadioButton)
EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, TwxWindow::OnButton)
EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, TwxWindow::OnCheckBox)
EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_RADIOBUTTON_SELECTED, TwxWindow::OnRadioButton)
END_EVENT_TABLE()
void TwxWindow::DoXvtEvent(EVENT& e)
@ -889,16 +891,16 @@ BOOLEAN TwxWindow::AddPane(wxWindow* wnd, const char* caption, int nDock, int nF
switch (nDock)
{
case 1:
pane.Left().LeftDockable().RightDockable().MinSize(sz.x/2, -1);
pane.Left().Floatable(true).LeftDockable().RightDockable().MinSize(sz.x/2, -1);
break;
case 2:
pane.Top().TopDockable().BottomDockable().MinSize(-1, sz.y/2);
pane.Top().Floatable(true).TopDockable().BottomDockable().MinSize(-1, sz.y/2);
break;
case 3:
pane.Right().LeftDockable().RightDockable().MinSize(sz.x/2, -1);
pane.Right().Floatable(true).LeftDockable().RightDockable().MinSize(sz.x/2, -1);
break;
case 4:
pane.Bottom().TopDockable().BottomDockable().MinSize(-1, sz.y/2);
pane.Bottom().Floatable(true).TopDockable().BottomDockable().MinSize(-1, sz.y/2);
break;
default:
pane.CentrePane().Floatable(false);
@ -941,11 +943,9 @@ TwxWindow::~TwxWindow()
xvt_res_free_menu_tree(m_menu);
((TTaskWin*)_task_win)->PopMenuTree();
}
_nice_windows.Delete((WINDOW)this);
}
///////////////////////////////////////////////////////////
// Main application = TASK_WIN functions
///////////////////////////////////////////////////////////
@ -987,20 +987,27 @@ void TTaskWin::OnMenu(wxCommandEvent& evt)
void TTaskWin::OnPaint(wxPaintEvent& WXUNUSED(evt))
{
EVENT e; memset(&e, 0, sizeof(EVENT));
e.type = E_UPDATE;
RCT& rct = e.v.update.rct;
const wxRect rctDamaged = GetUpdateRegion().GetBox();
if (!rctDamaged.IsEmpty())
{
EVENT e; memset(&e, 0, sizeof(EVENT));
e.type = E_UPDATE;
RCT& rct = e.v.update.rct;
rct.left = rctDamaged.x;
rct.top = rctDamaged.y;
rct.right = rctDamaged.GetRight()+1;
rct.bottom = rctDamaged.GetBottom()+1;
wxRect rctDamaged = GetUpdateRegion().GetBox();
rct.left = rctDamaged.x;
rct.top = rctDamaged.y;
rct.right = rctDamaged.GetRight()+1;
rct.bottom = rctDamaged.GetBottom()+1;
TDC& dc = GetTDCMapper().GetTDC((WINDOW)this);
dc.GetDC(true); // Forza la creazione di un wxPaintDC
_task_win_handler((WINDOW)this, &e);
dc.KillDC();
TDC& dc = GetTDCMapper().GetTDC((WINDOW)this);
dc.GetDC(true); // Forza la creazione di un wxPaintDC
_task_win_handler((WINDOW)this, &e);
dc.KillDC();
}
else
{
// Tempo risparmiato
int keku = 1;
}
}
void TTaskWin::OnSize(wxSizeEvent& evt)
@ -1082,9 +1089,8 @@ void TTaskWin::PopMenuTree()
m_MenuOwner = NULL; // = this;
}
TTaskWin::TTaskWin(wxWindowID id,
const wxString& title, const wxPoint& pos,
const wxSize& size, long style)
TTaskWin::TTaskWin(wxWindowID id, const wxString& title,
const wxPoint& pos, const wxSize& size, long style)
: wxFrame(NULL, id, title, pos, size, style), m_menu(NULL), m_pOldBar(NULL), m_MenuOwner(NULL)
{
wxIcon* ico = _GetIconResource(ICON_RSRC);
@ -1162,6 +1168,31 @@ public:
TwxTreeCtrl(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size);
};
struct TwxOutlookItem
{
wxString m_strText;
short m_nIconId;
int m_nFlags;
};
class TwxOutlookBar : public wxVListBox
{
enum { MAX_ITEMS = 32 };
TwxOutlookItem m_item[MAX_ITEMS];
DECLARE_EVENT_TABLE()
protected:
virtual void OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const;
virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const;
virtual wxCoord OnMeasureItem(size_t n) const;
virtual void OnSelected(wxCommandEvent& e);
public:
int Add(short nIconId, const wxString strText, int nFlags);
TwxOutlookBar(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size);
};
WINDOW xvt_ctl_create_def(WIN_DEF *win_def_p, WINDOW parent_win, long app_data)
{
wxASSERT(win_def_p != NULL);
@ -1240,6 +1271,12 @@ WINDOW xvt_ctl_create_def(WIN_DEF *win_def_p, WINDOW parent_win, long app_data)
tv->SetFont(font);
}
}
break;
case WC_OUTLOOKBAR:
{
TwxOutlookBar* tob = new TwxOutlookBar(pParent, id, rct.GetPosition(), rct.GetSize());
win = (WINDOW)tob;
}
break;
default:
SORRY_BOX(); break;
@ -1765,3 +1802,172 @@ void xvt_treeview_suspend(WINDOW win)
CAST_TREEVIEW(win, tv);
tv.Suspend();
}
///////////////////////////////////////////////////////////
// TwxOutlookBar
///////////////////////////////////////////////////////////
BEGIN_EVENT_TABLE(TwxOutlookBar, wxVListBox)
EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_LISTBOX_SELECTED, TwxOutlookBar::OnSelected)
EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, TwxOutlookBar::OnSelected)
END_EVENT_TABLE()
static wxAuiDockArt* GetArtist(const wxWindow* pWindow)
{
wxAuiDockArt* pArtist = NULL;
const wxAuiManager* pManager = wxAuiManager::GetManager(pWindow->GetParent());
if (pManager != NULL)
pArtist = pManager->GetArtProvider();
return pArtist;
}
static int GrayLevel(const wxColour& col)
{
const unsigned char r = col.Red();
const unsigned char g = col.Green();
const unsigned char b = col.Blue();
int k = (int)(0.299 * r + 0.587 * g + 0.114 * b);
return k;
}
void TwxOutlookBar::OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const
{
wxAuiDockArt* pArtist = GetArtist(this);
wxColour color1, color2;
if (n == GetSelection())
{
color1 = wxColour(251,230,148); // Colori predefiniti di Outlook
color2 = wxColour(238,149, 21);
}
else
{
color1 = pArtist->GetColour(wxAUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR);
color2 = pArtist->GetColour(wxAUI_DOCKART_ACTIVE_CAPTION_COLOUR);
}
dc.GradientFillLinear(rect, color1, color2, wxDOWN);
}
void TwxOutlookBar::OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const
{
const int nSide = rect.height;
const TwxOutlookItem& oi = m_item[n];
int nTextOffset = 4;
if (oi.m_nIconId > 0)
{
wxIcon* pIcon = _GetIconResource(oi.m_nIconId);
if (pIcon != NULL)
{
const wxSize szIco(pIcon->GetWidth(), pIcon->GetHeight());
dc.DrawIcon(*pIcon, rect.x+nTextOffset, rect.y+(nSide-szIco.y)/2);
nTextOffset += nTextOffset+szIco.x;
}
}
wxAuiDockArt* pArtist = GetArtist(this);
wxFont font = pArtist->GetFont(wxAUI_DOCKART_CAPTION_FONT);
font.SetWeight(wxFONTWEIGHT_BOLD);
dc.SetFont(font);
wxColour color;
if (n == GetSelection())
color = pArtist->GetColour(wxAUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR );
else
color = pArtist->GetColour(wxAUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR );
dc.SetTextForeground(color);
const wxSize szText = dc.GetTextExtent(oi.m_strText);
dc.DrawText(oi.m_strText, rect.x+nTextOffset, rect.y+(nSide-szText.y)/2);
}
wxCoord TwxOutlookBar::OnMeasureItem(size_t n) const
{
const int nItems = GetItemCount();
wxCoord nHeight = 36;
if (nItems > 1)
{
const wxSize sz = GetSize();
nHeight = max(sz.y / nItems, nHeight);
}
return nHeight;
}
void TwxOutlookBar::OnSelected(wxCommandEvent& evt)
{
EVENT e; memset(&e, 0, sizeof(EVENT));
e.type = E_CONTROL;
e.v.ctl.id = evt.GetId();
e.v.ctl.ci.type = WC_OUTLOOKBAR;
e.v.ctl.ci.win = WINDOW(this);
e.v.ctl.ci.v.lbox.dbl_click = evt.GetEventType() == wxEVT_COMMAND_LISTBOX_DOUBLECLICKED;
TwxWindow* win = (TwxWindow*)GetParent();
win->DoXvtEvent(e);
}
int TwxOutlookBar::Add(short nIconId, const wxString strText, int nFlags)
{
int i = GetItemCount();
const bool ok = i < MAX_ITEMS-1;
if (ok)
{
m_item[i].m_nIconId = nIconId;
m_item[i].m_strText = strText;
m_item[i].m_nFlags = nFlags;
SetItemCount(i+1);
}
else
i = -1;
return i;
}
TwxOutlookBar::TwxOutlookBar(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size)
: wxVListBox(parent, id, pos, size)
{
SetItemCount(0);
}
int xvt_list_add_item(WINDOW win, short icon, const char* text, int flags)
{
int n = -1;
if (win != NULL_WIN)
{
TwxOutlookBar* olb = (TwxOutlookBar*)win;
n = olb->Add(icon, text, flags);
}
return n;
}
BOOLEAN xvt_list_clear(WINDOW win)
{
BOOLEAN ok = win != NULL_WIN;
if (ok)
{
TwxOutlookBar* olb = (TwxOutlookBar*)win;
olb->Clear();
}
return ok;
}
BOOLEAN xvt_list_get_sel_index(WINDOW win)
{
int sel = -1;
BOOLEAN ok = win != NULL_WIN;
if (ok)
{
TwxOutlookBar* olb = (TwxOutlookBar*)win;
sel = olb->GetSelection();
}
return sel;
}
BOOLEAN xvt_list_set_sel(WINDOW win, int index, BOOLEAN select)
{
BOOLEAN ok = win != NULL_WIN;
if (ok)
{
TwxOutlookBar* olb = (TwxOutlookBar*)win;
if (select)
olb->SetSelection(index);
}
return ok;
}