Add setting colour ability for individual tab

Fix #2271, close #12098
This commit is contained in:
spaxio 2022-09-04 15:12:36 +02:00 committed by Don Ho
parent 233c697183
commit 42d863dd9f
17 changed files with 265 additions and 60 deletions

View File

@ -404,6 +404,12 @@ The comments are here for explanation, it's not necessary to translate them.
<Item CMID="21" name="Open in Default Viewer"/>
<Item CMID="22" name="Close All Unchanged"/>
<Item CMID="23" name="Open Containing Folder as Workspace"/>
<Item CMID="24" name="Apply Color 1"/>
<Item CMID="25" name="Apply Color 2"/>
<Item CMID="26" name="Apply Color 3"/>
<Item CMID="27" name="Apply Color 4"/>
<Item CMID="28" name="Apply Color 5"/>
<Item CMID="29" name="Remove Color"/>
</TabBar>
</Menu>
@ -649,6 +655,12 @@ The comments are here for explanation, it's not necessary to translate them.
<Item id="44107" name="Switch to Folder as Workspace"/>
<Item id="44109" name="Switch to Document List"/>
<Item id="44108" name="Switch to Function List"/>
<Item id="44110" name="Remove Tab Colour"/>
<Item id="44111" name="Apply Tab Colour 1"/>
<Item id="44112" name="Apply Tab Colour 2"/>
<Item id="44113" name="Apply Tab Colour 3"/>
<Item id="44114" name="Apply Tab Colour 4"/>
<Item id="44115" name="Apply Tab Colour 5"/>
<Item id="11002" name="Sort By Name A to Z"/>
<Item id="11003" name="Sort By Name Z to A"/>
<Item id="11004" name="Sort By Path A to Z"/>

View File

