child window pane for displaying file lists More...
#include <pane.h>


Public Types | |
| typedef SubclassedWindow | super |
Public Member Functions | |
| Pane (HWND hparent, int id, int id_header, Entry *rool, bool treePane, int visible_cols) | |
| ~Pane () | |
| void | init () |
| void | set_header () |
| bool | create_header (HWND parent, int id) |
| bool | calc_widths (bool anyway) |
| void | calc_single_width (int col) |
| void | draw_item (LPDRAWITEMSTRUCT dis, Entry *entry, int calcWidthCol=-1) |
| int | insert_entries (Entry *dir, int idx=-1) |
| BOOL | command (UINT cmd) |
| virtual int | Notify (int id, NMHDR *pnmh) |
Public Attributes | |
| int | _widths [COLUMNS] |
| int | _positions [COLUMNS+1] |
| WindowHandle | _hwndHeader |
| Entry * | _root |
| Entry * | _cur |
| COLORREF | _clrCompressed |
| int | _visible_cols |
| bool | _treePane |
Protected Member Functions | |
| virtual LRESULT | WndProc (UINT nmsg, WPARAM wparam, LPARAM lparam) |
| void | calc_width (LPDRAWITEMSTRUCT dis, int col, LPCTSTR str) |
| void | calc_tabbed_width (LPDRAWITEMSTRUCT dis, int col, LPCTSTR str) |
| struct MainFrameBase * | get_frame () |
Protected Attributes | |
| HIMAGELIST | _himl |
| OutputWorker | _out_wrkr |
child window pane for displaying file lists
Definition at line 66 of file pane.h.
| typedef SubclassedWindow Pane::super |
Reimplemented from SubclassedWindow.
Definition at line 76 of file pane.cpp.
References _root, create_header(), init(), and insert_entries().
: super(CreateWindow(TEXT("ListBox"), TEXT(""), WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL| LBS_DISABLENOSCROLL|LBS_NOINTEGRALHEIGHT|LBS_OWNERDRAWFIXED|LBS_NOTIFY, 0, 0, 0, 0, hparent, (HMENU)id, g_Globals._hInstance, 0)), _root(root), _visible_cols(visible_cols), _treePane(treePane) { // insert entries into listbox Entry* entry = _root; if (entry) insert_entries(entry); init(); create_header(hparent, id_header); }

| Pane::~Pane | ( | ) |
| void Pane::calc_single_width | ( | int | col ) |
Definition at line 726 of file pane.cpp.
References OutputWorker::_hfont, WindowHandle::_hwnd, _out_wrkr, _positions, OutputWorker::_spaceSize, _widths, COLUMNS, draw_item(), and IMAGE_WIDTH.
Referenced by Notify().
{
HFONT hfontOld;
int x, cx;
int cnt;
HDC hdc;
int entries = ListBox_GetCount(_hwnd);
_widths[col] = 0;
hdc = GetDC(_hwnd);
hfontOld = SelectFont(hdc, _out_wrkr._hfont);
for(cnt=0; cnt<entries; cnt++) {
Entry* entry = (Entry*) ListBox_GetItemData(_hwnd, cnt);
DRAWITEMSTRUCT dis;
dis.CtlType = 0;
dis.CtlID = 0;
dis.itemID = 0;
dis.itemAction = 0;
dis.itemState = 0;
dis.hwndItem = _hwnd;
dis.hDC = hdc;
dis.rcItem.left = 0;
dis.rcItem.top = 0;
dis.rcItem.right = 0;
dis.rcItem.bottom = 0;
/*dis.itemData = 0; */
draw_item(&dis, entry, col);
}
SelectObject(hdc, hfontOld);
ReleaseDC(_hwnd, hdc);
cx = _widths[col];
if (cx) {
cx += 3*_out_wrkr._spaceSize.cx;
if (cx < IMAGE_WIDTH)
cx = IMAGE_WIDTH;
}
_widths[col] = cx;
x = _positions[col] + cx;
for(; col<COLUMNS; ) {
_positions[++col] = x;
x += _widths[col];
}
ListBox_SetHorizontalExtent(_hwnd, x);
}


| void Pane::calc_tabbed_width | ( | LPDRAWITEMSTRUCT | dis, |
| int | col, | ||
| LPCTSTR | str | ||
| ) | [protected] |
Definition at line 645 of file pane.cpp.
References _widths.
Referenced by draw_item().
{
RECT rt = {0, 0, 0, 0};
/* DRAWTEXTPARAMS dtp = {sizeof(DRAWTEXTPARAMS), 2};
DrawTextEx(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_NOPREFIX|DT_EXPANDTABS|DT_TABSTOP, &dtp);*/
DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_EXPANDTABS|DT_TABSTOP|(2<<8));
if (rt.right > _widths[col])
_widths[col] = rt.right;
}

