View Issue Details

IDProjectCategoryView StatusLast Update
0002816WishesPanelpublic2014-10-08 17:15
ReporterMaximus Assigned To 
PrioritynormalSeverityminorReproducibilityhave not tried
Status newResolutionopen 
Product Version3.0 
Summary0002816: Многострочная статусная область
Description
Дать возможность юзеру настроить многострочную статусную область.
Реализация - через фиктивную колонку "B".

B[C,R] - (только для строки статуса) фиктивная колонка, соответствующая разрыву строки, таким образом можно настроить
             многострочную область статуса; ширина фиктивной колонки (хотя бы и 0) должна быть указана
             Можно указать один из модификаторов выравнивания,
             где: C - по центру, лидирующие и концевые пробелы обрезаются;
                  R - по правому краю;
             Колонку можно указать на первом месте для выравнивания первой статусной строки
TagsNo tags attached.
Build

Activities

Maximus

2014-10-02 10:52

reporter  

Multiline-panel-status-line.patch (21,008 bytes)   
From def83a7e2451dc41a961629503091e6d69fcce58 Mon Sep 17 00:00:00 2001
From: Maximus5 <ConEmu.Maximus5@gmail.com>
Date: Fri, 29 Aug 2014 00:49:17 +0400
Subject: [PATCH] Multiline panel status line

---
 unicode_far/FarEng.hlf.m4  |   9 ++
 unicode_far/FarRus.hlf.m4  |  10 +++
 unicode_far/filelist.cpp   | 208 ++++++++++++++++++++++++++++++++++++++-------
 unicode_far/filelist.hpp   |   1 +
 unicode_far/panel.hpp      |   3 +-
 unicode_far/panelctype.hpp |   3 +-
 unicode_far/panelmix.cpp   |  47 ++++++++--
 7 files changed, 241 insertions(+), 40 deletions(-)

diff --git a/unicode_far/FarEng.hlf.m4 b/unicode_far/FarEng.hlf.m4
index c17f8f4..e39cb62 100644
--- a/unicode_far/FarEng.hlf.m4
+++ b/unicode_far/FarEng.hlf.m4
@@ -3978,6 +3978,15 @@ characters, delimited with commas. Allowed column types are:
 
     F          - number of streams
 
+    B[C,R]     - ^<wrap>(only for status line) fictive column,
+means column break, so, you can set up multiline status area;
+you must specify column width (even if 0) must be specified.
+                 You may supply one of align modificators,
+                 where: C - ^<wrap>center align, leading and trailing spaces will be omitted;
+                        R - right align;
+                 ^<wrap>You may supply B column as first column
+for aligning first status line.
+
     If the column types description contains more than one file name column,
 the file panel will be displayed in multicolumn form.
 
diff --git a/unicode_far/FarRus.hlf.m4 b/unicode_far/FarRus.hlf.m4
index b630016..93794c1 100644
--- a/unicode_far/FarRus.hlf.m4
+++ b/unicode_far/FarRus.hlf.m4
@@ -4062,6 +4062,16 @@ $ #Настройка режимов просмотра панели файло
 
     F          - количество потоков
 
+    B[C,R]     - ^<wrap>(только для строки статуса) фиктивная колонка,
+соответствующая разрыву строки, таким образом можно настроить
+многострочную область статуса; ширина фиктивной колонки (хотя бы и 0)
+должна быть указана
+                 Можно указать один из модификаторов выравнивания,
+                 где: C - ^<wrap>по центру, лидирующие и концевые пробелы обрезаются;
+                      R - по правому краю;
+                 ^<wrap>Колонку можно указать на первом месте для выравнивания первой
+статусной строки
+
     Если описание типов колонок содержит более одной колонки имени
 файла, панель файлов будет отображаться в многоколоночной форме.
 
diff --git a/unicode_far/filelist.cpp b/unicode_far/filelist.cpp
index d5ab232..6753e0a 100644
--- a/unicode_far/filelist.cpp
+++ b/unicode_far/filelist.cpp
@@ -2922,6 +2922,7 @@ int FileList::ProcessMouse(const MOUSE_EVENT_RECORD *MouseEvent)
 	Global->Elevation->ResetApprove();
 
 	int RetCode;
