- #include "stdafx.h"
- //#include "p4win.h"
- #include "ImageList.h"
- #include "P4Image.h"
- #include "resource.h"
- ///////////////////////////////////////////////////////////////////////////
- // CP4ToolBarImageList
- bool CP4WinToolBarImageList::Create()
- {
- return CP4ToolBarImageList::Create(18, 16,
- IDB_TOOLBAR4, IDB_BITMAPDIS, IDB_TOOLBAR32,
- RGB(255, 0, 255));
- }
- ///////////////////////////////////////////////////////////////////////////
- // CP4ViewIconsImageList
- // SrcImages represents the actual images in TreeIcons?.bmp
- // it must be kept in sync with the bitmap.
- // note: for built up images, base images are mixed in with badges,
- // but must precede badge images so that they will be drawn first
- // and badges drawn on top of them
- enum SrcImages
- {
- SI_LAST_SIMPLE = 19,
- // base images
- SI_CLIENT,
- SI_USER,
- SI_GHOST,
- SI_TEXT,
- SI_BINARY,
- // badge images
- SI_RED_DOC_BORDER,
- SI_YOUR_EDIT,
- SI_YOUR_DELETE,
- SI_YOUR_ADD,
- SI_THEIR_ADD,
- SI_THEIR_EDIT,
- SI_THEIR_DELETE,
- SI_YOUR_LOCK,
- SI_THEIR_LOCK,
- SI_SYNCED,
- SI_NOT_SYNCED,
- SI_CUR,
- SI_DEF,
- SI_BLANK,
- // more simple images
- SI_OPENFOLDER,
- };
- // convert from CUSB enum flag to image index
- static int CUSBToImage(int badge)
- {
- static int map[][2] =
- {
- {CP4ViewImageList::CUSB_USER, SI_USER},
- {CP4ViewImageList::CUSB_CLIENT, SI_CLIENT},
- {CP4ViewImageList::CUSB_DEF, SI_DEF},
- {CP4ViewImageList::CUSB_CUR, SI_CUR},
- {-1,-1}
- };
- for(int i = 0; map[i][0] != -1; i++)
- if(map[i][0] == badge)
- return map[i][1];
- ASSERT(0);
- return 0;
- }
- // convert from FSB enum flag to image index
- static int FSBToImage(int badge)
- {
- static int map[][2] =
- {
- {CP4ViewImageList::FSB_GHOST, SI_GHOST},
- {CP4ViewImageList::FSB_TEXT, SI_TEXT},
- {CP4ViewImageList::FSB_BINARY, SI_BINARY},
- {CP4ViewImageList::FSB_YOUR_EDIT, SI_YOUR_EDIT},
- {CP4ViewImageList::FSB_YOUR_DELETE, SI_YOUR_DELETE},
- {CP4ViewImageList::FSB_YOUR_ADD, SI_YOUR_ADD},
- {CP4ViewImageList::FSB_THEIR_EDIT, SI_THEIR_EDIT},
- {CP4ViewImageList::FSB_THEIR_DELETE,SI_THEIR_DELETE},
- {CP4ViewImageList::FSB_THEIR_ADD, SI_THEIR_ADD},
- {CP4ViewImageList::FSB_YOUR_LOCK, SI_YOUR_LOCK},
- {CP4ViewImageList::FSB_THEIR_LOCK, SI_THEIR_LOCK},
- {CP4ViewImageList::FSB_SYNCED, SI_SYNCED},
- {CP4ViewImageList::FSB_NOT_SYNCED, SI_NOT_SYNCED},
- {-1,-1}
- };
- for(int i = 0; map[i][0] != -1; i++)
- if(map[i][0] == badge)
- return map[i][1];
- ASSERT(0);
- return 0;
- }
- // lookup tables for finding an icon given it's state mask
- static unsigned short fileMap[2 << CP4ViewImageList::FSB_NUM_BITS];
- static unsigned short cuMap[2 << CP4ViewImageList::CUSB_NUM_BITS];
- // return composite image index for client/user (CUSB) state flags
- int CP4ViewImageList::GetCUIndex(int state)
- {
- int result = cuMap[state];
- ASSERT(result); // illegal combination state bits
- return result;
- }
- // return image index for client with specified attributes
- int CP4ViewImageList::GetClientIndex(bool isCurrent, bool isDefault)
- {
- return GetCUIndex(CUSB_CLIENT |
- (isDefault ? CUSB_DEF : 0) |
- (isCurrent ? CUSB_CUR : 0));
- }
- // return image index for user with specified attributes
- int CP4ViewImageList::GetUserIndex(bool isCurrent, bool isDefault)
- {
- return GetCUIndex(CUSB_USER |
- (isDefault ? CUSB_DEF : 0) |
- (isCurrent ? CUSB_CUR : 0));
- }
- // return composite image index for file state (FSB) flags
- int CP4ViewImageList::GetFileIndex(int state)
- {
- int result = fileMap[state];
- ASSERT(result); // illegal combination state bits
- return result;
- }
- // create a composite client or user image
- static void AddCUImage(CP4Image &dst, CP4Image &src, int &x, int layers)
- {
- ASSERT(layers);
- ASSERT(x/24 < 0x10000);
- cuMap[layers] = (unsigned short)(x / 24);
- int mask = 1;
- while(layers)
- {
- if(layers & 1)
- {
- int img = CUSBToImage(mask);
- dst.BlendImage(x/24, src, img);
- }
- layers >>= 1;
- mask <<= 1;
- }
- x += 24;
- }
- // create a composite file image
- static void AddFileImage(CP4Image &dst, CP4Image &src, int &x, int layers)
- {
- ASSERT(layers);
- ASSERT(x/24 < 0x10000);
- fileMap[layers] = (unsigned short)(x / 24);
- bool red = (layers & CP4ViewImageList::FSB_YOUR_ADD) &&
- (layers & CP4ViewImageList::FSB_THEIR_ADD);
- int mask = 1;
- while(layers)
- {
- if(layers & 1)
- {
- int img = FSBToImage(mask);
- dst.BlendImage(x/24, src, img);
- // special case to get red border when you're not the
- // only one to have a file open for add
- if(red)
- dst.BlendImage(x/24, src, SI_RED_DOC_BORDER);
- red = false;
- }
- layers >>= 1;
- mask <<= 1;
- }
- x += 24;
- }
- // add a group of file images with non-add actions
- static void AddFileImageSync(CP4Image &dst, CP4Image &src, int &x, int base)
- {
- AddFileImage(dst, src, x, base);
- AddFileImage(dst, src, x, base | CP4ViewImageList::FSB_SYNCED);
- AddFileImage(dst, src, x, base | CP4ViewImageList::FSB_NOT_SYNCED);
- }
- static void AddFileImageLock(CP4Image &dst, CP4Image &src, int &x, int base)
- {
- AddFileImageSync(dst, src, x, base);
- AddFileImageSync(dst, src, x, base | CP4ViewImageList::FSB_YOUR_LOCK);
- AddFileImageSync(dst, src, x, base | CP4ViewImageList::FSB_THEIR_LOCK);
- }
- static void AddFileImageTheirAction(CP4Image &dst, CP4Image &src, int &x, int base)
- {
- AddFileImageLock(dst, src, x, base);
- AddFileImageLock(dst, src, x, base | CP4ViewImageList::FSB_THEIR_DELETE);
- AddFileImageLock(dst, src, x, base | CP4ViewImageList::FSB_THEIR_ADD);
- AddFileImageLock(dst, src, x, base | CP4ViewImageList::FSB_THEIR_EDIT);
- }
- static void AddFileImageYourAction(CP4Image &dst, CP4Image &src, int &x, int base)
- {
- AddFileImageTheirAction(dst, src, x, base);
- AddFileImageTheirAction(dst, src, x, base | CP4ViewImageList::FSB_YOUR_DELETE);
- AddFileImageTheirAction(dst, src, x, base | CP4ViewImageList::FSB_YOUR_ADD);
- AddFileImageTheirAction(dst, src, x, base | CP4ViewImageList::FSB_YOUR_EDIT);
- }
- static void AddFileImageType(CP4Image &dst, CP4Image &src, int &x, int base)
- {
- AddFileImageYourAction(dst, src, x, base | CP4ViewImageList::FSB_BINARY);
- AddFileImageYourAction(dst, src, x, base | CP4ViewImageList::FSB_TEXT);
- }
- // create the bitmap containing both simple and composite images
- void CP4ViewImageList::MakeBitmap(CP4Image &dst, CP4Image &src, COLORREF bg)
- {
- // first, set the whole thing to the background color
- dst.FillImage(bg);
- // next, just copy over the first segment of simple images
- int i;
- for(i = 0; i <= SI_LAST_SIMPLE; i++)
- dst.BlendImage(i, src, i);
- // add open folder icon
- dst.BlendImage(i++, src, SI_OPENFOLDER);
- // create the unresolved pending chglist ones
- dst.BlendImage(i, src, CP4ViewImageList::VI_YOURCHANGE);
- dst.BlendImage(i++, src, SI_NOT_SYNCED);
- dst.BlendImage(i, src, CP4ViewImageList::VI_YOUROTHERCHANGE);
- dst.BlendImage(i++, src, SI_NOT_SYNCED);
- int x = i * 24;
- // copy client, plus badges
- AddCUImage(dst, src, x, CUSB_CLIENT);
- AddCUImage(dst, src, x, CUSB_CLIENT | CUSB_CUR);
- AddCUImage(dst, src, x, CUSB_CLIENT | CUSB_DEF);
- AddCUImage(dst, src, x, CUSB_CLIENT | CUSB_CUR | CUSB_DEF);
- // copy user, plus badges
- AddCUImage(dst, src, x, CUSB_USER);
- AddCUImage(dst, src, x, CUSB_USER | CUSB_CUR);
- AddCUImage(dst, src, x, CUSB_USER | CUSB_DEF);
- AddCUImage(dst, src, x, CUSB_USER | CUSB_CUR | CUSB_DEF);
- // create all file images except the wierd one
- AddFileImageType(dst, src, x, 0);
- // create the wierd file one
- AddFileImage(dst, src, x, FSB_GHOST | FSB_SYNCED);
- }
- bool CP4ViewImageList::Create()
- {
- // determine width required for bitmap
- int w = 24 *
- (SI_LAST_SIMPLE + 1 + // simple (non-composite) images
- 4 + // user + cur/def
- 4 + // client + cur/def
- 2 * // file types: binary, text
- 4 * // your action: none, add, edit, delete
- 4 * // their action: none, add, edit, delete
- 3 * // lock states: none, yours, theirs
- 3 + // sync states: none, synced, not synced
- 1 + // wierd ghost combo
- 1 + // open folder
- 2 ); // 2 unresolved pending chglists
- CDC dc;
- dc.CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
- m_colorDepth = dc.GetDeviceCaps(BITSPIXEL);
- if (m_colorDepth >= 16 && !m_use256ColorIcons)
- {
- // at least 16-bit color, so create a device dependent bitmap
- // using 32-bit rgba source bitmap
- if(!CImageList::Create(24, 16, ILC_COLOR32|ILC_MASK, 5, 0))
- return false;
- CP4ImageDib src(24);
- CP4ImageDib dst(24);
- if(src.Load(IDB_VIEWICONS32))
- {
- src.PreMultiplyAlpha();
- dst.Create(w, 16);
- MakeBitmap(dst, src, GetSysColor(COLOR_WINDOW));
- CBitmap *bmp = dst.CreateDDB(dc);
- if(bmp)
- Add(bmp, GetSysColor(COLOR_WINDOW));
- return true;
- }
- // something didn't work out, so fall through and use 16 colors
- }
- // 256 or fewer colors device, so use 16 color bitmap
- if(!CImageList::Create(24, 16, ILC_COLOR4|ILC_MASK, 5, 0))
- return false;
- // use magenta for background; it will be transparent
- // (using non-transparent COLOR_WINDOW background fails
- // sometimes in 256 color mode)
- COLORREF magenta = RGB(255,0,255);
- CP4Image16 src(magenta, 24);
- CP4Image16 dst(magenta, 24);
- if(src.Load(IDB_VIEWICONS4) && dst.Create(dc, w, 16))
- {
- src.StartBlendingSource();
- dst.StartBlendingDest(dc);
- MakeBitmap(dst, src, magenta);
- dst.EndBlendingDest();
- src.EndBlendingSource();
- CBitmap *bmp = dst.CreateDDB(dc);
- if(bmp)
- Add(bmp, magenta);
- m_colorDepth = 4;
- return true;
- }
- return false;
- }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 19924 | YourUncleBob |
Populate -o //guest/perforce_software/p4win/... //guest/YourUncleBob/p4win/..... |
9 years ago | |
//guest/perforce_software/p4win/main/gui/ImageList.cpp | |||||
#1 | 16169 | perforce_software | Move files to follow new path scheme for branches. | 9 years ago | |
//guest/perforce_software/p4win/gui/ImageList.cpp | |||||
#1 | 8562 | Matt Attaway | These feet never stop running. Initial commit of the P4Win source code. To the be...st of our knowledge this compiles and runs using the 2013.3 P4 API and VS 2010. Expect a few changes as we refine the build process. Please post any build issues to the forums. « |
11 years ago |