| void Pane::calc_width | ( | LPDRAWITEMSTRUCT | dis, |
| int | col, | ||
| LPCTSTR | str | ||
| ) | [protected] |
| bool Pane::calc_widths | ( | bool | anyway ) |
Definition at line 181 of file pane.cpp.
References OutputWorker::_hfont, WindowHandle::_hwnd, _out_wrkr, _positions, OutputWorker::_spaceSize, _widths, COLUMNS, draw_item(), and IMAGE_WIDTH.
Referenced by FileChildWindow::activate_entry(), command(), FileChildWindow::expand_entry(), init(), FileChildWindow::jump_to_int(), FileChildWindow::scan_entry(), and FileChildWindow::set_curdir().
{
int col, x, cx, spc=3*_out_wrkr._spaceSize.cx;
int entries = ListBox_GetCount(_hwnd);
int orgWidths[COLUMNS];
int orgPositions[COLUMNS+1];
HFONT hfontOld;
HDC hdc;
int cnt;
if (!anyway) {
memcpy(orgWidths, _widths, sizeof(orgWidths));
memcpy(orgPositions, _positions, sizeof(orgPositions));
}
for(col=0; col<COLUMNS; col++)
_widths[col] = 0;
hdc = GetDC(_hwnd);
hfontOld = SelectFont(hdc, _out_wrkr._hfont);
for(cnt=0; cnt<entries; cnt++) {
Entry* entry = (Entry*) ListBox_GetItemData(_hwnd, cnt);
DRAWITEMSTRUCT dis;
dis.CtlType = 0;
dis.CtlID = 0;
dis.itemID = 0;
dis.itemAction = 0;
dis.itemState = 0;
dis.hwndItem = _hwnd;
dis.hDC = hdc;
dis.rcItem.left = 0;
dis.rcItem.top = 0;
dis.rcItem.right = 0;
dis.rcItem.bottom = 0;
/*dis.itemData = 0; */
draw_item(&dis, entry, COLUMNS);
}
SelectObject(hdc, hfontOld);
ReleaseDC(_hwnd, hdc);
x = 0;
for(col=0; col<COLUMNS; col++) {
_positions[col] = x;
cx = _widths[col];
if (cx) {
cx += spc;
if (cx < IMAGE_WIDTH)
cx = IMAGE_WIDTH;
_widths[col] = cx;
}
x += cx;
}
_positions[COLUMNS] = x;
ListBox_SetHorizontalExtent(_hwnd, x);
// no change?
if (!memcmp(orgWidths, _widths, sizeof(orgWidths)))
return FALSE;
// don't move, if only collapsing an entry
if (!anyway && _widths[0]<orgWidths[0] &&
!memcmp(orgWidths+1, _widths+1, sizeof(orgWidths)-sizeof(int))) {
_widths[0] = orgWidths[0];
memcpy(_positions, orgPositions, sizeof(orgPositions));
return FALSE;
}
InvalidateRect(_hwnd, 0, TRUE);
return TRUE;
}