@ -2300,30 +2300,8 @@ void Notepad_plus::setupColorSampleBitmapsOnMainMenuItems()
const Style * pStyle = NppParameters::getInstance().getMiscStylerArray().findByID(bitmapOnStyleMenuItemsInfo[j].styleIndic);
if (pStyle)
{
HBITMAP hNewBitmap = generateSolidColourMenuItemIcon(pStyle->_bgColor);
HDC hDC = GetDC(NULL);
const int bitmapXYsize = 16;
HBITMAP hNewBitmap = CreateCompatibleBitmap(hDC, bitmapXYsize, bitmapXYsize);
HDC hDCn = CreateCompatibleDC(hDC);
HBITMAP hOldBitmap = static_cast<HBITMAP>(SelectObject(hDCn, hNewBitmap));
RECT rc = { 0, 0, bitmapXYsize, bitmapXYsize };
// paint full-size black square
HBRUSH hBlackBrush = CreateSolidBrush(RGB(0,0,0));
FillRect(hDCn, &rc, hBlackBrush);
DeleteObject(hBlackBrush);
// overpaint a slightly smaller colored square
rc.left = rc.top = 1;
rc.right = rc.bottom = bitmapXYsize - 1;
HBRUSH hColorBrush = CreateSolidBrush(pStyle->_bgColor);
FillRect(hDCn, &rc, hColorBrush);
DeleteObject(hColorBrush);
// restore old bitmap so we can delete it to avoid leak
SelectObject(hDCn, hOldBitmap);
DeleteDC(hDCn);
SetMenuItemBitmaps(_mainMenuHandle, bitmapOnStyleMenuItemsInfo[j].firstOfThisColorMenuId, MF_BYCOMMAND, hNewBitmap, hNewBitmap);
for (int relatedMenuId : bitmapOnStyleMenuItemsInfo[j].sameColorMenuIds)
{
@ -2331,6 +2309,14 @@ void Notepad_plus::setupColorSampleBitmapsOnMainMenuItems()
}
}
}
// Adds tab colour icons
for (int i = 0; i < 5; ++i)
{
COLORREF colour = NppDarkMode::getIndividualTabColour(i, NppDarkMode::isDarkMenuEnabled(), true);
HBITMAP hBitmap = generateSolidColourMenuItemIcon(colour);
SetMenuItemBitmaps(_mainMenuHandle, IDM_VIEW_TAB_COLOUR_1 + i, MF_BYCOMMAND, hBitmap, hBitmap);
}
}
bool doCheck(HMENU mainHandle, int id)
@ -5780,6 +5766,7 @@ void Notepad_plus::getCurrentOpenedFiles(Session & session, bool includUntitledD
sessionFileInfo sfi(buf->getFullPathName(), langName, buf->getEncoding(), buf->getUserReadOnly(), buf->getPosition(editView), buf->getBackupFileName().c_str(), buf->getLastModifiedTimestamp(), buf->getMapPosition());
sfi._isMonitoring = buf->isMonitoringOn();
sfi._individualTabColour = docTab[0]->getIndividualTabColour(static_cast<int>(i));
_invisibleEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument());
size_t maxLine = static_cast<size_t>(_invisibleEditView.execute(SCI_GETLINECOUNT));
@ -8225,3 +8212,31 @@ void Notepad_plus::updateCommandShortcuts()
csc.setName(menuName.c_str(), shortcutName.c_str());
}
}
HBITMAP Notepad_plus::generateSolidColourMenuItemIcon(COLORREF colour)
{
HDC hDC = GetDC(NULL);
const int bitmapXYsize = 16;
HBITMAP hNewBitmap = CreateCompatibleBitmap(hDC, bitmapXYsize, bitmapXYsize);
HDC hDCn = CreateCompatibleDC(hDC);
HBITMAP hOldBitmap = static_cast<HBITMAP>(SelectObject(hDCn, hNewBitmap));
RECT rc = { 0, 0, bitmapXYsize, bitmapXYsize };
// paint full-size black square
HBRUSH hBlackBrush = CreateSolidBrush(RGB(0,0,0));
FillRect(hDCn, &rc, hBlackBrush);
DeleteObject(hBlackBrush);
// overpaint a slightly smaller colored square
rc.left = rc.top = 1;
rc.right = rc.bottom = bitmapXYsize - 1;
HBRUSH hColorBrush = CreateSolidBrush(colour);
FillRect(hDCn, &rc, hColorBrush);
DeleteObject(hColorBrush);
// restore old bitmap so we can delete it to avoid leak
SelectObject(hDCn, hOldBitmap);
DeleteDC(hDCn);
return hNewBitmap;
}

View File

@ -638,4 +638,6 @@ private:
void monitoringStartOrStopAndUpdateUI(Buffer* pBuf, bool isStarting);
void createMonitoringThread(Buffer* pBuf);
void updateCommandShortcuts();
HBITMAP generateSolidColourMenuItemIcon(COLORREF colour);
};

View File

@ -705,6 +705,13 @@ BEGIN
MENUITEM SEPARATOR
MENUITEM "Move Tab Forward", IDM_VIEW_TAB_MOVEFORWARD
MENUITEM "Move Tab Backward", IDM_VIEW_TAB_MOVEBACKWARD
MENUITEM SEPARATOR
MENUITEM "Apply Color 1", IDM_VIEW_TAB_COLOUR_1
MENUITEM "Apply Color 2", IDM_VIEW_TAB_COLOUR_2
MENUITEM "Apply Color 3", IDM_VIEW_TAB_COLOUR_3
MENUITEM "Apply Color 4", IDM_VIEW_TAB_COLOUR_4
MENUITEM "Apply Color 5", IDM_VIEW_TAB_COLOUR_5
MENUITEM "Remove Color", IDM_VIEW_TAB_COLOUR_NONE
END
MENUITEM "Word wrap", IDM_VIEW_WRAP
MENUITEM "Focus on Another View", IDM_VIEW_SWITCHTO_OTHER_VIEW

View File

