OSDN Git Service

Add ShellExtension icons for folder items
authorsdottaka <none@none>
Mon, 14 Jan 2013 07:26:22 +0000 (16:26 +0900)
committersdottaka <none@none>
Mon, 14 Jan 2013 07:26:22 +0000 (16:26 +0900)
ShellExtension/Resource.h
ShellExtension/ShellExtension.rc
ShellExtension/ShellExtension.vcxproj
ShellExtension/ShellExtension.vcxproj.filters
ShellExtension/WinMergeShell.cpp
ShellExtension/WinMergeShell.h

index 02059f6..c81c055 100644 (file)
 #define IDS_HELP_COMPARESAVED           109
 #define IDS_RESELECT_FIRST              110
 #define IDB_WINMERGE                    202
+#define IDB_WINMERGEDIR                 203
+#define IDB_WINMERGEPARENT              204
 
 // Next default values for new objects
 //
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        203
+#define _APS_NEXT_RESOURCE_VALUE        205
 #define _APS_NEXT_COMMAND_VALUE         32768
 #define _APS_NEXT_CONTROL_VALUE         201
 #define _APS_NEXT_SYMED_VALUE           111
index 8694289..40a5ae1 100644 (file)
@@ -304,8 +304,8 @@ END
 //\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
- FILEVERSION 1,15,0,3\r
- PRODUCTVERSION 1,15,0,3\r
+ FILEVERSION 1,15,0,4\r
+ PRODUCTVERSION 1,15,0,4\r
  FILEFLAGSMASK 0x3fL\r
 #ifdef _DEBUG\r
  FILEFLAGS 0x1L\r
@@ -323,15 +323,15 @@ BEGIN
             VALUE "Comments", "\0"\r
             VALUE "CompanyName", "http://winmerge.org\0"\r
             VALUE "FileDescription", "WinMerge Shell Integration library\0"\r
-            VALUE "FileVersion", "1.15.0.3\0"\r
+            VALUE "FileVersion", "1.15.0.4\0"\r
             VALUE "InternalName", "ShellExtension\0"\r
-            VALUE "LegalCopyright", "Copyright 2003-2010\0"\r
+            VALUE "LegalCopyright", "Copyright 2003-2013\0"\r
             VALUE "LegalTrademarks", "\0"\r
             VALUE "OLESelfRegister", "\0"\r
             VALUE "OriginalFilename", "ShellExtension.DLL\0"\r
             VALUE "PrivateBuild", "\0"\r
             VALUE "ProductName", "WinMerge Shell Integration library\0"\r
-            VALUE "ProductVersion", "1.15.0.3\0"\r
+            VALUE "ProductVersion", "1.15.0.4\0"\r
             VALUE "SpecialBuild", "\0"\r
         END\r
     END\r
@@ -357,6 +357,8 @@ IDR_WINMERGESHELL       REGISTRY                "WinMergeShell.rgs"
 //\r
 \r
 IDB_WINMERGE            BITMAP                  "WinMerge.bmp"\r
+IDB_WINMERGEDIR         BITMAP                  "WinMergeDir.bmp"\r
+IDB_WINMERGEPARENT      BITMAP                  "WinMergeParent.bmp"\r
 \r
 /////////////////////////////////////////////////////////////////////////////\r
 //\r
@@ -497,7 +499,7 @@ LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
 #ifdef _WIN32\r
 LANGUAGE LANG_GREEK, SUBLANG_DEFAULT\r
 #pragma code_page(1253)\r
-#include "Languages\\ShellExtensionGreek.rc"\r
+#include "Languages\ShellExtensionGreek.rc"\r
 #endif //_WIN32\r
 #endif\r
 \r
@@ -625,7 +627,7 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT
 #ifdef _WIN32\r
 LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT\r
 #pragma code_page(1251)\r
-#include "Languages\\ShellExtensionUkrainian.rc"\r
+#include "Languages\ShellExtensionUkrainian.rc"\r
 #endif //_WIN32\r
 #endif\r
 \r
index 30bb8cf..de3d951 100644 (file)
@@ -376,6 +376,8 @@ echo Warning : Cannot register Unicode DLL on Windows 95
     </CustomBuildStep>\r
     <CustomBuildStep Include="ShellExtensionU.def" />\r
     <None Include="WinMerge.bmp" />\r
+    <None Include="WinMergeDir.bmp" />\r
+    <None Include="WinMergeParent.bmp" />\r
     <None Include="WinMergeShell.rgs" />\r
   </ItemGroup>\r
   <ItemGroup>\r
index 0f0771b..e92491b 100644 (file)
     <None Include="WinMergeShell.rgs">\r
       <Filter>Resource Files</Filter>\r
     </None>\r