| BOOL Pane::command | ( | UINT | cmd ) |
Definition at line 942 of file pane.cpp.
References MenuInfo::_hMenuView, WindowHandle::_hwnd, _visible_cols, calc_widths(), COL_ALL, Frame_GetMenuInfo, ID_PREFERED_SIZES, ID_VIEW_ALL_ATTRIBUTES, ID_VIEW_NAME, ID_VIEW_SELECTED_ATTRIBUTES, and set_header().
Referenced by FileChildWindow::WndProc().
{
switch(cmd) {
case ID_VIEW_NAME:
if (_visible_cols) {
_visible_cols = 0;
calc_widths(true);
set_header();
InvalidateRect(_hwnd, 0, TRUE);
MenuInfo* menu_info = Frame_GetMenuInfo(GetParent(_hwnd));
if (menu_info) {
CheckMenuItem(menu_info->_hMenuView, ID_VIEW_NAME, MF_BYCOMMAND|MF_CHECKED);
CheckMenuItem(menu_info->_hMenuView, ID_VIEW_ALL_ATTRIBUTES, MF_BYCOMMAND);
CheckMenuItem(menu_info->_hMenuView, ID_VIEW_SELECTED_ATTRIBUTES, MF_BYCOMMAND);
}
}
break;
case ID_VIEW_ALL_ATTRIBUTES:
if (_visible_cols != COL_ALL) {
_visible_cols = COL_ALL;
calc_widths(true);
set_header();
InvalidateRect(_hwnd, 0, TRUE);
MenuInfo* menu_info = Frame_GetMenuInfo(GetParent(_hwnd));
if (menu_info) {
CheckMenuItem(menu_info->_hMenuView, ID_VIEW_NAME, MF_BYCOMMAND);
CheckMenuItem(menu_info->_hMenuView, ID_VIEW_ALL_ATTRIBUTES, MF_BYCOMMAND|MF_CHECKED);
CheckMenuItem(menu_info->_hMenuView, ID_VIEW_SELECTED_ATTRIBUTES, MF_BYCOMMAND);
}
}
break;
case ID_PREFERED_SIZES: {
calc_widths(true);
set_header();
InvalidateRect(_hwnd, 0, TRUE);
break;}
/*@todo more command ids... */
default:
return FALSE;
}
return TRUE;
}


| bool Pane::create_header | ( | HWND | parent, |
| int | id | ||
| ) |
Definition at line 130 of file pane.cpp.
References ExplorerGlobals::_hInstance, _hwndHeader, _widths, COLUMNS, g_Globals, and HWND.
Referenced by Pane().
{
HWND hwnd = CreateWindow(WC_HEADER, 0, WS_CHILD|WS_VISIBLE|HDS_HORZ/*@todo |HDS_BUTTONS + sort orders*/,
0, 0, 0, 0, hparent, (HMENU)id, g_Globals._hInstance, 0);
if (!hwnd)
return false;
SetWindowFont(hwnd, GetStockFont(DEFAULT_GUI_FONT), FALSE);
HD_ITEM hdi;
hdi.mask = HDI_TEXT|HDI_WIDTH|HDI_FORMAT;
for(int idx=0; idx<COLUMNS; idx++) {
hdi.pszText = g_pos_names[idx];
hdi.fmt = HDF_STRING | g_pos_align[idx];
hdi.cxy = _widths[idx];
Header_InsertItem(hwnd, idx, &hdi);
}
_hwndHeader = hwnd;
return true;
}