+	int StatusHeight = GetPanelStatusHeight();
 
 	if (IsVisible() && Global->Opt->ShowColumnTitles && !MouseEvent->dwEventFlags &&
 	        MouseEvent->dwMousePosition.Y==m_Y1+1 &&
@@ -2997,7 +2998,7 @@ int FileList::ProcessMouse(const MOUSE_EVENT_RECORD *MouseEvent)
 		return RetCode;
 
 	if (MouseEvent->dwMousePosition.Y>m_Y1+Global->Opt->ShowColumnTitles &&
-	        MouseEvent->dwMousePosition.Y<m_Y2-2*Global->Opt->ShowPanelStatus)
+	        MouseEvent->dwMousePosition.Y<m_Y2-StatusHeight)
 	{
 		SetFocus();
 
@@ -3091,14 +3092,14 @@ int FileList::ProcessMouse(const MOUSE_EVENT_RECORD *MouseEvent)
 		return TRUE;
 	}
 
-	if (MouseEvent->dwMousePosition.Y>=m_Y2-2)
+	if (MouseEvent->dwMousePosition.Y>=m_Y2-StatusHeight)
 	{
 		SetFocus();
 
 		if (m_ListData.empty())
 			return TRUE;
 
-		while (IsMouseButtonPressed() && IntKeyState.MouseY>=m_Y2-2)
+		while (IsMouseButtonPressed() && IntKeyState.MouseY>=m_Y2-StatusHeight)
 		{
 			MoveCursor(1);
 
@@ -7383,9 +7384,10 @@ static LNGID __FormatEndSelectedPhrase(size_t Count)
 
 void FileList::DisplayObject()
 {
-	m_Height=m_Y2-m_Y1-4+!Global->Opt->ShowColumnTitles+(Global->Opt->ShowPanelStatus ? 0:2);
 	_OT(SysLog(L"[%p] FileList::DisplayObject()",this));
 
+	m_Height=m_Y2-m_Y1+!Global->Opt->ShowColumnTitles-(Global->Opt->ShowPanelStatus ? (GetPanelStatusHeight()+2) : 2);
+
 	if (UpdateRequired)
 	{
 		UpdateRequired=FALSE;
@@ -7796,14 +7798,15 @@ void FileList::ShowSelectedSize()
 	if (Global->Opt->ShowPanelStatus)
 	{
 		SetColor(COL_PANELBOX);
-		DrawSeparator(m_Y2-2);
+		int StatusHeight = GetPanelStatusHeight();
+		DrawSeparator(m_Y2-StatusHeight);
 		for (size_t I=0,ColumnPos=m_X1+1; I<m_ViewSettings.PanelColumns.size() - 1; I++)
 		{
 			if (m_ViewSettings.PanelColumns[I].width < 0 || (I == m_ViewSettings.PanelColumns.size() - 2 && m_ViewSettings.PanelColumns[I+1].width < 0))
 				continue;
 
 			ColumnPos += m_ViewSettings.PanelColumns[I].width;
-			GotoXY(static_cast<int>(ColumnPos),m_Y2-2);
+			GotoXY(static_cast<int>(ColumnPos),m_Y2-StatusHeight);
 
 			bool DoubleLine = Global->Opt->DoubleGlobalColumnSeparator && (!((I+1)%ColumnsInGlobal));
 			BoxText(BoxSymbols[DoubleLine?BS_B_H1V2:BS_B_H1V1]);
@@ -7820,7 +7823,7 @@ void FileList::ShowSelectedSize()
 		TruncStr(strSelStr,m_X2-m_X1-1);
 		int Length=(int)strSelStr.size();
 		SetColor(COL_PANELSELECTEDINFO);
-		GotoXY(m_X1+(m_X2-m_X1+1-Length)/2,m_Y2-2*Global->Opt->ShowPanelStatus);
+		GotoXY(m_X1+(m_X2-m_X1+1-Length)/2,m_Y2-GetPanelStatusHeight());
 		Text(strSelStr);
 	}
 }
@@ -8034,19 +8037,65 @@ void FileList::PrepareViewSettings(int ViewMode, const OpenPanelInfo *PlugInfo)
 	}
 
 	m_Columns=PreparePanelView(&m_ViewSettings);
-	m_Height=m_Y2-m_Y1-4;
+	int StatusHeight = GetPanelStatusHeight();
+	m_Height=m_Y2-m_Y1-(Global->Opt->ShowPanelStatus ? (StatusHeight+2) : 2); //Maximus5: BUGBUG: ???
 
 	if (!Global->Opt->ShowColumnTitles)
 		m_Height++;
 
 	if (!Global->Opt->ShowPanelStatus)
-		m_Height+=2;
+		m_Height+=StatusHeight;
 }
 
 
 int FileList::PreparePanelView(PanelViewSettings *PanelView)
 {
-	PrepareColumnWidths(PanelView->StatusColumns, (PanelView->Flags&PVS_FULLSCREEN) != 0, true);
+	std::vector<column> StatusColumns;
+	auto i = PanelView->StatusColumns.begin();
+	auto j = i;
+	bool EndOfList = false;
+	while (!EndOfList)
+	{
+		EndOfList = (i == PanelView->StatusColumns.end());
+		bool BreakColumn = ((i->type &0xFF)==LINEBREAK_COLUMN);
+		while (!EndOfList)
+		{
+			if (BreakColumn)
+			{
+				if (!StatusColumns.empty())
+					break;
+			}
+			else
+			{
+				if (StatusColumns.empty())
+					j = i;
+				StatusColumns.push_back(*i);
+			}
+
+			if (++i == PanelView->StatusColumns.end())
+			{
+				EndOfList = true;
+				break;
+			}
+
+			BreakColumn = ((i->type &0xFF)==LINEBREAK_COLUMN);
+		}
+
+		if (!StatusColumns.empty())
+		{
+			PrepareColumnWidths(StatusColumns, (PanelView->Flags&PVS_FULLSCREEN) != 0, true);
+			for (auto k = StatusColumns.begin(); k != StatusColumns.end() && j != i; k++, j++)
+			{
+				#ifdef _DEBUG
+				const column& K = *k;
+				const column& J = *j;
+				_ASSERTE(K.type == J.type && K.width_type == J.width_type);
+				#endif
+				j->width = k->width;
+			}
+			StatusColumns.clear();
+		}
+	}
 	return PrepareColumnWidths(PanelView->PanelColumns, (PanelView->Flags&PVS_FULLSCREEN) != 0, false);
 }
 
@@ -8238,16 +8287,43 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 	int StatusShown=FALSE;
 	int MaxLeftPos=0,MinLeftPos=FALSE;
 	size_t ColumnCount=ShowStatus ? m_ViewSettings.StatusColumns.size() : m_ViewSettings.PanelColumns.size();
+	int StatusHeight = GetPanelStatusHeight();
 	const auto& Columns = ShowStatus ? m_ViewSettings.StatusColumns : m_ViewSettings.PanelColumns;
 
-	for (int I=m_Y1+1+Global->Opt->ShowColumnTitles,J=m_CurTopFile; I<m_Y2-2*Global->Opt->ShowPanelStatus; I++,J++)
+	size_t K0=0;
+	unsigned __int64 StatusAlign=0;
+
+
+	if (ShowStatus)
+	{
+		if ((Columns[K0].type&0xFF)==LINEBREAK_COLUMN)
+			K0++;
+		// ������ ������ ������ ������� ������������� �� ������ ShowStatus (1 based)
+		for (int S=1; S<ShowStatus; S++)
+		{
+			while (K0<ColumnCount)
+			{
+				if ((Columns[K0++].type&0xFF)==LINEBREAK_COLUMN)
+					break;
+			}
+		}
+		if (K0 && (Columns[K0-1].type&0xFF)==LINEBREAK_COLUMN)
+			StatusAlign=Columns[K0-1].type & (COLUMN_CENTERALIGN|COLUMN_RIGHTALIGN);
+		// ������� ��������� ������� � ���� ������
+		size_t K1=K0;
+		while (K1<ColumnCount && (Columns[K1].type&0xFF)!=LINEBREAK_COLUMN)
+			K1++;
+		ColumnCount=K1-K0;
+	}
+
+	for (int I=m_Y1+1+Global->Opt->ShowColumnTitles,J=m_CurTopFile; I<m_Y2-StatusHeight; I++,J++)
 	{
 		int CurColumn=StartColumn;
 
 		if (ShowStatus)
 		{
 			SetColor(COL_PANELTEXT);
-			GotoXY(m_X1+1,m_Y2-1);
+			GotoXY(m_X1+1,m_Y2-StatusHeight+ShowStatus);
 		}
 		else
 		{
@@ -8258,7 +8334,9 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 		int StatusLine=FALSE;
 		int Level = 1;
 
-		for (size_t K=0; K<ColumnCount; K++)
+		FormatString strLine;
+
+		for (size_t K=K0; K<K0+ColumnCount; K++)
 		{
 			int ListPos=J+CurColumn*m_Height;
 
@@ -8295,7 +8373,8 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 			{
 				if (!ShowStatus && !StatusShown && m_CurFile==ListPos && Global->Opt->ShowPanelStatus)
 				{
-					ShowList(TRUE,CurColumn);
+					for (int S=1; S<StatusHeight; S++)
+						ShowList(S,CurColumn);
 					GotoXY(CurX,CurY);
 					StatusShown=TRUE;
 					SetShowColor(ListPos);
@@ -8329,7 +8408,7 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 						}
 					}
 
-					Global->FS << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<ColumnData+CurLeftPos;
+					strLine << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<ColumnData+CurLeftPos;
 				}
 				else
 				{
@@ -8342,7 +8421,11 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 
 							if ((ViewFlags & COLUMN_MARK) && Width>2)
 							{
-								Text(m_ListData[ListPos].Selected?L"\x221A ":L"  ");
+								const wchar_t *MarkPtr = m_ListData[ListPos].Selected?L"\x221A ":L"  ";
+								if (!ShowStatus)
+									Text(MarkPtr);
+								else
+									strLine.append(MarkPtr);
 								Width-=2;
 							}
 
@@ -8353,10 +8436,15 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 								FarColor OldColor=GetColor();
 
 								if (!ShowStatus)
+								{
 									SetShowColor(ListPos, false);
-
-								Text(OutCharacter);
-								SetColor(OldColor);
+									Text(OutCharacter);
+									SetColor(OldColor);
+								}
+								else
+								{
+									strLine.append(OutCharacter);
+								}
 							}
 
 							const wchar_t *NamePtr = m_ShowShortNames && !m_ListData[ListPos].strShortName.empty() && !ShowStatus ? m_ListData[ListPos].strShortName.data():m_ListData[ListPos].strName.data();
@@ -8451,7 +8539,10 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 									Lower(strName);
 							}
 
-							Text(strName);
+							if (!ShowStatus)
+								Text(strName);
+							else
+								strLine.append(strName);
 
 
 							if (!ShowStatus)
@@ -8496,9 +8587,15 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 
 							unsigned __int64 ViewFlags=Columns[K].type;
 							if (ViewFlags&COLUMN_RIGHTALIGN)
-								Global->FS << fmt::RightAlign()<<fmt::ExactWidth(ColumnWidth)<<ExtPtr;
+								strLine << fmt::RightAlign()<<fmt::ExactWidth(ColumnWidth)<<ExtPtr;
 							else
-								Global->FS << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<ExtPtr;
+								strLine << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<ExtPtr;
+
+							if (!ShowStatus)
+							{
+								Text(strLine);
+								strLine.clear();
+							}
 
 							if (!ShowStatus && StrLength(ExtPtr) > ColumnWidth)
 							{
@@ -8522,7 +8619,7 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 						case PACKED_COLUMN:
 						case STREAMSSIZE_COLUMN:
 						{
-							Text(FormatStr_Size(
+							strLine.append(FormatStr_Size(
 								m_ListData[ListPos].FileSize,
 								m_ListData[ListPos].AllocationSize,
 								m_ListData[ListPos].StreamsSize,
@@ -8565,13 +8662,13 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 									break;
 							}
 
-							Global->FS << FormatStr_DateTime(FileTime,ColumnType,Columns[K].type,ColumnWidth);
+							strLine << FormatStr_DateTime(FileTime,ColumnType,Columns[K].type,ColumnWidth);
 							break;
 						}
 
 						case ATTR_COLUMN:
 						{
-							Global->FS << FormatStr_Attribute(m_ListData[ListPos].FileAttr,ColumnWidth);
+							strLine << FormatStr_Attribute(m_ListData[ListPos].FileAttr,ColumnWidth);
 							break;
 						}
 
@@ -8594,7 +8691,7 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 							if (pos != string::npos)
 								strDizText.resize(pos);
 
-							Global->FS << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<strDizText;
+							strLine << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<strDizText;
 							break;
 						}
 
@@ -8626,7 +8723,7 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 								}
 							}
 
-							Global->FS << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<Owner+CurLeftPos;
+							strLine << fmt::LeftAlign()<<fmt::ExactWidth(ColumnWidth)<<Owner+CurLeftPos;
 							break;
 						}
 
@@ -8634,15 +8731,15 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 						{
 							int nlink = m_ListData[ListPos].NumberOfLinks;
 							if (nlink >= 0)
-								Global->FS << fmt::ExactWidth(ColumnWidth) << nlink;
+								strLine << fmt::ExactWidth(ColumnWidth) << nlink;
 							else
-								Global->FS << fmt::ExactWidth(ColumnWidth) << L"?";
+								strLine << fmt::ExactWidth(ColumnWidth) << L"?";
 							break;
 						}
 
 						case NUMSTREAMS_COLUMN:
 						{
-							Global->FS << fmt::ExactWidth(ColumnWidth)<<m_ListData[ListPos].NumberOfStreams;
+							strLine << fmt::ExactWidth(ColumnWidth)<<m_ListData[ListPos].NumberOfStreams;
 							break;
 						}
 
@@ -8651,7 +8748,13 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 			}
 			else
 			{
-				Global->FS << fmt::MinWidth(ColumnWidth)<<L"";
+				strLine << fmt::MinWidth(ColumnWidth)<<L"";
+			}
+
+			if (!ShowStatus)
+			{
+				Text(strLine);
+				strLine.clear();
 			}
 
 			if (ShowDivider==FALSE)
@@ -8670,8 +8773,10 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 
 				if (K==ColumnCount-1)
 					BoxText(CurX+ColumnWidth==m_X2 ? BoxSymbols[BS_V2]:L' ');
+				else if (!ShowStatus)
+					BoxText(BoxSymbols[(Global->Opt->DoubleGlobalColumnSeparator && Level == ColumnsInGlobal)?BS_V2:BS_V1]);
 				else
-					BoxText(ShowStatus ? L' ':BoxSymbols[(Global->Opt->DoubleGlobalColumnSeparator && Level == ColumnsInGlobal)?BS_V2:BS_V1]);
+					strLine.append(L" ");
 
 				if (!ShowStatus)
 					SetColor(COL_PANELTEXT);
@@ -8689,6 +8794,29 @@ void FileList::ShowList(int ShowStatus,int StartColumn)
 			}
 		}
 