@ -977,6 +977,21 @@ void Notepad_plus::command(int id)
}
break;
case IDM_VIEW_TAB_COLOUR_NONE:
case IDM_VIEW_TAB_COLOUR_1:
case IDM_VIEW_TAB_COLOUR_2:
case IDM_VIEW_TAB_COLOUR_3:
case IDM_VIEW_TAB_COLOUR_4:
case IDM_VIEW_TAB_COLOUR_5:
{
const int color_id = (id - IDM_VIEW_TAB_COLOUR_NONE) - 1;
const auto current_index = _pDocTab->getCurrentTabIndex();
BufferID buffer_id = _pDocTab->getBufferByIndex(current_index);
_pDocTab->setIndividualTabColour(buffer_id, color_id);
::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0);
}
break;
case IDM_VIEW_TAB1:
case IDM_VIEW_TAB2:
case IDM_VIEW_TAB3:

View File

@ -28,6 +28,8 @@
#include <Shlwapi.h>
#include <array>
#ifdef __GNUC__
#include <cmath>
#define WINAPI_LAMBDA WINAPI
@ -2852,4 +2854,69 @@ namespace NppDarkMode
}
return static_cast<INT_PTR>(NppDarkMode::onCtlColor(hdc));
}
struct HLSColour
{
WORD _hue;
WORD _lightness;
WORD _saturation;
COLORREF toRGB() const { return ColorHLSToRGB(_hue, _lightness, _saturation); }
};
using IndividualTabColours = std::array<HLSColour, 5>;
static constexpr IndividualTabColours individualTabHuesFor_Dark { { HLSColour{0, 40, 60}, HLSColour{70, 40, 60}, HLSColour{144, 40, 60}, HLSColour{13, 40, 60}, HLSColour{195, 40, 60} } };
static constexpr IndividualTabColours individualTabHuesFor_DarkRed { { HLSColour{0, 60, 60}, HLSColour{70, 50, 60}, HLSColour{144, 50, 60}, HLSColour{13, 50, 60}, HLSColour{195, 50, 60} } };
static constexpr IndividualTabColours individualTabHuesFor_DarkGreen { { HLSColour{0, 50, 60}, HLSColour{70, 50, 60}, HLSColour{144, 50, 60}, HLSColour{13, 50, 60}, HLSColour{195, 50, 60} } };
static constexpr IndividualTabColours individualTabHuesFor_DarkBlue { { HLSColour{0, 50, 60}, HLSColour{70, 50, 60}, HLSColour{144, 50, 60}, HLSColour{13, 50, 60}, HLSColour{195, 50, 60} } };
static constexpr IndividualTabColours individualTabHuesFor_DarkPurple{ { HLSColour{0, 50, 60}, HLSColour{70, 50, 60}, HLSColour{144, 50, 60}, HLSColour{13, 50, 60}, HLSColour{195, 60, 60} } };
static constexpr IndividualTabColours individualTabHuesFor_DarkCyan { { HLSColour{0, 60, 60}, HLSColour{70, 60, 60}, HLSColour{144, 70, 60}, HLSColour{13, 60, 60}, HLSColour{195, 60, 60} } };
static constexpr IndividualTabColours individualTabHuesFor_DarkOlive { { HLSColour{0, 60, 60}, HLSColour{70, 60, 60}, HLSColour{144, 60, 60}, HLSColour{13, 60, 60}, HLSColour{195, 60, 60} } };
static const IndividualTabColours individualTabHues { { HLSColour{0, 210, 150}, HLSColour{70, 210, 150}, HLSColour{144, 210, 150}, HLSColour{13, 210, 150}, HLSColour{195, 210, 150} } };
const IndividualTabColours& getIndividualThemeDependantColours()
{
switch (g_colorToneChoice)
{
case redTone: return individualTabHuesFor_DarkRed;
case greenTone: return individualTabHuesFor_DarkGreen;
case blueTone: return individualTabHuesFor_DarkBlue;
case purpleTone: return individualTabHuesFor_DarkPurple;
case cyanTone: return individualTabHuesFor_DarkCyan;
case oliveTone: return individualTabHuesFor_DarkOlive;
default: return individualTabHuesFor_Dark;
}
}
COLORREF getIndividualTabColour(int colourIndex, bool themeDependant, bool saturated)
{
if (colourIndex < 0 || colourIndex > 4) return {};
HLSColour result;
if (themeDependant)
{
result = getIndividualThemeDependantColours()[colourIndex];
if (saturated)
{
result._lightness = 146;
result._saturation = min(240, result._saturation + 100);
}
}
else
{
result = individualTabHues[colourIndex];
if (saturated)
{
result._lightness = 140;
result._saturation = min(240, result._saturation + 30);
}
}
return result.toRGB();
}
}