| void Pane::draw_item | ( | LPDRAWITEMSTRUCT | dis, |
| Entry * | entry, | ||
| int | calcWidthCol = -1 |
||
| ) |
Definition at line 301 of file pane.cpp.
References Entry::_bhfi, Entry::_bhfi_valid, _clrCompressed, Entry::_content, Entry::_data, Entry::_display_name, Entry::_down, Entry::_expanded, _himl, ExplorerGlobals::_icon_cache, Entry::_icon_id, Entry::_level, Entry::_next, _out_wrkr, _positions, OutputWorker::_spaceSize, _stprintf, _treePane, Entry::_type_name, Entry::_up, _visible_cols, _widths, ATTRIBUTE_EXECUTABLE, ATTRIBUTE_SYMBOLIC_LINK, BUFFER_LEN, calc_tabbed_width(), calc_width(), COL_ATTRIBUTES, COL_CONTENT, COL_INDEX, COL_LINKS, COL_SIZE, COL_TYPE, COLUMNS, Icon::draw(), FILE_ATTRIBUTE_ENCRYPTED, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, FILE_ATTRIBUTE_REPARSE_POINT, FILE_ATTRIBUTE_SPARSE_FILE, g_Globals, IconCache::get_icon(), ICID_NONE, IMAGE_HEIGHT, IMAGE_WIDTH, IMG_DOCUMENT, IMG_EXECUTABLE, IMG_FILE, IMG_FOLDER, IMG_FOLDER_CUR, IMG_FOLDER_UP, IMG_NONE, IMG_OPEN_FOLDER, LONGLONGARG, OutputWorker::output_number(), OutputWorker::output_tabbed_text(), OutputWorker::output_text(), and TEXT.
Referenced by calc_single_width(), calc_widths(), and FileChildWindow::WndProc().
{
TCHAR buffer[BUFFER_LEN];
DWORD attrs;
int visible_cols = _visible_cols;
COLORREF bkcolor, textcolor;
RECT focusRect = dis->rcItem;
enum IMAGE img;
int img_pos, cx;
int col = 0;
if (entry) {
attrs = entry->_data.dwFileAttributes;
if (attrs & FILE_ATTRIBUTE_DIRECTORY) {
if (entry->_data.cFileName[0]==TEXT('.') && entry->_data.cFileName[1]==TEXT('.')
&& entry->_data.cFileName[2]==TEXT('\0'))
img = IMG_FOLDER_UP;
else if (entry->_data.cFileName[0]==TEXT('.') && entry->_data.cFileName[1]==TEXT('\0'))
img = IMG_FOLDER_CUR;
else if ((_treePane && (dis->itemState&ODS_FOCUS)))
img = IMG_OPEN_FOLDER;
else
img = IMG_FOLDER;
} else {
if (attrs & ATTRIBUTE_EXECUTABLE)
img = IMG_EXECUTABLE;
else if (entry->_type_name)
img = IMG_DOCUMENT;
else
img = IMG_FILE;
}
} else {
attrs = 0;
img = IMG_NONE;
}
if (_treePane) {
if (entry) {
img_pos = dis->rcItem.left + entry->_level*(IMAGE_WIDTH+_out_wrkr._spaceSize.cx);
if (calcWidthCol == -1) {
int x;
int y = dis->rcItem.top + IMAGE_HEIGHT/2;
Entry* up;
RECT rt_clip;
HRGN hrgn_org = CreateRectRgn(0, 0, 0, 0);
HRGN hrgn;
rt_clip.left = dis->rcItem.left;
rt_clip.top = dis->rcItem.top;
rt_clip.right = dis->rcItem.left+_widths[col];
rt_clip.bottom = dis->rcItem.bottom;
hrgn = CreateRectRgnIndirect(&rt_clip);
if (!GetClipRgn(dis->hDC, hrgn_org)) {
DeleteObject(hrgn_org);
hrgn_org = 0;
}
//HGDIOBJ holdPen = SelectObject(dis->hDC, GetStockObject(BLACK_PEN));
ExtSelectClipRgn(dis->hDC, hrgn, RGN_AND);
DeleteObject(hrgn);
if ((up=entry->_up) != NULL) {
MoveToEx(dis->hDC, img_pos-IMAGE_WIDTH/2, y, 0);
LineTo(dis->hDC, img_pos-2, y);
x = img_pos - IMAGE_WIDTH/2;
do {
x -= IMAGE_WIDTH+_out_wrkr._spaceSize.cx;
if (up->_next) {
#ifndef _LEFT_FILES
bool following_child = (up->_next->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)!=0; // a directory?
if (!following_child) {
for(Entry*n=up->_next; n; n=n->_next)
if (n->_down) { // any file with NTFS sub-streams?
following_child = true;
break;
}
}
if (following_child)
#endif
{
MoveToEx(dis->hDC, x, dis->rcItem.top, 0);
LineTo(dis->hDC, x, dis->rcItem.bottom);
}
}
} while((up=up->_up) != NULL);
}
x = img_pos - IMAGE_WIDTH/2;
MoveToEx(dis->hDC, x, dis->rcItem.top, 0);
LineTo(dis->hDC, x, y);
if (entry->_next) {
#ifndef _LEFT_FILES
bool following_child = (entry->_next->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)!=0; // a directory?
if (!following_child) {
for(Entry*n=entry->_next; n; n=n->_next)
if (n->_down) { // any file with NTFS sub-streams?
following_child = true;
break;
}
}
if (following_child)
#endif
LineTo(dis->hDC, x, dis->rcItem.bottom);
}
if (entry->_down && entry->_expanded) {
x += IMAGE_WIDTH + _out_wrkr._spaceSize.cx;
MoveToEx(dis->hDC, x, dis->rcItem.top+IMAGE_HEIGHT, 0);
LineTo(dis->hDC, x, dis->rcItem.bottom);
}
SelectClipRgn(dis->hDC, hrgn_org);
if (hrgn_org) DeleteObject(hrgn_org);
//SelectObject(dis->hDC, holdPen);
} else if (calcWidthCol==col || calcWidthCol==COLUMNS) {
int right = img_pos + IMAGE_WIDTH - _out_wrkr._spaceSize.cx;
if (right > _widths[col])
_widths[col] = right;
}
} else {
img_pos = dis->rcItem.left;
}
} else {
img_pos = dis->rcItem.left;
if (calcWidthCol==col || calcWidthCol==COLUMNS)
_widths[col] = IMAGE_WIDTH;
}
if (calcWidthCol == -1) {
focusRect.left = img_pos -2;
if (attrs & FILE_ATTRIBUTE_COMPRESSED)
textcolor = _clrCompressed;
else
textcolor = RGB(0,0,0);
if (dis->itemState & ODS_FOCUS) {
textcolor = GetSysColor(COLOR_HIGHLIGHTTEXT);
bkcolor = GetSysColor(COLOR_HIGHLIGHT);
} else {
bkcolor = GetSysColor(COLOR_WINDOW);
}
HBRUSH hbrush = CreateSolidBrush(bkcolor);
FillRect(dis->hDC, &focusRect, hbrush);
DeleteObject(hbrush);
SetBkMode(dis->hDC, TRANSPARENT);
SetTextColor(dis->hDC, textcolor);
cx = _widths[col];
if (cx && img!=IMG_NONE) {
if (cx > IMAGE_WIDTH)
cx = IMAGE_WIDTH;
if (entry->_icon_id > ICID_NONE)
g_Globals._icon_cache.get_icon(entry->_icon_id).draw(dis->hDC, img_pos, dis->rcItem.top, cx, GetSystemMetrics(SM_CYSMICON), bkcolor, 0);
else
ImageList_DrawEx(_himl, img, dis->hDC,
img_pos, dis->rcItem.top, cx,
IMAGE_HEIGHT, bkcolor, CLR_DEFAULT, ILD_NORMAL);
}
}
if (!entry)
return;
++col;
// output file name
if (calcWidthCol == -1)
_out_wrkr.output_text(dis, _positions, col, entry->_display_name, 0);
else if (calcWidthCol==col || calcWidthCol==COLUMNS)
calc_width(dis, col, entry->_display_name);
++col;
// output type/class name
if (visible_cols & COL_TYPE) {
if (calcWidthCol == -1)
_out_wrkr.output_text(dis, _positions, col, entry->_type_name? entry->_type_name: TEXT(""), 0);
else if (calcWidthCol==col || calcWidthCol==COLUMNS)
calc_width(dis, col, entry->_type_name? entry->_type_name: TEXT(""));
}
++col;
// display file size
if (visible_cols & COL_SIZE) {
ULONGLONG size = ((ULONGLONG)entry->_data.nFileSizeHigh << 32) | entry->_data.nFileSizeLow;
_stprintf(buffer, TEXT("%") LONGLONGARG TEXT("d"), size);
if (calcWidthCol == -1)
_out_wrkr.output_number(dis, _positions, col, buffer);
else if (calcWidthCol==col || calcWidthCol==COLUMNS)
calc_width(dis, col, buffer); ///@todo not in every case time enough
}
++col;
// display file date
if (visible_cols & (COL_DATE|COL_TIME)) {
format_date(&entry->_data.ftCreationTime, buffer, visible_cols);
if (calcWidthCol == -1)
_out_wrkr.output_text(dis, _positions, col, buffer, 0);
else if (calcWidthCol==col || calcWidthCol==COLUMNS)
calc_width(dis, col, buffer);
++col;
format_date(&entry->_data.ftLastAccessTime, buffer, visible_cols);
if (calcWidthCol == -1)
_out_wrkr.output_text(dis,_positions, col, buffer, 0);
else if (calcWidthCol==col || calcWidthCol==COLUMNS)
calc_width(dis, col, buffer);
++col;
format_date(&entry->_data.ftLastWriteTime, buffer, visible_cols);
if (calcWidthCol == -1)
_out_wrkr.output_text(dis, _positions, col, buffer, 0);
else if (calcWidthCol==col || calcWidthCol==COLUMNS)
calc_width(dis, col, buffer);
++col;
} else
col += 3;
if (entry->_bhfi_valid) {
ULONGLONG index = ((ULONGLONG)entry->_bhfi.nFileIndexHigh << 32) | entry->_bhfi.nFileIndexLow;
if (visible_cols & COL_INDEX) {
_stprintf(buffer, TEXT("%") LONGLONGARG TEXT("X"), index);
if (calcWidthCol == -1)
_out_wrkr.output_text(dis, _positions, col, buffer, DT_RIGHT);
else if (calcWidthCol==col || calcWidthCol==COLUMNS)
calc_width(dis, col, buffer);
++col;
}
if (visible_cols & COL_LINKS) {
wsprintf(buffer, TEXT("%d"), entry->_bhfi.nNumberOfLinks);
if (calcWidthCol == -1)
_out_wrkr.output_text(dis, _positions, col, buffer, DT_RIGHT);
else if (calcWidthCol==col || calcWidthCol==COLUMNS)
calc_width(dis, col, buffer);
++col;
}
} else
col += 2;
// show file attributes
if (visible_cols & COL_ATTRIBUTES) {
lstrcpy(buffer, TEXT(" \t \t \t \t \t \t \t \t \t \t \t \t \t \t "));
if (attrs & FILE_ATTRIBUTE_NORMAL) buffer[ 0] = 'N';
else {
if (attrs & FILE_ATTRIBUTE_READONLY) buffer[ 2] = 'R';
if (attrs & FILE_ATTRIBUTE_HIDDEN) buffer[ 4] = 'H';
if (attrs & FILE_ATTRIBUTE_SYSTEM) buffer[ 6] = 'S';
if (attrs & FILE_ATTRIBUTE_ARCHIVE) buffer[ 8] = 'A';
if (attrs & FILE_ATTRIBUTE_COMPRESSED) buffer[10] = 'C';
if (attrs & FILE_ATTRIBUTE_DIRECTORY) buffer[12] = 'D';
if (attrs & FILE_ATTRIBUTE_ENCRYPTED) buffer[14] = 'E';
if (attrs & FILE_ATTRIBUTE_TEMPORARY) buffer[16] = 'T';
if (attrs & FILE_ATTRIBUTE_SPARSE_FILE) buffer[18] = 'P';
if (attrs & FILE_ATTRIBUTE_REPARSE_POINT) buffer[20] = 'Q';
if (attrs & FILE_ATTRIBUTE_OFFLINE) buffer[22] = 'O';
if (attrs & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) buffer[24] = 'X';
if (attrs & ATTRIBUTE_EXECUTABLE) buffer[26] = 'x';
if (attrs & ATTRIBUTE_SYMBOLIC_LINK) buffer[28] = 'L';
}
if (calcWidthCol == -1)
_out_wrkr.output_tabbed_text(dis, _positions, col, buffer);
else if (calcWidthCol==col || calcWidthCol==COLUMNS)
calc_tabbed_width(dis, col, buffer);
}
++col;
/*TODO
if (flags.security) {
DWORD rights = get_access_mask();
tcscpy(buffer, TEXT(" \t \t \t \t \t \t \t \t \t \t \t "));
if (rights & FILE_READ_DATA) buffer[ 0] = 'R';
if (rights & FILE_WRITE_DATA) buffer[ 2] = 'W';
if (rights & FILE_APPEND_DATA) buffer[ 4] = 'A';
if (rights & FILE_READ_EA) {buffer[6] = 'entry'; buffer[ 7] = 'R';}
if (rights & FILE_WRITE_EA) {buffer[9] = 'entry'; buffer[10] = 'W';}
if (rights & FILE_EXECUTE) buffer[12] = 'X';
if (rights & FILE_DELETE_CHILD) buffer[14] = 'D';
if (rights & FILE_READ_ATTRIBUTES) {buffer[16] = 'a'; buffer[17] = 'R';}
if (rights & FILE_WRITE_ATTRIBUTES) {buffer[19] = 'a'; buffer[20] = 'W';}
if (rights & WRITE_DAC) buffer[22] = 'C';
if (rights & WRITE_OWNER) buffer[24] = 'O';
if (rights & SYNCHRONIZE) buffer[26] = 'S';
output_text(dis, col++, buffer, DT_LEFT, 3, psize);
}
if (flags.description) {
get_description(buffer);
output_text(dis, col++, buffer, 0, psize);
}
*/
++col;
// output content / symbolic link target / comment
if (visible_cols & COL_CONTENT) {
if (calcWidthCol == -1)
_out_wrkr.output_text(dis, _positions, col, entry->_content? entry->_content: TEXT(""), 0);
else if (calcWidthCol==col || calcWidthCol==COLUMNS)
calc_width(dis, col, entry->_content? entry->_content: TEXT(""));
}
}