+		if (ShowStatus && !strLine.empty())
+		{
+			GotoXY(m_X1+1,WhereY());
+			SetColor(COL_PANELTEXT);
+			if (StatusAlign & COLUMN_CENTERALIGN)
+				RemoveExternalSpaces(strLine);
+			else if (StatusAlign & COLUMN_RIGHTALIGN)
+				RemoveTrailingSpaces(strLine);
+			int LineLen = static_cast<int>(strLine.length());
+			if (LineLen<(m_X2-m_X1-1))
+			{
+				if (StatusAlign & COLUMN_CENTERALIGN)
+					Global->FS << fmt::MinWidth((m_X2-m_X1-1-LineLen)>>1)<<L"";
+				else if (StatusAlign & COLUMN_RIGHTALIGN)
+					Global->FS << fmt::MinWidth(m_X2-m_X1-1-LineLen)<<L"";
+			}
+			else if (LineLen>(m_X2-m_X1-1))
+			{
+				LineLen = m_X2-m_X1-1;
+			}
+			Global->FS << fmt::MinWidth(LineLen)<<strLine/*LinePtr*/;
+		}
+
 		if ((!ShowStatus || StatusLine) && WhereX()<m_X2)
 		{
 			SetColor(COL_PANELTEXT);
@@ -8733,3 +8861,19 @@ bool FileList::IsColumnDisplayed(int Type)
 	return std::any_of(ALL_CONST_RANGE(m_ViewSettings.PanelColumns), is_same_type) ||
 		std::any_of(ALL_CONST_RANGE(m_ViewSettings.StatusColumns), is_same_type);
 }