View File

@ -133,6 +133,8 @@ namespace NppDarkMode
HPEN getHotEdgePen();
HPEN getDisabledEdgePen();
COLORREF getIndividualTabColour(int colourIndex, bool themeDependant, bool saturated);
void setBackgroundColor(COLORREF c);
void setSofterBackgroundColor(COLORREF c);
void setHotBackgroundColor(COLORREF c);

View File

@ -2105,6 +2105,8 @@ bool Notepad_plus::loadSession(Session & session, bool isSnapshotMode, bool shou
if (isSnapshotMode && session._mainViewFiles[i]._backupFilePath != TEXT("") && PathFileExists(session._mainViewFiles[i]._backupFilePath.c_str()))
buf->setDirty(true);
_mainDocTab.setIndividualTabColour(lastOpened, session._mainViewFiles[i]._individualTabColour);
//Force in the document so we can add the markers
//Don't use default methods because of performance
Document prevDoc = _mainEditView.execute(SCI_GETDOCPOINTER);

View File

@ -539,6 +539,13 @@ BOOL Notepad_plus::notify(SCNotification *notification)
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_RELOAD, TEXT("Reload")));
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_PRINT, TEXT("Print")));
itemUnitArray.push_back(MenuItemUnit(0, NULL));
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_TAB_COLOUR_1, TEXT("Apply Color 1")));
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_TAB_COLOUR_2, TEXT("Apply Color 2")));
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_TAB_COLOUR_3, TEXT("Apply Color 3")));
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_TAB_COLOUR_4, TEXT("Apply Color 4")));
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_TAB_COLOUR_5, TEXT("Apply Color 5")));
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_TAB_COLOUR_NONE, TEXT("Remove Color")));
itemUnitArray.push_back(MenuItemUnit(0, NULL));
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_OPEN_FOLDER, TEXT("Open Containing Folder in Explorer")));
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_OPEN_CMD, TEXT("Open Containing Folder in cmd")));
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CONTAININGFOLDERASWORKSPACE, TEXT("Open Containing Folder as Workspace")));
@ -562,6 +569,14 @@ BOOL Notepad_plus::notify(SCNotification *notification)
_nativeLangSpeaker.changeLangTabContextMenu(_tabPopupMenu.getMenuHandle());
}
// Adds colour icons
for (int i = 0; i < 5; ++i)
{
COLORREF colour = NppDarkMode::getIndividualTabColour(i, NppDarkMode::isDarkMenuEnabled(), true);
HBITMAP hBitmap = generateSolidColourMenuItemIcon(colour);
SetMenuItemBitmaps(_tabPopupMenu.getMenuHandle(), IDM_VIEW_TAB_COLOUR_1 + i, MF_BYCOMMAND, hBitmap, hBitmap);
}
bool isEnable = ((::GetMenuState(_mainMenuHandle, IDM_FILE_SAVE, MF_BYCOMMAND)&MF_DISABLED) == 0);
_tabPopupMenu.enableItem(IDM_FILE_SAVE, isEnable);

View File