| MainFrameBase * Pane::get_frame | ( | ) | [read, protected] |
Definition at line 990 of file pane.cpp.
References WindowHandle::_hwnd, and HWND.
{
HWND owner = GetParent(_hwnd);
return (MainFrameBase*)owner;
}
| void Pane::init | ( | ) |
Definition at line 156 of file pane.cpp.
References _clrCompressed, OutputWorker::_hfont, _himl, ExplorerGlobals::_hInstance, WindowHandle::_hwnd, _out_wrkr, calc_widths(), g_Globals, IDB_IMAGES, OutputWorker::init_output(), and TEXT.
Referenced by Pane().
{
_himl = ImageList_LoadBitmap(g_Globals._hInstance, MAKEINTRESOURCE(IDB_IMAGES), 16, 0, RGB(0,255,0));
SetWindowFont(_hwnd, _out_wrkr._hfont, FALSE);
// read the color for compressed files from registry
HKEY hkeyExplorer = 0;
DWORD len = sizeof(_clrCompressed);
if (RegOpenKey(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer"), &hkeyExplorer) ||
RegQueryValueEx(hkeyExplorer, TEXT("AltColor"), 0, NULL, (LPBYTE)&_clrCompressed, &len) || len!=sizeof(_clrCompressed))
_clrCompressed = RGB(0,0,255);
if (hkeyExplorer)
RegCloseKey(hkeyExplorer);
// calculate column widths
_out_wrkr.init_output(_hwnd);
calc_widths(true);
}


| int Pane::insert_entries | ( | Entry * | dir, |
| int | idx = -1 |
||
| ) |
Definition at line 661 of file pane.cpp.
References Entry::_data, Entry::_down, Entry::_expanded, WindowHandle::_hwnd, Entry::_next, _treePane, and TEXT.
Referenced by FileChildWindow::expand_entry(), FileChildWindow::jump_to_int(), Pane(), FileChildWindow::scan_entry(), and FileChildWindow::set_curdir().
{
Entry* entry = dir;
if (!entry)
return idx;
for(; entry; entry=entry->_next) {
#ifndef _LEFT_FILES
if (_treePane &&
!(entry->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) && // not a directory?
!entry->_down) // not a file with NTFS sub-streams?
continue;
#endif
// don't display entries "." and ".." in the left pane
if (_treePane && (entry->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
&& entry->_data.cFileName[0]==TEXT('.'))
if (entry->_data.cFileName[1]==TEXT('\0') ||
(entry->_data.cFileName[1]==TEXT('.') && entry->_data.cFileName[2]==TEXT('\0')))
continue;
if (idx != -1)
++idx;
ListBox_InsertItemData(_hwnd, idx, entry);
if (_treePane && entry->_expanded)
idx = insert_entries(entry->_down, idx);
}
return idx;
}

| int Pane::Notify | ( | int | id, |
| NMHDR * | pnmh | ||
| ) | [virtual] |
Reimplemented from SubclassedWindow.
Definition at line 786 of file pane.cpp.
References WindowHandle::_hwnd, _hwndHeader, _positions, _widths, calc_single_width(), COLUMNS, SubclassedWindow::Notify(), and set_header().
{
switch(pnmh->code) {
case HDN_TRACK:
case HDN_ENDTRACK: {
HD_NOTIFY* phdn = (HD_NOTIFY*) pnmh;
int idx = phdn->iItem;
int dx = phdn->pitem->cxy - _widths[idx];
int i;
ClientRect clnt(_hwnd);
// move immediate to simulate HDS_FULLDRAG (for now [04/2000] not realy needed with WINELIB)
Header_SetItem(_hwndHeader, idx, phdn->pitem);
_widths[idx] += dx;
for(i=idx; ++i<=COLUMNS; )
_positions[i] += dx;
{
int scroll_pos = GetScrollPos(_hwnd, SB_HORZ);
RECT rt_scr;
RECT rt_clip;
rt_scr.left = _positions[idx+1]-scroll_pos;
rt_scr.top = 0;
rt_scr.right = clnt.right;
rt_scr.bottom = clnt.bottom;
rt_clip.left = _positions[idx]-scroll_pos;
rt_clip.top = 0;
rt_clip.right = clnt.right;
rt_clip.bottom = clnt.bottom;
if (rt_scr.left < 0) rt_scr.left = 0;
if (rt_clip.left < 0) rt_clip.left = 0;
ScrollWindowEx(_hwnd, dx, 0, &rt_scr, &rt_clip, 0, 0, SW_INVALIDATE);
rt_clip.right = _positions[idx+1];
RedrawWindow(_hwnd, &rt_clip, 0, RDW_INVALIDATE|RDW_UPDATENOW);
if (pnmh->code == HDN_ENDTRACK) {
ListBox_SetHorizontalExtent(_hwnd, _positions[COLUMNS]);
if (GetScrollPos(_hwnd, SB_HORZ) != scroll_pos)
set_header();
}
}
return 0;
}
case HDN_DIVIDERDBLCLICK: {
HD_NOTIFY* phdn = (HD_NOTIFY*) pnmh;
HD_ITEM item;
calc_single_width(phdn->iItem);
item.mask = HDI_WIDTH;
item.cxy = _widths[phdn->iItem];
Header_SetItem(_hwndHeader, phdn->iItem, &item);
InvalidateRect(_hwnd, 0, TRUE);
break;}
default:
return super::Notify(id, pnmh);
}
return 0;
}

| void Pane::set_header | ( | ) |
Definition at line 696 of file pane.cpp.
References WindowHandle::_hwnd, _hwndHeader, _widths, and COLUMNS.
Referenced by FileChildWindow::activate_entry(), command(), FileChildWindow::expand_entry(), FileChildWindow::jump_to_int(), Notify(), FileChildWindow::scan_entry(), FileChildWindow::set_curdir(), and WndProc().
{
HD_ITEM item;
int scroll_pos = GetScrollPos(_hwnd, SB_HORZ);
int i=0, x=0;
item.mask = HDI_WIDTH;
item.cxy = 0;
for(; x+_widths[i]<scroll_pos && i<COLUMNS; i++) {
x += _widths[i];
Header_SetItem(_hwndHeader, i, &item);
}
if (i < COLUMNS) {
x += _widths[i];
item.cxy = x - scroll_pos;
Header_SetItem(_hwndHeader, i++, &item);
for(; i<COLUMNS; i++) {
item.cxy = _widths[i];
x += _widths[i];
Header_SetItem(_hwndHeader, i, &item);
}
}
}

| LRESULT Pane::WndProc | ( | UINT | nmsg, |
| WPARAM | wparam, | ||
| LPARAM | lparam | ||
| ) | [protected, virtual] |
Reimplemented from SubclassedWindow.
Definition at line 101 of file pane.cpp.
References WindowHandle::_hwnd, PM_GET_FILEWND_PTR, FileChildWindow::set_focus_pane(), set_header(), FileChildWindow::switch_focus_pane(), and SubclassedWindow::WndProc().
{
switch(nmsg) {
case WM_HSCROLL:
set_header();
break;
case WM_SETFOCUS: {
FileChildWindow* child = (FileChildWindow*) SendMessage(GetParent(_hwnd), PM_GET_FILEWND_PTR, 0, 0);
child->set_focus_pane(this);
ListBox_SetSel(_hwnd, TRUE, 1);
/*@todo check menu items */
break;}
case WM_KEYDOWN: {
FileChildWindow* child = (FileChildWindow*) SendMessage(GetParent(_hwnd), PM_GET_FILEWND_PTR, 0, 0);
if (wparam == VK_TAB) {
/*@todo SetFocus(g_Globals.hdrivebar) */
child->switch_focus_pane();
}
break;}
}
return super::WndProc(nmsg, wparam, lparam);
}

| COLORREF Pane::_clrCompressed |
Definition at line 82 of file pane.h.
Referenced by draw_item(), and init().
Definition at line 80 of file pane.h.
Referenced by FileChildWindow::activate_entry(), FileChildWindow::Command(), FileChildWindow::FileChildWindow(), FileChildWindow::refresh(), FileChildWindow::set_curdir(), and FileChildWindow::WndProc().
HIMAGELIST Pane::_himl [protected] |
Definition at line 107 of file pane.h.
Referenced by draw_item(), init(), and ~Pane().
Definition at line 77 of file pane.h.
Referenced by create_header(), Notify(), FileChildWindow::resize_children(), and set_header().
OutputWorker Pane::_out_wrkr [protected] |
Definition at line 108 of file pane.h.
Referenced by calc_single_width(), calc_widths(), draw_item(), and init().
| int Pane::_positions[COLUMNS+1] |
Definition at line 75 of file pane.h.
Referenced by calc_single_width(), calc_widths(), draw_item(), and Notify().
Definition at line 79 of file pane.h.
Referenced by Pane(), and FileChildWindow::set_curdir().
| bool Pane::_treePane |
Definition at line 85 of file pane.h.
Referenced by FileChildWindow::activate_entry(), draw_item(), and insert_entries().
Definition at line 84 of file pane.h.
Referenced by command(), and draw_item().
| int Pane::_widths[COLUMNS] |
Definition at line 74 of file pane.h.
Referenced by calc_single_width(), calc_tabbed_width(), calc_width(), calc_widths(), create_header(), draw_item(), Notify(), and set_header().
|
ROS Explorer Source Code Documentation
generated on 02.01.2013 by
|