[Date Prev][Date Next][Thread Prev][Thread Next][Thread Index]

[XaraXtreme-commits] Commit Complete



Commit by  : alex
Repository : xara
Revision   : 1387
Date       : Wed Jun 28 18:50:29 BST 2006

Changed paths:
   A /Trunk/XaraLX/wxOil/bitmapdropdown.cpp
   A /Trunk/XaraLX/wxOil/bitmapdropdown.h

Ooops, forgot 2 files


Diff:
Index: Trunk/XaraLX/wxOil/bitmapdropdown.cpp
===================================================================
--- Trunk/XaraLX/wxOil/bitmapdropdown.cpp	(revision 0)
+++ Trunk/XaraLX/wxOil/bitmapdropdown.cpp	(revision 1387)
@@ -0,0 +1,638 @@
+// $Id: coldrop.cpp 1052 2006-05-15 14:19:14Z alex $
+/* @@tag:xara-cn@@ DO NOT MODIFY THIS LINE
+================================XARAHEADERSTART===========================
+ 
+               Xara LX, a vector drawing and manipulation program.
+                    Copyright (C) 1993-2006 Xara Group Ltd.
+       Copyright on certain contributions may be held in joint with their
+              respective authors. See AUTHORS file for details.
+
+LICENSE TO USE AND MODIFY SOFTWARE
+----------------------------------
+
+This file is part of Xara LX.
+
+Xara LX is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 2 as published
+by the Free Software Foundation.
+
+Xara LX and its component source files are distributed in the hope
+that it will be useful, but WITHOUT ANY WARRANTY; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with Xara LX (see the file GPL in the root directory of the
+distribution); if not, write to the Free Software Foundation, Inc., 51
+Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+
+
+ADDITIONAL RIGHTS
+-----------------
+
+Conditional upon your continuing compliance with the GNU General Public
+License described above, Xara Group Ltd grants to you certain additional
+rights. 
+
+The additional rights are to use, modify, and distribute the software
+together with the wxWidgets library, the wxXtra library, and the "CDraw"
+library and any other such library that any version of Xara LX relased
+by Xara Group Ltd requires in order to compile and execute, including
+the static linking of that library to XaraLX. In the case of the
+"CDraw" library, you may satisfy obligation under the GNU General Public
+License to provide source code by providing a binary copy of the library
+concerned and a copy of the license accompanying it.
+
+Nothing in this section restricts any of the rights you have under
+the GNU General Public License.
+
+
+SCOPE OF LICENSE
+----------------
+
+This license applies to this program (XaraLX) and its constituent source
+files only, and does not necessarily apply to other Xara products which may
+in part share the same code base, and are subject to their own licensing
+terms.
+
+This license does not apply to files in the wxXtra directory, which
+are built into a separate library, and are subject to the wxWindows
+license contained within that directory in the file "WXXTRA-LICENSE".
+
+This license does not apply to the binary libraries (if any) within
+the "libs" directory, which are subject to a separate license contained
+within that directory in the file "LIBS-LICENSE".
+
+
+ARRANGEMENTS FOR CONTRIBUTION OF MODIFICATIONS
+----------------------------------------------
+
+Subject to the terms of the GNU Public License (see above), you are
+free to do whatever you like with your modifications. However, you may
+(at your option) wish contribute them to Xara's source tree. You can
+find details of how to do this at:
+  http://www.xaraxtreme.org/developers/
+
+Prior to contributing your modifications, you will need to complete our
+contributor agreement. This can be found at:
+  http://www.xaraxtreme.org/developers/contribute/
+
+Please note that Xara will not accept modifications which modify any of
+the text between the start and end of this header (marked
+XARAHEADERSTART and XARAHEADEREND).
+
+
+MARKS
+-----
+
+Xara, Xara LX, Xara X, Xara X/Xtreme, Xara Xtreme, the Xtreme and Xara
+designs are registered or unregistered trademarks, design-marks, and/or
+service marks of Xara Group Ltd. All rights in these marks are reserved.
+
+
+      Xara Group Ltd, Gaddesden Place, Hemel Hempstead, HP2 6EX, UK.
+                        http://www.xara.com/
+
+=================================XARAHEADEREND============================
+ */
+
+// coldrop.cpp - Colour drop-down list support
+
+/*
+*/
+
+
+//-----------------------------------------------------------------------------------------
+// Include files
+
+#include "camtypes.h"
+#include "camelot.h"
+#include "errors.h"
+#include "palman.h"
+#include "cartprov.h"
+
+#include "bitmapdropdown.h"
+
+
+
+
+CC_IMPLEMENT_DYNCREATE(CBitmapDropDown, ListItem);
+
+
+
+//-----------------------------------------------------------------------------------------
+// This must be defined AFTER all CC_IMPLEMENT_DYNCREATE calls
+#define new CAM_DEBUG_NEW
+
+
+CBDDItemInfo::CBDDItemInfo()
+{
+	m_uiBitmapResID = (UINT32)-1;
+}
+
+
+CBDDItemInfo::CBDDItemInfo(UINT32 uiBitmapResID, String_256 strText)
+{
+	m_uiBitmapResID = uiBitmapResID;
+	m_bHasText		= strText.IsEmpty();
+	
+	if (m_bHasText)
+		m_strText = strText;
+	else
+	{
+		// Workaround the DropDown feature - it distinguish the items by
+		// their names (so we can't select items with empty text.
+		static UINT32 s_iDummy = 0;
+		m_strText._MakeMsg(_T("%d"), ++s_iDummy);
+	}
+}
+
+const CBDDItemInfo& CBDDItemInfo::operator=(const CBDDItemInfo& rOther)
+{
+	m_uiBitmapResID = rOther.m_uiBitmapResID;
+	m_bHasText		= rOther.m_bHasText;
+	m_strText		= rOther.m_strText;
+
+	return *this;
+}
+
+UINT32 CBDDItemInfo::GetBitmapID()
+{
+	return m_uiBitmapResID;
+}
+
+String_256 CBDDItemInfo::GetText()
+{
+	return m_strText;
+}
+	
+BOOL CBDDItemInfo::HasText()
+{
+	return m_bHasText;
+}
+
+
+
+
+
+
+
+
+
+
+
+/******************************************************************************
+Function  : wxCamBitmapDropdownPopup::PaintComboControl
+Author    : Mikhail Tatarnikov
+Purpose   : Paints the currently selected item into the control itself (not to the dropdown list)
+Returns   : void
+Exceptions: 
+Parameters: [in] wxDC&		   dc	- context to draw to;
+            [in] const wxRect& rect - the item size.
+Notes     : The default behaivour is to leave the control blank if no item is selected.
+******************************************************************************/
+void wxCamBitmapDropdownPopup::PaintComboControl(wxDC& dc, const wxRect& rect)
+{
+    if (!(m_combo->GetWindowStyle() & wxODCB_STD_CONTROL_PAINT))
+    {
+//		m_combo->DrawFocusBackground(dc,rect,0);
+        
+        // Draw the control regardless whether it has an item selected or not.
+		OnDrawItem(dc, rect, m_value, wxCP_PAINTING_CONTROL);
+		
+		return;
+    }
+
+    wxComboPopup::PaintComboControl(dc,rect);
+}
+
+/******************************************************************************
+Function  : wxCamBitmapDropdownPopup::GetAdjustedSize
+Author    : Mikhail Tatarnikov
+Purpose   : Calculates the dropdown list size
+Returns   : wxSize - the popup list size.
+Exceptions: 
+Parameters: [in] int minWidth   - minimum width; in the current implemetation it's the 
+								  size of combobox control itself. In this function we
+								  ignore it;
+            [in] int prefHeight - the preffered height;
+            [in] int maxHeight  - maximum allowed height.
+Notes     : 
+******************************************************************************/
+wxSize wxCamBitmapDropdownPopup::GetAdjustedSize(int minWidth, int prefHeight, int maxHeight)
+{
+	// We should ignore the min width, since it's usually the size of the combobox
+	// (we can have a dropdown with width less than the control).
+	
+    int  height			= 250;
+    BOOL bNeedScrollbar = FALSE;
+
+    if ( m_strings.GetCount() )
+    {
+        if ( prefHeight > 0 )
+            height = prefHeight;
+
+        if ( height > maxHeight )
+            height = maxHeight;
+
+        int totalHeight = GetTotalHeight(); // + 3;
+        if ( height >= totalHeight )
+        {
+            height = totalHeight;
+        }
+        else
+        {
+            // Adjust height to a multiple of the height of the first item
+            // NB: Calculations that take variable height into account
+            //     are unnecessary.
+            int fih = GetLineHeight(0);
+            int shown = height/fih;
+            height = shown * fih;
+            
+            bNeedScrollbar = TRUE;
+        }
+    }
+    else
+        height = 50;
+
+    // Take scrollbar into account in width calculations
+    int iWidth = m_widestWidth;
+    if (bNeedScrollbar)
+    	iWidth += wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
+//	int widestWidth = m_widestWidth + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X);
+    
+    return wxSize(iWidth, height+2);
+}
+
+
+CBitmapDropDown::CBitmapDropDown()
+{
+}
+
+
+
+CBitmapDropDown::~CBitmapDropDown()
+{
+}
+
+
+
+
+/******************************************************************************
+Function  : CBitmapDropDown::AddItem
+Author    : Mikhail Tatarnikov
+Purpose   : Adds a new item (icon + text)
+Returns   : void
+Exceptions: 
+Parameters: [in] UINT32		uiBitmapResID - bitmap resource for the item;
+            [in] String_256 strText		  - item label.
+Notes     : 
+******************************************************************************/
+void CBitmapDropDown::AddItem(UINT32 uiBitmapResID, String_256 strText)
+{
+	m_vecItems.push_back(CBDDItemInfo(uiBitmapResID, strText));
+
+	// Get the point to the last stored 
+	CBDDItemInfo* poItem = &(m_vecItems[m_vecItems.size() - 1]);
+	DropDown::AddItem((void*)poItem);
+
+	SetSelectedIndex(0);
+}
+
+/******************************************************************************
+Function  : CBitmapDropDown::AddDivider
+Author    : Mikhail Tatarnikov
+Purpose   : Add a divider
+Returns   : void
+Exceptions: 
+Parameters: None
+Notes     : 
+******************************************************************************/
+void CBitmapDropDown::AddDivider()
+{
+	DropDown::AddItem(NULL);
+}
+
+/******************************************************************************
+Function  : CBitmapDropDown::DeleteItem
+Author    : Mikhail Tatarnikov
+Purpose   : Removes an item from dropdown
+Returns   : void
+Exceptions: 
+Parameters: [in] INT32 iIndex - index of an item to be removed.
+Notes     : 
+******************************************************************************/
+void CBitmapDropDown::DeleteItem(INT32 iIndex)
+{
+	ASSERT(FALSE);	// Not implemented yet.
+}
+
+
+/******************************************************************************
+Function  : CBitmapDropDown::GetItemData
+Author    : Mikhail Tatarnikov
+Purpose   : Obtains the data for an item.
+Returns   : void* - the pointer to the data.
+Exceptions: 
+Parameters: [in] INT32 iItemIndex - item index to get data for.
+Notes     : Since the information is stored in the internal array (not in the combobox
+			itself), we need to override the default behaivour.
+******************************************************************************/
+void* CBitmapDropDown::GetItemData(INT32 iItemIndex)
+{
+	// Check if we are requested information about "unselected" item.
+	if (iItemIndex < 0)
+		return (void*)(&m_oUnselectedItemInfo);
+
+	// The normal items are stored in the items collection.
+	CBDDItemInfo* poItem = &(m_vecItems[iItemIndex]);
+
+	return (void*)poItem;
+}
+
+
+/******************************************************************************
+Function  : CBitmapDropDown::HasIcon
+Author    : Mikhail Tatarnikov
+Purpose   : Determines if the item (represented by its data) has an icon
+Returns   : BOOL - TRUE if icon was supplied for the item, FALSE otherwise.
+Exceptions: 
+Parameters: [in] void* pvItemData - the item data.
+Notes     : 
+******************************************************************************/
+BOOL CBitmapDropDown::HasIcon(void* pvItemData)
+{
+	CBDDItemInfo* pItemInfo = reinterpret_cast<CBDDItemInfo*>(pvItemData);
+	if (pItemInfo->GetBitmapID() != (UINT32)-1)
+		return TRUE;
+
+	return FALSE;
+}
+
+/******************************************************************************
+Function  : CBitmapDropDown::HasText
+Author    : Mikhail Tatarnikov
+Purpose   : Determines whether an item has text label
+Returns   : BOOL - TRUE if text was supplied for the item, FALSE otherwise.
+Exceptions: 
+Parameters: [in] void* pvItemData - the item data.
+Notes     : 
+******************************************************************************/
+BOOL CBitmapDropDown::HasText(void* pvItemData)
+{
+	CBDDItemInfo* pItemInfo = reinterpret_cast<CBDDItemInfo*>(pvItemData);
+	return pItemInfo->HasText();
+}
+
+
+/******************************************************************************
+Function  : CBitmapDropDown::GetText
+Author    : Mikhail Tatarnikov
+Purpose   : Obtains label for the item.
+Returns   : wxString -
+Exceptions: 
+Parameters: [in] void* pvItemData - the item data;
+            [in] INT32 iItem	  - the item index.
+Notes     : 
+******************************************************************************/
+wxString CBitmapDropDown::GetText(void* pvItemData, INT32 iItem)
+{
+	if (!pvItemData)
+		return DropDown::GetText(pvItemData, iItem);
+
+	CBDDItemInfo* pItemInfo = reinterpret_cast<CBDDItemInfo*>(pvItemData);
+	
+	return pItemInfo->GetText();
+}
+
+
+
+/******************************************************************************
+Function  : CBitmapDropDown::Init
+Author    : Mikhail Tatarnikov
+Purpose   : Initialize the control
+Returns   : BOOL - TRUE if success, FALSE otherwise.
+Exceptions: 
+Parameters: [in] CWindowID Window - the parent window, NULL to deinitialize;
+            [in] CGadgetID Gadget - the control ID.
+Notes     : 
+******************************************************************************/
+BOOL CBitmapDropDown::Init(CWindowID Window, CGadgetID Gadget)
+{
+	if (Window)
+	{
+		// Obtain the gadget and check if it has an appropriate class (we can
+		// be attached to owner-draw combobox obly).
+		wxWindow * pGadget = DialogManager::GetGadget(Window, Gadget);
+		if (pGadget && pGadget->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)))
+		{
+			if (!Initialised)			// Only ever add myself to the list once
+			{
+				m_pPopup = new wxCamBitmapDropdownPopup(this);
+				ERROR2IF(!m_pPopup, FALSE, "Could not get new list popup");
+				((wxOwnerDrawnComboBox *)pGadget)->SetPopupControl(m_pPopup);
+				CurrentDropDowns.AddHead(this);
+			}
+	
+			ParentDlg	 = Window;
+			ParentGadget = Gadget;
+	
+			Initialised = TRUE;
+			return(TRUE);
+		}
+		ERROR3("CBitmapDropDown::Init failed - illegal Gadget");
+		return(FALSE);
+	}
+	else
+	{
+		// release all memory
+		KillList();
+		ClearList();
+		ParentDlg=NULL;
+		ParentGadget=0;
+		Initialised=FALSE;
+		CurrentDropDowns.RemoveItem(this);
+		return TRUE;
+	}
+}
+
+
+/******************************************************************************
+Function  : CBitmapDropDown::HandleDrawItemInternal
+Author    : Mikhail Tatarnikov
+Purpose   : Handles items drawing
+Returns   : wxSize - the size of the item.
+Exceptions: 
+Parameters: [in] wxDC& dc			- device context to draw to;
+            [in] const wxRect& Rect - the clipping area for the item;
+            [in] INT32 item			- item index;
+            [in] INT32 flags		- flags (see odcombo.h, the only specified flag at the
+									  moment of writing is wxCP_PAINTING_CONTROL);
+            [in] BOOL  Draw			- TRUE if we should draw, FALSE in case of size measurement.
+Notes     : 
+******************************************************************************/
+wxSize CBitmapDropDown::HandleDrawItemInternal(wxDC& dc, const wxRect& Rect, INT32 item, INT32 flags, BOOL Draw)
+{
+	const INT32 ciBorderSize = 2;
+	const INT32 ciInterval	 = 6;
+
+
+	if (CCamApp::IsDisabled())			// Inside an error handler
+		return (wxDefaultSize);
+
+//	wxOwnerDrawnComboBox* pGadget = GetBox();
+
+//	if ((INT32)pInfo->itemID == -1 || (INT32)pInfo->itemData == -1)	// Draw item -1: just exit
+//		return(FALSE);
+
+	void* pvItemData = GetItemData(item);
+	
+	// Determine if it is a divider item
+	if (!pvItemData)
+	{
+		// It's a divider, so draw it specially - it is a simple black line across the center of the rectangle
+		if (Draw)
+		{
+			wxCoord midpoint = Rect.GetTop()+Rect.GetHeight()/2;
+			wxPen OldPen=dc.GetPen();
+			dc.SetPen(wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)));
+			dc.DrawLine(Rect.GetLeft(), midpoint, Rect.GetRight()+1, midpoint);
+			dc.SetPen(OldPen);
+		}
+		return(wxSize(-1,5));
+	}
+
+//	CBDDItemInfo* pItemInfo = reinterpret_cast<CBDDItemInfo*>(pvItemData);
+
+	if (!Draw)
+	{
+		// The item height is the icon height, if any. We don't shrink the icon.
+		// If there's no icon, the height is the text height.
+		wxRect rcDummy(-1, -1, -1, -1);
+
+		// Obtain the icon size.
+		wxSize szIcon(0, 0);
+		if (HasIcon(pvItemData))
+			szIcon = DrawIcon(dc, rcDummy, item, flags, FALSE);
+
+		// Obtain the text size.
+		wxSize szText(0, 0);
+		if (HasText(pvItemData))
+			szText = DrawText(pvItemData, dc, rcDummy, item, flags, FALSE);
+
+		wxSize szItem;
+		szItem.y = max(szText.y, szIcon.y);
+		szItem.x = szIcon.x + szText.x;
+
+		// If both text and icon exist, there should be an interval between them
+		if (HasIcon(pvItemData) && HasText(pvItemData))
+			szItem.x += ciInterval;
+
+		// Add a border.
+		szItem.x += 2*ciBorderSize;
+		szItem.y += 2*ciBorderSize;
+
+		return szItem;
+	}
+
+
+
+	wxRect rcTemp = Rect;
+	rcTemp.Deflate(ciBorderSize);
+
+	wxPalette* popalOld = NULL;
+
+	// Draw the icon, if any.
+	if (HasIcon(pvItemData))
+	{
+		if (PaletteManager::UsePalette())
+			popalOld = PaletteManager::StartPaintPalette(&dc);
+
+		wxSize szIcon = DrawIcon(dc, rcTemp, item, flags, TRUE);
+
+		// Calculate the text size.
+		INT32 iShift = szIcon.x + ciInterval;
+		rcTemp.Offset(iShift, 0);
+		
+		INT32 iNewWidth = rcTemp.GetWidth() - ciInterval;
+		rcTemp.SetWidth(iNewWidth < 1 ? 1 : iNewWidth);
+	}
+
+
+	
+	if (HasText(pvItemData))
+		DrawText(pvItemData, dc, rcTemp, item, flags, TRUE);
+
+	// Restore the DC's previous palette if we selected our one in
+	if (popalOld)
+		PaletteManager::StopPaintPalette(&dc, popalOld);
+
+	return(wxDefaultSize);
+}
+
+
+/******************************************************************************
+Function  : CBitmapDropDown::DrawIcon
+Author    : Mikhail Tatarnikov
+Purpose   : Draws item icon
+Returns   : wxSize - the icon size
+Exceptions: 
+Parameters: [in] wxDC& dc			- device context to draw to;
+            [in] const wxRect& Rect - the clipping area for the item;
+            [in] INT32 item			- item index;
+            [in] INT32 flags		- flags (see odcombo.h, the only specified flag at the
+									  moment of writing is wxCP_PAINTING_CONTROL);
+            [in] BOOL  Draw			- TRUE if we should draw, FALSE in case of size measurement.
+Notes     : 
+******************************************************************************/
+wxSize CBitmapDropDown::DrawIcon(wxDC& dc, const wxRect& rcIcon, INT32 item, INT32 flags, BOOL Draw)
+{
+//	wxBitmap * pBitmap = CamArtProvider::Get()->FindBitmap(BitmapID, (CamArtFlags)(CAF_DEFAUL T| (Disabled?CAF_GREYED:0)));
+	wxSize szBitmap(0, 0);
+	
+	void* pvItemData = GetItemData(item);
+	CBDDItemInfo* pItemInfo = reinterpret_cast<CBDDItemInfo*>(pvItemData);
+
+	wxBitmap* pBitmap = CamArtProvider::Get()->FindBitmap(pItemInfo->GetBitmapID(), CAF_DEFAULT);
+	if (!pBitmap)
+		return szBitmap;
+
+	szBitmap.x = pBitmap->GetWidth();
+	szBitmap.y = pBitmap->GetHeight();
+
+	if (Draw)
+	{
+		dc.DrawBitmap(*pBitmap, rcIcon.GetLeft(), rcIcon.GetTop(), TRUE);
+/*		
+		// Calculate the destination bitmap size (the bitmap can be bigger than the draw rect, so
+		// we need to shrink it.
+		wxSize szDestination;
+		szDestination.x = min(szBitmap.x, rcIcon.GetWidth());
+		szDestination.y = min(szBitmap.y, rcIcon.GetHeight());
+		
+		wxMemoryDC dcMem;
+		dcMem.SelectObject(*pBitmap);
+
+		dc.Blit(rcIcon.GetLeft(), rcIcon.GetTop(), szDestination.x, szDestination.y, &dcMem, 0, 0);
+*/
+	}
+	return szBitmap;
+}
+
+
+/******************************************************************************
+Function  : CBitmapDropDown::SetUnselectedIntem
+Author    : Mikhail Tatarnikov
+Purpose   : Sets the information for "unselected item"
+Returns   : void
+Exceptions: 
+Parameters: [in] UINT32		uiBitmapID - the "unselected" item bitmap;
+            [in] String_256 strText	   - label for the item.
+Notes     : These bitmap and label will be drawn when no item is selected
+			(by default nothing is drawn)
+******************************************************************************/
+void CBitmapDropDown::SetUnselectedIntem(UINT32 uiBitmapID, String_256 strText)
+{
+	m_oUnselectedItemInfo = CBDDItemInfo(uiBitmapID, strText);
+}
+
Index: Trunk/XaraLX/wxOil/bitmapdropdown.h
===================================================================
--- Trunk/XaraLX/wxOil/bitmapdropdown.h	(revision 0)
+++ Trunk/XaraLX/wxOil/bitmapdropdown.h	(revision 1387)
@@ -0,0 +1,247 @@
+// $Id: coldrop.h 1052 2006-05-15 14:19:14Z alex $
+/* @@tag:xara-cn@@ DO NOT MODIFY THIS LINE
+================================XARAHEADERSTART===========================
+ 
+               Xara LX, a vector drawing and manipulation program.
+                    Copyright (C) 1993-2006 Xara Group Ltd.
+       Copyright on certain contributions may be held in joint with their
+              respective authors. See AUTHORS file for details.
+
+LICENSE TO USE AND MODIFY SOFTWARE
+----------------------------------
+
+This file is part of Xara LX.
+
+Xara LX is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 2 as published
+by the Free Software Foundation.
+
+Xara LX and its component source files are distributed in the hope
+that it will be useful, but WITHOUT ANY WARRANTY; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with Xara LX (see the file GPL in the root directory of the
+distribution); if not, write to the Free Software Foundation, Inc., 51
+Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+
+
+ADDITIONAL RIGHTS
+-----------------
+
+Conditional upon your continuing compliance with the GNU General Public
+License described above, Xara Group Ltd grants to you certain additional
+rights. 
+
+The additional rights are to use, modify, and distribute the software
+together with the wxWidgets library, the wxXtra library, and the "CDraw"
+library and any other such library that any version of Xara LX relased
+by Xara Group Ltd requires in order to compile and execute, including
+the static linking of that library to XaraLX. In the case of the
+"CDraw" library, you may satisfy obligation under the GNU General Public
+License to provide source code by providing a binary copy of the library
+concerned and a copy of the license accompanying it.
+
+Nothing in this section restricts any of the rights you have under
+the GNU General Public License.
+
+
+SCOPE OF LICENSE
+----------------
+
+This license applies to this program (XaraLX) and its constituent source
+files only, and does not necessarily apply to other Xara products which may
+in part share the same code base, and are subject to their own licensing
+terms.
+
+This license does not apply to files in the wxXtra directory, which
+are built into a separate library, and are subject to the wxWindows
+license contained within that directory in the file "WXXTRA-LICENSE".
+
+This license does not apply to the binary libraries (if any) within
+the "libs" directory, which are subject to a separate license contained
+within that directory in the file "LIBS-LICENSE".
+
+
+ARRANGEMENTS FOR CONTRIBUTION OF MODIFICATIONS
+----------------------------------------------
+
+Subject to the terms of the GNU Public License (see above), you are
+free to do whatever you like with your modifications. However, you may
+(at your option) wish contribute them to Xara's source tree. You can
+find details of how to do this at:
+  http://www.xaraxtreme.org/developers/
+
+Prior to contributing your modifications, you will need to complete our
+contributor agreement. This can be found at:
+  http://www.xaraxtreme.org/developers/contribute/
+
+Please note that Xara will not accept modifications which modify any of
+the text between the start and end of this header (marked
+XARAHEADERSTART and XARAHEADEREND).
+
+
+MARKS
+-----
+
+Xara, Xara LX, Xara X, Xara X/Xtreme, Xara Xtreme, the Xtreme and Xara
+designs are registered or unregistered trademarks, design-marks, and/or
+service marks of Xara Group Ltd. All rights in these marks are reserved.
+
+
+      Xara Group Ltd, Gaddesden Place, Hemel Hempstead, HP2 6EX, UK.
+                        http://www.xara.com/
+
+=================================XARAHEADEREND============================
+ */
+
+// coldrop.h - The Colour Drop-down list support class
+
+#ifndef BITMAPDROPDOWN_H
+#define BITMAPDROPDOWN_H
+
+#include "dropdown.h"
+//#include "gbrush.h"
+//#include "pump.h"
+
+
+
+/*************************************************************************
+Class         : wxCamBitmapDropdownPopup 
+Base Class    : public wxCamVListBoxComboPopu
+Author        : Mikhail Tatarnikov
+Description   : Represents popup list for the bitmap control.
+Pure Virtual  : No
+Known Issues  : None
+Usage Notes   : Required to specify size of the list - if the bitmap is smaller
+				then the control width, the dropdown should be of the bitmap size.
+				Also the "unselected" item should be painted separately.
+Override Notes: None
+**************************************************************************/
+class wxCamBitmapDropdownPopup : public wxCamVListBoxComboPopup
+{
+public:
+	wxCamBitmapDropdownPopup(DropDown * pDropDown=NULL) :
+		wxCamVListBoxComboPopup(pDropDown)
+	{
+	} 
+	
+	// Redraws the combo control itself.
+    virtual void PaintComboControl(wxDC& dc, const wxRect& rect);
+
+
+	// Calculates the dropdown size. We need to override it to allow the dropdown list to have smaller
+	// width that the cobobox itself (in  case we have images only).
+    virtual wxSize GetAdjustedSize(int minWidth, int prefHeight, int maxHeight);
+};
+
+
+
+/*************************************************************************
+Class         : CBDDItemInfo 
+Base Class    : none
+Author        : Mikhail Tatarnikov
+Description   : Item information for Bitmap Dropdown control.
+Pure Virtual  : No
+Known Issues  : None
+Usage Notes   : We need two separate fields for text, since the base DropDown class
+				identifies items by their text. So, if all items have no string, they are
+				considered the same, and as result some operations (like SetSelection)
+				work incorrectly.
+Override Notes: None
+**************************************************************************/
+class CBDDItemInfo
+{
+public:
+	CBDDItemInfo();
+	CBDDItemInfo(UINT32 uiBitmapResID, String_256 strText);
+
+	// Accessors
+	UINT32	   GetBitmapID();
+	BOOL	   HasText();
+	String_256 GetText();
+
+	const CBDDItemInfo& operator=(const CBDDItemInfo& rOther);
+
+protected:
+	UINT32	   m_uiBitmapResID;
+	BOOL	   m_bHasText;
+	String_256 m_strText;
+};
+
+
+
+/*************************************************************************
+Class         : CBitmapDropDown 
+Base Class    : public DropDow
+Author        : Mikhail Tatarnikov
+Description   : Represents a combobox with bitmaps and text
+Pure Virtual  : No
+Known Issues  : None
+Usage Notes   : None
+Override Notes: The item data is stored in a vector and owned by this class.
+**************************************************************************/
+class CBitmapDropDown : public DropDown
+{
+friend class DialogManager;
+
+CC_DECLARE_DYNCREATE(CBitmapDropDown)
+
+// --- Kernelly section
+
+public:			// CBitmapDropDown  management
+	CBitmapDropDown();
+	virtual ~CBitmapDropDown();
+
+	virtual BOOL Init(CWindowID Window, CGadgetID Gadget);
+	
+	// Adds a new item (icon + text).
+	void AddItem(UINT32 uiBitmapResID, String_256 strText);
+	void AddDivider();
+
+	// Select an item.
+	void SetSelectedIndex(INT32 iSelectedIndex){DropDown::SetSelectedIndex(iSelectedIndex);}
+
+	// Specify the look of "unselected" item - a bitmap/text that will be drawn when no item is selected.
+	void SetUnselectedIntem(UINT32 uiBitmapID, String_256 strText);
+
+	// Deletes an existing item.
+	void DeleteItem(INT32 index);
+
+protected:
+	// Overrides item data access function.
+	void* GetItemData(INT32 iItemIndex);
+
+	// Returns TRUE if the item has an icon. Default is no icon
+	virtual BOOL HasIcon(void* pvItemData);
+	
+	// Returns TRUE if the item has a text label.
+	virtual BOOL HasText(void* pvItemData);
+	
+	virtual wxString GetText(void* pvItemData, INT32 iItem);
+	
+	// Draw the item.
+	virtual wxSize HandleDrawItemInternal(wxDC& dc, const wxRect& Rect, INT32 item, INT32 flags, BOOL Draw);
+	
+	// Draw the associated icon.
+	virtual wxSize DrawIcon(wxDC& dc, const wxRect& Rect, INT32 item, INT32 flags, BOOL Draw);
+
+protected:
+	// Items information. No need to delete item data while removing an item.
+	std::vector<CBDDItemInfo> m_vecItems;
+
+	// Information about the unselected item.
+	CBDDItemInfo m_oUnselectedItemInfo;
+
+// --- Winoily section
+
+
+};
+
+
+
+
+
+#endif	// BITMAPDROPDOWN_H
+


Xara