@ -321,6 +321,12 @@ static const WinMenuKeyDefinition winKeyDefs[] =
{ VK_NULL, IDM_VIEW_SWITCHTO_FILEBROWSER, false, false, false, TEXT("Switch to Folder as Workspace") },
{ VK_NULL, IDM_VIEW_SWITCHTO_FUNC_LIST, false, false, false, TEXT("Switch to Function List") },
{ VK_NULL, IDM_VIEW_SWITCHTO_DOCLIST, false, false, false, TEXT("Switch to Document List") },
{ VK_NULL, IDM_VIEW_TAB_COLOUR_NONE, false, false, false, TEXT("Remove Tab Colour") },
{ VK_NULL, IDM_VIEW_TAB_COLOUR_1, false, false, false, TEXT("Apply Tab Colour 1") },
{ VK_NULL, IDM_VIEW_TAB_COLOUR_2, false, false, false, TEXT("Apply Tab Colour 2") },
{ VK_NULL, IDM_VIEW_TAB_COLOUR_3, false, false, false, TEXT("Apply Tab Colour 3") },
{ VK_NULL, IDM_VIEW_TAB_COLOUR_4, false, false, false, TEXT("Apply Tab Colour 4") },
{ VK_NULL, IDM_VIEW_TAB_COLOUR_5, false, false, false, TEXT("Apply Tab Colour 5") },
{ VK_NULL, IDM_VIEW_SYNSCROLLV, false, false, false, nullptr },
{ VK_NULL, IDM_VIEW_SYNSCROLLH, false, false, false, nullptr },
{ VK_R, IDM_EDIT_RTL, true, true, false, nullptr },
@ -2280,6 +2286,12 @@ bool NppParameters::getSessionFromXmlTree(TiXmlDocument *pSessionDoc, Session& s
sessionFileInfo sfi(fileName, langName, encStr ? encoding : -1, isUserReadOnly, position, backupFilePath, fileModifiedTimestamp, mapPosition);
const TCHAR* intStrTabColour = (childNode->ToElement())->Attribute(TEXT("tabColourId"));
if (intStrTabColour)
{
sfi._individualTabColour = generic_atoi(intStrTabColour);
}
for (TiXmlNode *markNode = childNode->FirstChildElement(TEXT("Mark"));
markNode;
markNode = markNode->NextSibling(TEXT("Mark")))
@ -3348,6 +3360,7 @@ void NppParameters::writeSession(const Session & session, const TCHAR *fileName)
(fileNameNode->ToElement())->SetAttribute(TEXT("backupFilePath"), viewSessionFiles[i]._backupFilePath.c_str());
(fileNameNode->ToElement())->SetAttribute(TEXT("originalFileLastModifTimestamp"), static_cast<int32_t>(viewSessionFiles[i]._originalFileLastModifTimestamp.dwLowDateTime));
(fileNameNode->ToElement())->SetAttribute(TEXT("originalFileLastModifTimestampHigh"), static_cast<int32_t>(viewSessionFiles[i]._originalFileLastModifTimestamp.dwHighDateTime));
(fileNameNode->ToElement())->SetAttribute(TEXT("tabColourId"), static_cast<int32_t>(viewSessionFiles[i]._individualTabColour));
// docMap
(fileNameNode->ToElement())->SetAttribute(TEXT("mapFirstVisibleDisplayLine"), _i64tot(static_cast<LONGLONG>(viewSessionFiles[i]._mapPos._firstVisibleDisplayLine), szInt64, 10));

View File

@ -201,6 +201,7 @@ struct sessionFileInfo : public Position
int _encoding = -1;
bool _isUserReadOnly = false;
bool _isMonitoring = false;
int _individualTabColour = -1;
generic_string _backupFilePath;
FILETIME _originalFileLastModifTimestamp = {};

View File

@ -56,6 +56,18 @@ void DocTabView::closeBuffer(BufferID buffer)
::SendMessage(_hParent, WM_SIZE, 0, 0);
}
void DocTabView::setIndividualTabColour(BufferID bufferId, int colorId)
{
_tabIndexToColour[bufferId] = colorId;
}
int DocTabView::getIndividualTabColour(int tabIndex)
{
BufferID bufferId = getBufferByIndex(tabIndex);
auto it = _tabIndexToColour.find(bufferId);
if (it != _tabIndexToColour.end()) return it->second;
else return -1;
}
bool DocTabView::activateBuffer(BufferID buffer)
{

View File

@ -90,10 +90,14 @@ public :
return _pView;
};
void setIndividualTabColour(BufferID bufferId, int colorId);
int getIndividualTabColour(int tabIndex) override;
private :
ScintillaEditView *_pView = nullptr;
static bool _hideTabBarStatus;
std::map<BufferID, int> _tabIndexToColour;
std::vector<IconList *> _pIconListVector;
int _iconListIndexChoice = -1;
};

