[RAPPS] Make selection global

- Added a 'Selected for installation' category that shows what was selected.
  Selection is now kept between categories.
- New string is added to resources.
  ru-RU.rc and uk-UA.rc strings are translated.
CORE-13789
This commit is contained in:
Alexander Shaposhnikov 2018-01-02 22:45:59 +02:00
parent 06abd3b480
commit 58f8fa9ec8
No known key found for this signature in database
GPG key ID: 2BC6459908479EFC
27 changed files with 92 additions and 19 deletions

View file

@ -19,12 +19,9 @@
// CAvailableApplicationInfo // CAvailableApplicationInfo
CAvailableApplicationInfo::CAvailableApplicationInfo(const ATL::CStringW& sFileNameParam) CAvailableApplicationInfo::CAvailableApplicationInfo(const ATL::CStringW& sFileNameParam)
: m_IsInstalled(FALSE), m_HasLanguageInfo(FALSE), m_HasInstalledVersion(FALSE) : m_IsSelected(FALSE), m_LicenseType(LICENSE_NONE), m_sFileName(sFileNameParam),
m_IsInstalled(FALSE), m_HasLanguageInfo(FALSE), m_HasInstalledVersion(FALSE)
{ {
m_LicenseType = LICENSE_NONE;
m_sFileName = sFileNameParam;
RetrieveGeneralInfo(); RetrieveGeneralInfo();
} }
@ -355,17 +352,15 @@ BOOL CAvailableApps::Enum(INT EnumType, AVAILENUMPROC lpEnumProc)
m_InfoList.AddTail(Info); m_InfoList.AddTail(Info);
skip_if_cached: skip_if_cached:
if (Info->m_Category == FALSE) if (EnumType == Info->m_Category
continue; || EnumType == ENUM_ALL_AVAILABLE
|| (EnumType == ENUM_CAT_SELECTED && Info->m_IsSelected))
if (EnumType != Info->m_Category && EnumType != ENUM_ALL_AVAILABLE) {
continue;
Info->RefreshAppInfo(); Info->RefreshAppInfo();
if (lpEnumProc) if (lpEnumProc)
lpEnumProc(Info, m_Strings.szAppsPath.GetString()); lpEnumProc(Info, m_Strings.szAppsPath.GetString());
}
} while (FindNextFileW(hFind, &FindFileData) != 0); } while (FindNextFileW(hFind, &FindFileData) != 0);
FindClose(hFind); FindClose(hFind);
@ -407,6 +402,23 @@ ATL::CSimpleArray<CAvailableApplicationInfo> CAvailableApps::FindInfoList(const
return result; return result;
} }
ATL::CSimpleArray<CAvailableApplicationInfo> CAvailableApps::GetSelected() const
{
ATL::CSimpleArray<CAvailableApplicationInfo> result;
POSITION CurrentListPosition = m_InfoList.GetHeadPosition();
CAvailableApplicationInfo* Info;
while (CurrentListPosition != NULL)
{
Info = m_InfoList.GetNext(CurrentListPosition);
if (Info->m_IsSelected)
{
result.Add(*Info);
}
}
return result;
}
const ATL::CStringW& CAvailableApps::GetFolderPath() const const ATL::CStringW& CAvailableApps::GetFolderPath() const
{ {
return m_Strings.szPath; return m_Strings.szPath;

View file

@ -542,6 +542,30 @@ public:
if (bHasCheckboxes) if (bHasCheckboxes)
{ {
SetItemState(item, INDEXTOSTATEIMAGEMASK((fCheck) ? 2 : 1), LVIS_STATEIMAGEMASK); SetItemState(item, INDEXTOSTATEIMAGEMASK((fCheck) ? 2 : 1), LVIS_STATEIMAGEMASK);
SetSelected(item, fCheck);
}
}
VOID SetSelected(INT item, BOOL value)
{
if (item < 0)
{
for (INT i = 0; i >= 0; i = GetNextItem(i, LVNI_ALL))
{
CAvailableApplicationInfo* pAppInfo = (CAvailableApplicationInfo*) GetItemData(i);
if (pAppInfo)
{
pAppInfo->m_IsSelected = value;
}
}
}
else
{
CAvailableApplicationInfo* pAppInfo = (CAvailableApplicationInfo*) GetItemData(item);
if (pAppInfo)
{
pAppInfo->m_IsSelected = value;
}
} }
} }
@ -735,6 +759,8 @@ private:
AddCategory(hRootItemInstalled, IDS_APPLICATIONS, IDI_APPS); AddCategory(hRootItemInstalled, IDS_APPLICATIONS, IDI_APPS);
AddCategory(hRootItemInstalled, IDS_UPDATES, IDI_APPUPD); AddCategory(hRootItemInstalled, IDS_UPDATES, IDI_APPUPD);
AddCategory(TVI_ROOT, IDS_SELECTEDFORINST, IDI_SELECTEDFORINST);
hRootItemAvailable = AddCategory(TVI_ROOT, IDS_AVAILABLEFORINST, IDI_CATEGORY); hRootItemAvailable = AddCategory(TVI_ROOT, IDS_AVAILABLEFORINST, IDI_CATEGORY);
AddCategory(hRootItemAvailable, IDS_CAT_AUDIO, IDI_CAT_AUDIO); AddCategory(hRootItemAvailable, IDS_CAT_AUDIO, IDI_CAT_AUDIO);
AddCategory(hRootItemAvailable, IDS_CAT_VIDEO, IDI_CAT_VIDEO); AddCategory(hRootItemAvailable, IDS_CAT_VIDEO, IDI_CAT_VIDEO);
@ -1081,6 +1107,10 @@ private:
case IDS_CAT_VIDEO: case IDS_CAT_VIDEO:
UpdateApplicationsList(ENUM_CAT_VIDEO); UpdateApplicationsList(ENUM_CAT_VIDEO);
break; break;
case IDS_SELECTEDFORINST:
UpdateApplicationsList(ENUM_CAT_SELECTED);
break;
} }
} }
@ -1153,7 +1183,7 @@ private:
/* Check if the item is checked */ /* Check if the item is checked */
if ((pnic->uNewState & LVIS_STATEIMAGEMASK) && !bUpdating) if ((pnic->uNewState & LVIS_STATEIMAGEMASK) && !bUpdating)
{ {
BOOL checked = ListView_GetCheckState(pnic->hdr.hwndFrom, pnic->iItem); BOOL checked = m_ListView->GetCheckState(pnic->iItem);
/* FIXME: HAX! /* FIXME: HAX!
- preventing decremention below zero as a safeguard for ReactOS - preventing decremention below zero as a safeguard for ReactOS
In ReactOS this action is triggered whenever user changes *selection*, but should be only when *checkbox* state toggled In ReactOS this action is triggered whenever user changes *selection*, but should be only when *checkbox* state toggled
@ -1165,6 +1195,10 @@ private:
: ((nSelectedApps > 0) : ((nSelectedApps > 0)
? -1 ? -1
: 0); : 0);
/* Update item's selection status */
m_ListView->SetSelected(pnic->iItem, checked);
UpdateStatusBarText(); UpdateStatusBarText();
} }
} }
@ -1399,7 +1433,7 @@ private:
{ {
if (nSelectedApps > 0) if (nSelectedApps > 0)
{ {
CDownloadManager::DownloadListOfApplications(m_ListView->GetCheckedItems()); CDownloadManager::DownloadListOfApplications(m_AvailableApps.GetSelected());
UpdateApplicationsList(-1); UpdateApplicationsList(-1);
} }
else if (CDownloadManager::DownloadApplication(m_ListView->GetSelectedData())) else if (CDownloadManager::DownloadApplication(m_ListView->GetSelectedData()))
@ -1541,6 +1575,7 @@ private:
ListView_SetItemText(hListView, Index, 1, const_cast<LPWSTR>(Info->m_szVersion.GetString())); ListView_SetItemText(hListView, Index, 1, const_cast<LPWSTR>(Info->m_szVersion.GetString()));
ListView_SetItemText(hListView, Index, 2, const_cast<LPWSTR>(Info->m_szDesc.GetString())); ListView_SetItemText(hListView, Index, 2, const_cast<LPWSTR>(Info->m_szDesc.GetString()));
ListView_SetCheckState(hListView, Index, Info->m_IsSelected);
return TRUE; return TRUE;
} }
@ -1565,7 +1600,6 @@ private:
bUpdating = TRUE; bUpdating = TRUE;
m_ListView->SetRedraw(FALSE); m_ListView->SetRedraw(FALSE);
nSelectedApps = 0;
if (EnumType < 0) if (EnumType < 0)
{ {
EnumType = SelectedEnumType; EnumType = SelectedEnumType;

View file

@ -25,6 +25,7 @@ inline BOOL IsLicenseType(INT x)
struct CAvailableApplicationInfo struct CAvailableApplicationInfo
{ {
INT m_Category; INT m_Category;
BOOL m_IsSelected;
LicenseType m_LicenseType; LicenseType m_LicenseType;
ATL::CStringW m_szName; ATL::CStringW m_szName;
ATL::CStringW m_szRegName; ATL::CStringW m_szRegName;
@ -106,6 +107,7 @@ public:
CAvailableApplicationInfo* FindInfo(const ATL::CStringW& szAppName) const; CAvailableApplicationInfo* FindInfo(const ATL::CStringW& szAppName) const;
ATL::CSimpleArray<CAvailableApplicationInfo> FindInfoList(const ATL::CSimpleArray<ATL::CStringW> &arrAppsNames) const; ATL::CSimpleArray<CAvailableApplicationInfo> FindInfoList(const ATL::CSimpleArray<ATL::CStringW> &arrAppsNames) const;
ATL::CSimpleArray<CAvailableApplicationInfo> GetSelected() const;
const ATL::CStringW& GetFolderPath() const; const ATL::CStringW& GetFolderPath() const;
const ATL::CStringW& GetAppPath() const; const ATL::CStringW& GetAppPath() const;

View file

@ -50,13 +50,14 @@ enum AppsCategories
ENUM_CAT_DRIVERS, ENUM_CAT_DRIVERS,
ENUM_CAT_LIBS, ENUM_CAT_LIBS,
ENUM_CAT_OTHER, ENUM_CAT_OTHER,
ENUM_CAT_SELECTED,
ENUM_ALL_INSTALLED, ENUM_ALL_INSTALLED,
ENUM_INSTALLED_APPLICATIONS = 31, ENUM_INSTALLED_APPLICATIONS = 31,
ENUM_UPDATES = 32, ENUM_UPDATES = 32,
ENUM_INSTALLED_MIN = ENUM_ALL_INSTALLED, ENUM_INSTALLED_MIN = ENUM_ALL_INSTALLED,
ENUM_INSTALLED_MAX = ENUM_UPDATES, ENUM_INSTALLED_MAX = ENUM_UPDATES,
ENUM_AVAILABLE_MIN = ENUM_ALL_AVAILABLE, ENUM_AVAILABLE_MIN = ENUM_ALL_AVAILABLE,
ENUM_AVAILABLE_MAX = ENUM_CAT_OTHER, ENUM_AVAILABLE_MAX = ENUM_CAT_SELECTED,
}; };
inline BOOL IsAvailableEnum(INT x) inline BOOL IsAvailableEnum(INT x)

View file

@ -13,6 +13,7 @@
#define IDI_CATEGORY 19 #define IDI_CATEGORY 19
#define IDI_UPDATE_DB 20 #define IDI_UPDATE_DB 20
#define IDI_CHECK_ALL 21 #define IDI_CHECK_ALL 21
#define IDI_SELECTEDFORINST 22
/* Icons for categories */ /* Icons for categories */
#define IDI_CAT_AUDIO 50 #define IDI_CAT_AUDIO 50
@ -108,6 +109,7 @@
#define IDS_SELECT_ALL 126 #define IDS_SELECT_ALL 126
#define IDS_INSTALL_SELECTED 127 #define IDS_INSTALL_SELECTED 127
#define IDS_UNABLE_TO_INSTALL 128 #define IDS_UNABLE_TO_INSTALL 128
#define IDS_SELECTEDFORINST 129
/* Tooltips */ /* Tooltips */
#define IDS_TOOLTIP_INSTALL 200 #define IDS_TOOLTIP_INSTALL 200

View file

@ -214,6 +214,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity." IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
IDS_SELECT_ALL "Select/Deselect All" IDS_SELECT_ALL "Select/Deselect All"
IDS_INSTALL_SELECTED "Install Selected" IDS_INSTALL_SELECTED "Install Selected"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -215,6 +215,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity." IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
IDS_SELECT_ALL "Select/Deselect All" IDS_SELECT_ALL "Select/Deselect All"
IDS_INSTALL_SELECTED "Install Selected" IDS_INSTALL_SELECTED "Install Selected"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -210,6 +210,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Schreibfehler. Prüfen Sie die Kapazität des Datenträgers!" IDS_UNABLE_TO_WRITE "Schreibfehler. Prüfen Sie die Kapazität des Datenträgers!"
IDS_SELECT_ALL "Alle/Keine" IDS_SELECT_ALL "Alle/Keine"
IDS_INSTALL_SELECTED "Ausgewählte Installieren" IDS_INSTALL_SELECTED "Ausgewählte Installieren"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -210,6 +210,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity." IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
IDS_SELECT_ALL "Select/Deselect All" IDS_SELECT_ALL "Select/Deselect All"
IDS_INSTALL_SELECTED "Install Selected" IDS_INSTALL_SELECTED "Install Selected"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -213,6 +213,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "No se ha podido escribir en el disco duro, es posible que no quede espacio libre." IDS_UNABLE_TO_WRITE "No se ha podido escribir en el disco duro, es posible que no quede espacio libre."
IDS_SELECT_ALL "Select/Deselect All" IDS_SELECT_ALL "Select/Deselect All"
IDS_INSTALL_SELECTED "Install Selected" IDS_INSTALL_SELECTED "Install Selected"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -210,6 +210,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Impossible d'écrire sur le disque. Votre disque pourrait être plein." IDS_UNABLE_TO_WRITE "Impossible d'écrire sur le disque. Votre disque pourrait être plein."
IDS_SELECT_ALL "Sélectionner/Désélectionner tout" IDS_SELECT_ALL "Sélectionner/Désélectionner tout"
IDS_INSTALL_SELECTED "Installer les sélectionnés" IDS_INSTALL_SELECTED "Installer les sélectionnés"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -212,6 +212,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity." IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
IDS_SELECT_ALL "Select/Deselect All" IDS_SELECT_ALL "Select/Deselect All"
IDS_INSTALL_SELECTED "Install Selected" IDS_INSTALL_SELECTED "Install Selected"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -210,6 +210,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Impossibile scrivere su disco: lo spazio libero potrebbe essere esaurito." IDS_UNABLE_TO_WRITE "Impossibile scrivere su disco: lo spazio libero potrebbe essere esaurito."
IDS_SELECT_ALL "Seleziona/Deseleziona Tutte" IDS_SELECT_ALL "Seleziona/Deseleziona Tutte"
IDS_INSTALL_SELECTED "Installa le selezionate" IDS_INSTALL_SELECTED "Installa le selezionate"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -210,6 +210,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity." IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
IDS_SELECT_ALL "Select/Deselect All" IDS_SELECT_ALL "Select/Deselect All"
IDS_INSTALL_SELECTED "Install Selected" IDS_INSTALL_SELECTED "Install Selected"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -209,6 +209,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity." IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
IDS_SELECT_ALL "Select/Deselect All" IDS_SELECT_ALL "Select/Deselect All"
IDS_INSTALL_SELECTED "Install Selected" IDS_INSTALL_SELECTED "Install Selected"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -218,6 +218,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Nie można zapisać na dysku. Dysk może być pełny." IDS_UNABLE_TO_WRITE "Nie można zapisać na dysku. Dysk może być pełny."
IDS_SELECT_ALL "Zaznacz/Odznacz Wszystko" IDS_SELECT_ALL "Zaznacz/Odznacz Wszystko"
IDS_INSTALL_SELECTED "Instaluj Zaznaczone" IDS_INSTALL_SELECTED "Instaluj Zaznaczone"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -212,6 +212,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity." IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
IDS_SELECT_ALL "Select/Deselect All" IDS_SELECT_ALL "Select/Deselect All"
IDS_INSTALL_SELECTED "Install Selected" IDS_INSTALL_SELECTED "Install Selected"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -219,6 +219,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Eșec la scrierea pe disc. Una din cauze poate fi atingerea limitei de capacitate." IDS_UNABLE_TO_WRITE "Eșec la scrierea pe disc. Una din cauze poate fi atingerea limitei de capacitate."
IDS_SELECT_ALL "Selectează/Deselectează Toate" IDS_SELECT_ALL "Selectează/Deselectează Toate"
IDS_INSTALL_SELECTED "Instalează selecționate" IDS_INSTALL_SELECTED "Instalează selecționate"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -210,6 +210,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Не удалось записать данные на диск. Возможно, недостаточно свободного места на диске." IDS_UNABLE_TO_WRITE "Не удалось записать данные на диск. Возможно, недостаточно свободного места на диске."
IDS_SELECT_ALL "Выбрать все" IDS_SELECT_ALL "Выбрать все"
IDS_INSTALL_SELECTED "Установить выбранное" IDS_INSTALL_SELECTED "Установить выбранное"
IDS_SELECTEDFORINST "Выбрано для установки"
END END
STRINGTABLE STRINGTABLE

View file

@ -215,6 +215,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity." IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
IDS_SELECT_ALL "Select/Deselect All" IDS_SELECT_ALL "Select/Deselect All"
IDS_INSTALL_SELECTED "Install Selected" IDS_INSTALL_SELECTED "Install Selected"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -214,6 +214,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity." IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
IDS_SELECT_ALL "Select/Deselect All" IDS_SELECT_ALL "Select/Deselect All"
IDS_INSTALL_SELECTED "Install Selected" IDS_INSTALL_SELECTED "Install Selected"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -217,6 +217,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity." IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
IDS_SELECT_ALL "Select/Deselect All" IDS_SELECT_ALL "Select/Deselect All"
IDS_INSTALL_SELECTED "Install Selected" IDS_INSTALL_SELECTED "Install Selected"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -212,6 +212,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Diske yazılamıyor. Disk dolu olabilir." IDS_UNABLE_TO_WRITE "Diske yazılamıyor. Disk dolu olabilir."
IDS_SELECT_ALL "Select/Deselect All" IDS_SELECT_ALL "Select/Deselect All"
IDS_INSTALL_SELECTED "Install Selected" IDS_INSTALL_SELECTED "Install Selected"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -218,6 +218,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Записк на диск неможливий. Можливо, на диску недостатньо містця." IDS_UNABLE_TO_WRITE "Записк на диск неможливий. Можливо, на диску недостатньо містця."
IDS_SELECT_ALL "Вибрати все" IDS_SELECT_ALL "Вибрати все"
IDS_INSTALL_SELECTED "Встановити обране" IDS_INSTALL_SELECTED "Встановити обране"
IDS_SELECTEDFORINST "Обрані для встановлення"
END END
STRINGTABLE STRINGTABLE

View file

@ -212,6 +212,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "无法写入磁盘。磁盘可能已满。" IDS_UNABLE_TO_WRITE "无法写入磁盘。磁盘可能已满。"
IDS_SELECT_ALL "全选/全反选" IDS_SELECT_ALL "全选/全反选"
IDS_INSTALL_SELECTED "安装已选中的" IDS_INSTALL_SELECTED "安装已选中的"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -212,6 +212,7 @@ BEGIN
IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity." IDS_UNABLE_TO_WRITE "Unable to write to disk. Disk may be at capacity."
IDS_SELECT_ALL "Select/Deselect All" IDS_SELECT_ALL "Select/Deselect All"
IDS_INSTALL_SELECTED "Install Selected" IDS_INSTALL_SELECTED "Install Selected"
IDS_SELECTEDFORINST "Selected for installation"
END END
STRINGTABLE STRINGTABLE

View file

@ -40,6 +40,7 @@ IDI_CAT_OTHER ICON "res/cats/other.ico"
IDI_CAT_SCIENCE ICON "res/cats/science.ico" IDI_CAT_SCIENCE ICON "res/cats/science.ico"
IDI_CAT_TOOLS ICON "res/cats/tools.ico" IDI_CAT_TOOLS ICON "res/cats/tools.ico"
IDI_CAT_VIDEO ICON "res/cats/video.ico" IDI_CAT_VIDEO ICON "res/cats/video.ico"
IDI_SELECTEDFORINST ICON "res/select.ico"
/* Accelerators -- key bindings */ /* Accelerators -- key bindings */
HOTKEYS ACCELERATORS HOTKEYS ACCELERATORS