+    <None Include="WinMergeDir.bmp">\r
+      <Filter>Resource Files</Filter>\r
+    </None>\r
+    <None Include="WinMergeParent.bmp">\r
+      <Filter>Resource Files</Filter>\r
+    </None>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <Midl Include="ShellExtension.idl">\r
index 88a54a3..a71d0aa 100644 (file)
@@ -146,11 +146,17 @@ CWinMergeShell::CWinMergeShell()
        // compress or stretch icon bitmap according to menu item height
        m_MergeBmp = (HBITMAP)LoadImage(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_WINMERGE), IMAGE_BITMAP,
                        GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK), LR_DEFAULTCOLOR);
+       m_MergeDirBmp = (HBITMAP)LoadImage(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_WINMERGEDIR), IMAGE_BITMAP,
+                       GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK), LR_DEFAULTCOLOR);
+       m_MergeParentBmp = (HBITMAP)LoadImage(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_WINMERGEPARENT), IMAGE_BITMAP,
+                       GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK), LR_DEFAULTCOLOR);
 }
 
 /// Default destructor, unloads bitmap
 CWinMergeShell::~CWinMergeShell()
 {
+       DeleteObject(m_MergeParentBmp);
+       DeleteObject(m_MergeDirBmp);
        DeleteObject(m_MergeBmp);
 }
 
@@ -160,6 +166,8 @@ HRESULT CWinMergeShell::Initialize(LPCITEMIDLIST pidlFolder,
 {
        USES_WINMERGELOCALE;
        HRESULT hr = E_INVALIDARG;
+       
+       m_bParentFolder = false;
 
        // Files/folders selected normally from the explorer
        if (pDataObj)
@@ -218,20 +226,22 @@ HRESULT CWinMergeShell::Initialize(LPCITEMIDLIST pidlFolder,
                GlobalUnlock(stg.hGlobal);
                ReleaseStgMedium(&stg);
        }
-
-       // No item selected - selection is the folder background
-       if (pidlFolder)
+       else if (pidlFolder)
        {
+               // No item selected - selection is the folder background
                TCHAR szPath[MAX_PATH] = {0};
 
                if (SHGetPathFromIDList(pidlFolder, szPath))
                {
                        m_strPaths[0] = szPath;
                        m_nSelectedItems = 1;
+                       m_bParentFolder = true;
                        hr = S_OK;
                }
                else
+               {
                        hr = E_INVALIDARG;
+               }
        }
        return hr;
 }
@@ -452,8 +462,9 @@ int CWinMergeShell::DrawSimpleMenu(HMENU hmenu, UINT uMenuIndex,
        InsertMenu(hmenu, uMenuIndex, MF_BYPOSITION, uidFirstCmd, strMenu.c_str());
 
        // Add bitmap
-       if (m_MergeBmp != NULL)
-               SetMenuItemBitmaps(hmenu, uMenuIndex, MF_BYPOSITION, m_MergeBmp, NULL);
+       HBITMAP hBitmap = m_bParentFolder ? m_MergeParentBmp : (PathIsDirectory(m_strPaths[0].c_str()) ? m_MergeDirBmp : m_MergeBmp);
+       if (hBitmap != NULL)
+               SetMenuItemBitmaps(hmenu, uMenuIndex, MF_BYPOSITION, hBitmap, NULL);
 
        // Show menu item as grayed if more than two items selected
        if (m_nSelectedItems > MaxFileCount)
@@ -515,11 +526,12 @@ int CWinMergeShell::DrawAdvancedMenu(HMENU hmenu, UINT uMenuIndex,
        }
 
        // Add bitmap
-       if (m_MergeBmp != NULL)
+       HBITMAP hBitmap = m_bParentFolder ? m_MergeParentBmp : (PathIsDirectory(m_strPaths[0].c_str()) ? m_MergeDirBmp : m_MergeBmp);
+       if (hBitmap != NULL)
        {
                if (nItemsAdded == 2)
-                       SetMenuItemBitmaps(hmenu, uMenuIndex - 1, MF_BYPOSITION, m_MergeBmp, NULL);
-               SetMenuItemBitmaps(hmenu, uMenuIndex, MF_BYPOSITION, m_MergeBmp, NULL);
+                       SetMenuItemBitmaps(hmenu, uMenuIndex - 1, MF_BYPOSITION, hBitmap, NULL);
+               SetMenuItemBitmaps(hmenu, uMenuIndex, MF_BYPOSITION, hBitmap, NULL);
        }
 
        // Show menu item as grayed if more than two items selected
index 54a1040..6cc68de 100644 (file)
@@ -63,10 +63,11 @@ public:
 protected:
        String m_strPaths[3]; /**< Paths for selected items */
        String m_strPreviousPath; /**< Previously selected path */
-       HBITMAP m_MergeBmp; /**< Icon */
+       HBITMAP m_MergeBmp, m_MergeDirBmp, m_MergeParentBmp; /**< Icon */
        UINT m_nSelectedItems; /**< Amount of selected items */
        DWORD m_dwContextMenuEnabled; /**< Is context menu enabled and in which mode? */
        DWORD m_dwMenuState; /**< Shown menuitems */
+       bool m_bParentFolder;
 
        BOOL GetWinMergeDir(String &strDir);
        BOOL CheckExecutable(String path);