View File

@ -1002,7 +1002,6 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara
return ::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam);
}
void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode)
{
RECT rect = pDrawItemStruct->rcItem;
@ -1032,7 +1031,7 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode)
HBRUSH hBrush = ::CreateSolidBrush(!isDarkMode ? ::GetSysColor(COLOR_BTNFACE) : NppDarkMode::getBackgroundColor());
::FillRect(hDC, &rect, hBrush);
::DeleteObject((HGDIOBJ)hBrush);
// equalize drawing areas of active and inactive tabs
int paddingDynamicTwoX = NppParameters::getInstance()._dpiManager.scaleX(2);
int paddingDynamicTwoY = NppParameters::getInstance()._dpiManager.scaleY(2);
@ -1072,7 +1071,7 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode)
rect.bottom += paddingDynamicTwoY;
}
}
// the active tab's text with TCS_BUTTONS is lower than normal and gets clipped
if (::GetWindowLongPtr(_hSelf, GWL_STYLE) & TCS_BUTTONS)
{
@ -1086,6 +1085,8 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode)
}
}
const int individualColourId = getIndividualTabColour(nTab);
// draw highlights on tabs (top bar for active tab / darkened background for inactive tab)
RECT barRect = rect;
if (isSelected)
@ -1109,7 +1110,14 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode)
}
if (::SendMessage(_hParent, NPPM_INTERNAL_ISFOCUSEDTAB, 0, reinterpret_cast<LPARAM>(_hSelf)))
hBrush = ::CreateSolidBrush(_activeTopBarFocusedColour); // #FAAA3C
{
COLORREF topBarColour = _activeTopBarFocusedColour; // #FAAA3C
if (individualColourId != -1)
{
topBarColour = NppDarkMode::getIndividualTabColour(individualColourId, isDarkMode, true);
}
hBrush = ::CreateSolidBrush(topBarColour);
}
else
hBrush = ::CreateSolidBrush(_activeTopBarUnfocusedColour); // #FAD296
@ -1117,12 +1125,27 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode)
::DeleteObject((HGDIOBJ)hBrush);
}
}
else
else // inactive tabs
{
if (_drawInactiveTab)
bool draw = false;
RECT rect = _isCtrlMultiLine ? pDrawItemStruct->rcItem : barRect;
COLORREF brushColour{};
if (_drawInactiveTab && individualColourId == -1 && !isDarkMode)
{
hBrush = ::CreateSolidBrush(!isDarkMode ? _inactiveBgColour : NppDarkMode::getBackgroundColor());
::FillRect(hDC, &barRect, hBrush);
brushColour = _inactiveBgColour;
draw = true;
}
else if (individualColourId != -1)
{
brushColour = NppDarkMode::getIndividualTabColour(individualColourId, isDarkMode, false);
draw = true;
}
if (draw)
{
hBrush = ::CreateSolidBrush(brushColour);
::FillRect(hDC, &rect, hBrush);
::DeleteObject((HGDIOBJ)hBrush);
}
}

