From d139e286676c7fa67ed208e69f2ee9dc22e2f614 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Wed, 22 Jan 2014 17:42:42 +0000 Subject: QuickSearch: bug of column menu fixed git-svn-id: http://svn.miranda-ng.org/main/trunk@7828 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/QuickSearch/sr_global.pas | 34 +++++++++--------- plugins/QuickSearch/sr_window.pas | 76 ++++++++++++++++++--------------------- 2 files changed, 52 insertions(+), 58 deletions(-) (limited to 'plugins/QuickSearch') diff --git a/plugins/QuickSearch/sr_global.pas b/plugins/QuickSearch/sr_global.pas index fe6a0864e2..050fa3a3ee 100644 --- a/plugins/QuickSearch/sr_global.pas +++ b/plugins/QuickSearch/sr_global.pas @@ -46,15 +46,15 @@ const //types const COL_ON = $0001; // Show column - COL_INIT = $0002; // No need to update COL_FILTER = $0004; // Filter column by pattern // QS window runtime flags + COL_INIT = $0002; // No need to update COL_XSTATUS = $0100; COL_GENDER = $0200; COL_CLIENT = $0400; COL_GROUP = $0800; COL_CNTNR = $1000; - COL_REFRESH = $FF00; // mask + COL_REFRESH = $FF02; // mask const QSO_SORTBYSTATUS = $00000001; // Sort by status @@ -84,13 +84,13 @@ type pcolumnitem = ^tcolumnitem; tcolumnitem = record title :PWideChar; - setting_type :dword; // QST_* constants + setting_type :word; // QST_* constants flags :word; // COL_* constants width :word; case integer of // db setting 0: ( - datatype:integer; // QSTS_* constants + datatype:word; // QSTS_* constants module :pAnsiChar; setting :pAnsiChar; ); @@ -104,9 +104,9 @@ type restype:dword; ); // contact info - 3: (cnftype:dword); // CNF_* constants + 3: (cnftype:word); // CNF_* constants // other - 4: (other:integer); // QSTO_* constants + 4: (other:word); // QSTO_* constants end; tcolumnarray = array of tcolumnitem; @@ -641,15 +641,15 @@ begin p:=StrEnd(IntToStr(pp,num)); with column do begin - StrCopy(p,so__setting_type); WriteWord(buf,setting_type); StrCopy(p,so__title); WriteUnicode(buf,title); - StrCopy(p,so__flags); WriteWord(buf,flags); + StrCopy(p,so__setting_type); WriteWord(buf,setting_type); + StrCopy(p,so__flags); WriteWord(buf,flags and not COL_REFRESH); StrCopy(p,so__width); WriteWord(buf,width); case setting_type of QST_SETTING: begin - StrCopy(p,so__datatype); WriteInt(buf,datatype); - StrCopy(p,so__module ); WriteStr(buf,module); - StrCopy(p,so__setting ); WriteStr(buf,setting); + StrCopy(p,so__datatype); WriteWord(buf,datatype); + StrCopy(p,so__module ); WriteStr (buf,module); + StrCopy(p,so__setting ); WriteStr (buf,setting); end; QST_SCRIPT: begin @@ -680,7 +680,7 @@ begin end; QST_OTHER: begin - StrCopy(p,so__other); WriteInt(buf,other); + StrCopy(p,so__other); WriteWord(buf,other); end; end; end; @@ -779,12 +779,12 @@ begin StrCopy(p,so__setting_type); setting_type:=GetWord(buf,0); StrCopy(p,so__title); title:=GetUnicode(buf); StrCopy(p,so__width); width:=GetWord(buf,20); - StrCopy(p,so__flags); flags:=GetWord(buf,COL_ON); + StrCopy(p,so__flags); flags:=GetWord(buf,COL_ON) and not COL_REFRESH; case setting_type of QST_SETTING: begin - StrCopy(p,so__datatype); datatype:=GetInt(buf,0); - StrCopy(p,so__module ); module :=GetStr(buf); - StrCopy(p,so__setting ); setting :=GetStr(buf); + StrCopy(p,so__datatype); datatype:=GetWord(buf,0); + StrCopy(p,so__module ); module :=GetStr (buf); + StrCopy(p,so__setting ); setting :=GetStr (buf); end; QST_SCRIPT: begin @@ -815,7 +815,7 @@ begin end; QST_OTHER: begin - StrCopy(p,so__other); other:=GetInt(buf,0); + StrCopy(p,so__other); other:=GetWord(buf,0); end; end; end; diff --git a/plugins/QuickSearch/sr_window.pas b/plugins/QuickSearch/sr_window.pas index 64aef6a95d..2c25cf9fd1 100644 --- a/plugins/QuickSearch/sr_window.pas +++ b/plugins/QuickSearch/sr_window.pas @@ -1010,11 +1010,30 @@ begin end; end; +procedure addcolumn(num:integer;column:pcolumnitem); +var + lvcol:LV_COLUMNW; + hdi:THDITEM; +begin + zeromemory(@lvcol,sizeof(lvcol)); + lvcol.mask :=LVCF_TEXT or LVCF_WIDTH; + lvcol.pszText :=TranslateW(column.title); + lvcol.cx :=column.width; + SendMessageW(grid,LVM_INSERTCOLUMNW,num,lparam(@lvcol)); + + // set checkbox in column header + hdi.mask:=HDI_FORMAT; + if (column.flags and COL_FILTER)<>0 then + hdi.fmt:=HDF_LEFT or HDF_STRING or HDF_CHECKBOX or HDF_CHECKED + else + hdi.fmt:=HDF_LEFT or HDF_STRING or HDF_CHECKBOX; + SendMessage(ListView_GetHeader(grid),HDM_SETITEM,num,tlparam(@hdi)); +end; + procedure MakeColumnMenu; var column:pcolumnitem; menu:HMENU; - lvcol:LV_COLUMNW; pt:TPOINT; flag,id,i,j:integer; begin @@ -1031,13 +1050,14 @@ begin end; GetCursorPos(pt); id:=integer(TrackPopupMenu(menu,TPM_RETURNCMD+TPM_NONOTIFY,pt.x,pt.y,0,mainwnd,nil)); - if id>100 then + if id>=100 then begin dec(id,100); column:=@qsopt.columns[id]; - column.flags:=column.flags xor COL_ON; - if (column.flags and COL_ON)<>0 then + // show column + if (column.flags and COL_ON)=0 then begin + column.flags:=column.flags or COL_ON; // memory if (column.flags and COL_INIT)=0 then begin @@ -1049,29 +1069,27 @@ begin end; // screen i:=ColumnToListView(id); - zeromemory(@lvcol,sizeof(lvcol)); - lvcol.mask :=LVCF_TEXT or LVCF_WIDTH; - lvcol.pszText :=TranslateW(column.title); - lvcol.cx :=column.width; - //!! - SendMessageW(grid,LVM_INSERTCOLUMNW,i,tlparam(@lvcol)); + addcolumn(i,column); // fill new column FillLVColumn(id,i); end else + // hide column begin j:=0; + for i:=0 to qsopt.numcolumns-1 do begin if (qsopt.columns[i].flags and COL_ON)<>0 then inc(j); end; - // keep at least one visible column - if j>1 then - SendMessage(grid,LVM_DELETECOLUMN,ColumnToListView(id),0) - else - column.flags:=column.flags or COL_ON; + // keep at least one visible column (1 + this) + if j>2 then + begin + SendMessage(grid,LVM_DELETECOLUMN,ColumnToListView(id),0); + column.flags:=column.flags and not COL_ON; + end; end; end; DestroyMenu(menu); @@ -1625,29 +1643,16 @@ begin qsopt.columns[num].flags:=flags; end; end; -{ -procedure addcolumn(handle:hwnd;num,width:integer;title:PWideChar); -var - lvcol:LV_COLUMNW; -begin - zeromemory(@lvcol,sizeof(lvcol)); - lvcol.mask :=LVCF_TEXT or LVCF_WIDTH; - lvcol.pszText :=title; - lvcol.cx :=width; - SendMessageW(handle,LVM_INSERTCOLUMNW,num,lparam(@lvcol)); -end; -} + // Set columns and clear listview procedure PrepareTable(reset:boolean=false); var lvcol:LV_COLUMNW; hdi:THDITEM; - header:HWND; i:integer; old:integer; begin SendMessage(grid,LVM_DELETEALLITEMS,0,0); - header:=ListView_GetHeader(grid); zeromemory(@hdi,sizeof(hdi)); hdi.mask:=HDI_FORMAT; @@ -1662,18 +1667,7 @@ begin begin if (flags and COL_ON)<>0 then begin - lvcol.pszText:=TranslateW(title); - lvcol.cx :=width; - SendMessageW(grid,LVM_INSERTCOLUMNW,tablecolumns,tlparam(@lvcol)); -// addcolumn(grid,tablecolumns,width,TranslateW(title)); - - // set checkbox in column header - if (flags and COL_FILTER)<>0 then - hdi.fmt:=HDF_LEFT or HDF_STRING or HDF_CHECKBOX or HDF_CHECKED - else - hdi.fmt:=HDF_LEFT or HDF_STRING or HDF_CHECKBOX; - SendMessage(header,HDM_SETITEM,tablecolumns,tlparam(@hdi)); - + addcolumn(tablecolumns,@qsopt.columns[i]); inc(tablecolumns); end; -- cgit v1.2.3