+
+int FileList::GetPanelStatusHeight()
+{
+	if (!Global->Opt->ShowPanelStatus)
+		return 0;
+	int Count=0;
+	int CountMax = m_Y2-m_Y1-5;
+	for (size_t I=0; I<m_ViewSettings.StatusColumns.size() && Count<CountMax; I++)
+	{
+		if (I && (m_ViewSettings.StatusColumns[I].type&0xFF)==LINEBREAK_COLUMN)
+		{
+			Count++;
+		}
+	}
+	return Count+2; // <Number of status lines> + 1 (delimiter line)
+}
diff --git a/unicode_far/filelist.hpp b/unicode_far/filelist.hpp
index 1da4b83..0cd8ace 100644
--- a/unicode_far/filelist.hpp
+++ b/unicode_far/filelist.hpp
@@ -340,6 +340,7 @@ public:
 	void PluginEndSelection();
 	int PluginPanelHelp(const PluginHandle* hPlugin) const;
 	void ResetLastUpdateTime() {LastUpdateTime = 0;}
+	virtual int GetPanelStatusHeight();
 
 	static void SetFilePanelModes();
 	static void SavePanelModes();
diff --git a/unicode_far/panel.hpp b/unicode_far/panel.hpp
index 90e2668..2a51fb2 100644
--- a/unicode_far/panel.hpp
+++ b/unicode_far/panel.hpp
@@ -346,6 +346,7 @@ public:
 	void SetFullScreen() { m_ViewSettings.Flags |= PVS_FULLSCREEN; }
 	bool CreateFullPathName(const string& Name, const string& ShortName, DWORD FileAttr, string &strDest, int UNC, int ShortNameAsIs = TRUE) const;
 