View File

@ -208,6 +208,8 @@ public :
static void setColour(COLORREF colour2Set, tabColourIndex i);
virtual int getIndividualTabColour(int tabIndex) = 0;
protected:
// it's the boss to decide if we do the drag N drop
static bool _doDragNDrop;

View File

@ -379,35 +379,41 @@ void NativeLangSpeaker::changeMenuLang(HMENU menuHandle)
static const int tabContextMenuItemPos[] =
{
// +-------------- The order in tab menu (NppNotification.cpp : if (!_tabPopupMenu.isCreated())
// |
// | +------ Number in english.xml (<language>.xml) : <TabBar>
// | |
0, // 0: Close
1, // 1: Close ALL BUT This
5, // 2: Save
6, // 3: Save As
10, // 4: Print
25, // 5: Move to Other View
26, // 6: Clone to Other View
21, // 7: Full File Path to Clipboard
22, // 8: Filename to Clipboard
23, // 9: Current Dir. Path to Clipboard
7, // 10: Rename
8, // 11: Move to Recycle Bin
18, // 12: Read-Only
19, // 13: Clear Read-Only Flag
27, // 14: Move to New Instance
28, // 15: Open to New Instance
9, // 16: Reload
2, // 17: Close ALL to the Left
3, // 18: Close ALL to the Right
12, // 19: Open Containing Folder in Explorer
13, // 20: Open Containing Folder in cmd
16, // 21: Open in Default Viewer
4, // 22: Close ALL Unchanged
14, // 23: Open Containing Folder as Workspace
-1 //-------End
// +-------------- The item position in tab context menu
// |
// | +------ Index order (CMDID) in <TabBar> of english.xml
// | |
0, // 0: Close
1, // 1: Close ALL BUT This
5, // 2: Save
6, // 3: Save As
10, // 4: Print
32, // 5: Move to Other View
33, // 6: Clone to Other View
28, // 7: Full File Path to Clipboard
29, // 8: Filename to Clipboard
30, // 9: Current Dir. Path to Clipboard
7, // 10: Rename
8, // 11: Move to Recycle Bin
25, // 12: Read-Only
24, // 13: Clear Read-Only Flag
34, // 14: Move to New Instance
35, // 15: Open to New Instance
9, // 16: Reload
2, // 17: Close ALL to the Left
3, // 18: Close ALL to the Right
19, // 19: Open Containing Folder in Explorer
20, // 20: Open Containing Folder in cmd
23, // 21: Open in Default Viewer
4, // 22: Close ALL Unchanged
21, // 23: Open Containing Folder as Workspace
12, // 24: Apply Color
13, // 25: Apply Color
14, // 26: Apply Color
15, // 27: Apply Color
16, // 28: Apply Color
17, // 29: Remove Color
-1 //-------End
};

View File

@ -367,6 +367,13 @@
#define IDM_VIEW_SWITCHTO_FUNC_LIST (IDM_VIEW + 108)
#define IDM_VIEW_SWITCHTO_DOCLIST (IDM_VIEW + 109)
#define IDM_VIEW_TAB_COLOUR_NONE (IDM_VIEW + 110)
#define IDM_VIEW_TAB_COLOUR_1 (IDM_VIEW + 111)
#define IDM_VIEW_TAB_COLOUR_2 (IDM_VIEW + 112)
#define IDM_VIEW_TAB_COLOUR_3 (IDM_VIEW + 113)
#define IDM_VIEW_TAB_COLOUR_4 (IDM_VIEW + 114)
#define IDM_VIEW_TAB_COLOUR_5 (IDM_VIEW + 115)
#define IDM_VIEW_GOTO_ANOTHER_VIEW 10001
#define IDM_VIEW_CLONE_TO_ANOTHER_VIEW 10002
#define IDM_VIEW_GOTO_NEW_INSTANCE 10003