+	virtual int GetPanelStatusHeight() { return 0; };
 
 	static void EndDrag();
 
@@ -411,4 +412,4 @@ public:
 private:
 	virtual void Update(int Mode) override {};
 	virtual void UpdateKeyBar() override {}
-};
\ No newline at end of file
+};
diff --git a/unicode_far/panelctype.hpp b/unicode_far/panelctype.hpp
index acd9b5e..edb4457 100644
--- a/unicode_far/panelctype.hpp
+++ b/unicode_far/panelctype.hpp
@@ -60,7 +60,8 @@ enum PANEL_COLUMN_TYPE {
 	CUSTOM_COLUMN7,
 	CUSTOM_COLUMN8,
 	CUSTOM_COLUMN9,
-
+	LINEBREAK_COLUMN,
+
 	COLUMN_TYPES_COUNT
 };
 
diff --git a/unicode_far/panelmix.cpp b/unicode_far/panelmix.cpp
index 31d395e..e21180b 100644
--- a/unicode_far/panelmix.cpp
+++ b/unicode_far/panelmix.cpp
@@ -50,12 +50,13 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "plugins.hpp"
 #include "language.hpp"
 
-int ColumnTypeWidth[]={0, 6, 6, 8, 5, 14, 14, 14, 14, 6, 0, 0, 3, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+int ColumnTypeWidth[]={0, 6, 6, 8, 5, 14, 14, 14, 14, 6, 0, 0, 3, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 static_assert(ARRAYSIZE(ColumnTypeWidth) == COLUMN_TYPES_COUNT, "wrong size of ColumnTypeWidth array");
 
-static const wchar_t *ColumnSymbol[]={L"N",L"S",L"P",L"D",L"T",L"DM",L"DC",L"DA",L"DE",L"A",L"Z",L"O",L"LN",L"F",L"G",L"X",L"C0",L"C1",L"C2",L"C3",L"C4",L"C5",L"C6",L"C7",L"C8",L"C9"};
+static const wchar_t *ColumnSymbol[]={L"N",L"S",L"P",L"D",L"T",L"DM",L"DC",L"DA",L"DE",L"A",L"Z",L"O",L"LN",L"F",L"G",L"X",L"C0",L"C1",L"C2",L"C3",L"C4",L"C5",L"C6",L"C7",L"C8",L"C9",L"B"};
 static_assert(ARRAYSIZE(ColumnSymbol) == COLUMN_TYPES_COUNT, "wrong size of ColumnSymbol array");
 
+
 void ShellUpdatePanels(Panel *SrcPanel,BOOL NeedSetUpADir)
 {
 	if (!SrcPanel)
@@ -401,12 +402,38 @@ void TextToViewSettings(const string& ColumnTitles,const string& ColumnWidths, s
 					}
 					else
 					{
-						for (unsigned I=0; I<ARRAYSIZE(ColumnSymbol); I++)
+						if (strArgName.at(0) == L'B')
 						{
-							if (strArgName == ColumnSymbol[I])
+							unsigned __int64 &ColumnType = Columns.back().type;
+							ColumnType=LINEBREAK_COLUMN;
+							const wchar_t *Ptr = strArgName.c_str()+1;
+
+							while (*Ptr)
 							{
-								Columns.back().type = I;
-								break;
+								switch (*Ptr)
+								{
+									case L'R':
+										if (!(ColumnType & COLUMN_CENTERALIGN))
+											ColumnType|=COLUMN_RIGHTALIGN;
+										break;
+									case L'C':
+										if (!(ColumnType & COLUMN_RIGHTALIGN))
+											ColumnType|=COLUMN_CENTERALIGN;
+										break;
+								}
+
+								Ptr++;
+							}
+						}
+						else
+						{
+							for (unsigned I=0; I<ARRAYSIZE(ColumnSymbol); I++)
+							{
+								if (strArgName == ColumnSymbol[I])
+								{
+									Columns.back().type = I;
+									break;
+								}
 							}
 						}
 					}
@@ -522,6 +549,14 @@ void ViewSettingsToText(const std::vector<column>& Columns, string &strColumnTit
 				strType += L"R";
 		}
 
+		if (ColumnType==LINEBREAK_COLUMN)
+		{
+			if (i.type & COLUMN_CENTERALIGN)
+				strType += L"C";
+			else if (i.type & COLUMN_RIGHTALIGN)
+				strType += L"R";
+		}
+
 		strColumnTitles += strType;
 
 		strColumnWidths += std::to_wstring(i.width);
-- 
1.8.5.2.msysgit.0

Mauro72

2014-10-08 17:15

reporter   bugnote:0013074

Will be great, and join with this old wish: http://bugs.farmanager.com/view.php?id=2362 and this old post too: http://forum.farmanager.com/viewtopic.php?f=38&t=6462&p=81806#p81806
Excellent add-on Maximus!!!

Issue History

Date Modified Username Field Change
2014-10-02 10:47 Maximus New Issue
2014-10-02 10:52 Maximus File Added: Multiline-panel-status-line.patch
2014-10-08 17:15 Mauro72 Note Added: 0013074