Ticket #6374: TrackerInitialState.cpp.2.patch

File TrackerInitialState.cpp.2.patch, 12.8 KB (added by mt, 13 years ago)
  • src/kits/tracker/TrackerInitialState.cpp

     
    4646#include <Path.h>
    4747#include <Screen.h>
    4848#include <VolumeRoster.h>
     49#include <InterfaceDefs.h>
    4950
    5051#include <fs_attr.h>
    5152#include <fs_index.h>
     
    6162#include "FSUtils.h"
    6263#include "QueryContainerWindow.h"
    6364#include "Tracker.h"
     65#include "ViewState.h"
     66#include "AutoDeleter.h"
    6467
     68
    6569enum {
    6670    kForceLargeIcon = 0x1,
    6771    kForceMiniIcon = 0x2,
     
    99103const BRect kDefaultFrame(40, 40, 500, 350);
    100104const int32 kDefaultQueryTemplateCount = 3;
    101105
    102 const AttributeTemplate kDefaultQueryTemplate[] =
    103     /* /boot/home/config/settings/Tracker/DefaultQueryTemplates/application_octet-stream */
     106char* fDefaultQueryColumnsBits = NULL;
     107char* fBookmarkQueryColumnsBits = NULL;
     108char* fPersonQueryColumnsBits = NULL;
     109char* fEmailQueryColumnsBits = NULL;
     110
     111struct ColumnData
    104112{
    105     {        /* default frame */
     113    const char* title;
     114    float   offset;
     115    float width;
     116    alignment align;
     117    const char* attributeName;
     118    uint32 attrType;
     119    bool statField;
     120    bool editable;
     121};
     122
     123static
     124AttributeTemplate defaultQueryTemplate[] =
     125    /* /boot/home/config/settings/Tracker/DefaultQueryTemplates/
     126        application_octet-stream */
     127{
     128    {       /* default frame */
    106129        kAttrWindowFrame,
    107130        B_RECT_TYPE,
    108131        16,
     
    120143        kAttrColumns_be,
    121144        B_RAW_TYPE,
    122145        223,
    123         "O\362VR\000\000\000\025\000\000\000\004Name\000B \000\000C\021\000"
    124         "\000\000\000\000\000\000\000\000\012_stat/name\000\357\323\335RCST"
    125         "R\001\001O\362VR\000\000\000\025\000\000\000\004Path\000CH\000\000"
    126         "Ca\000\000\000\000\000\000\000\000\000\011_trk/path\000\357_\174RC"
    127         "STR\000\000O\362VR\000\000\000\025\000\000\000\004Size\000C\334\000"
    128         "\000B$\000\000\000\000\000\001\000\000\000\012_stat/size\000\317\317"
    129         "\306TOFFT\001\000O\362VR\000\000\000\025\000\000\000\010Modified\000"
    130         "C\370\000\000C\012\000\000\000\000\000\000\000\000\000\016_stat/mo"
    131         "dified\000]KmETIME\001\000"
     146        NULL
    132147    }
    133148};
    134149
    135 const AttributeTemplate kBookmarkQueryTemplate[] =
    136     /* /boot/home/config/settings/Tracker/DefaultQueryTemplates/application_x-vnd.Be-bookmark */
     150#undef B_TRANSLATE_CONTEXT
     151#define B_TRANSLATE_CONTEXT "DefaultQueryColumns"
     152
     153static
     154ColumnData defaultQueryColumns[]=
    137155{
    138     {        /* default frame */
     156    {
     157        B_TRANSLATE_MARK("Name"),
     158        40,
     159        145,
     160        B_ALIGN_LEFT,
     161        "_stat/name",
     162        B_STRING_TYPE,
     163        true,
     164        true
     165    },
     166    {
     167        B_TRANSLATE_MARK("Path"),
     168        200,
     169        225,
     170        B_ALIGN_LEFT,
     171        "_trk/path",
     172        B_STRING_TYPE,
     173        false,
     174        false
     175    },
     176    {
     177        B_TRANSLATE_MARK("Size"),
     178        440,
     179        41,
     180        B_ALIGN_LEFT,
     181        "_stat/size",
     182        B_OFF_T_TYPE,
     183        true,
     184        false
     185        },
     186    {
     187        B_TRANSLATE_MARK("Modified"),
     188        496,
     189        138,
     190        B_ALIGN_LEFT,
     191        " _stat/modified",
     192        B_TIME_TYPE,
     193        true,
     194        false
     195    }
     196
     197};
     198
     199static
     200AttributeTemplate bookmarkQueryTemplate[] =
     201    /* /boot/home/config/settings/Tracker/DefaultQueryTemplates/
     202        application_x-vnd.Be-bookmark */
     203{
     204    {       /* default frame */
    139205        kAttrWindowFrame,
    140206        B_RECT_TYPE,
    141207        16,
    142         (const char *)&kDefaultFrame
     208        (const char* )&kDefaultFrame
    143209    },
    144210    {        /* attr: _trk/viewstate */
    145211        kAttrViewState_be,
     
    153219        kAttrColumns_be,
    154220        B_RAW_TYPE,
    155221        163,
    156         "O\362VR\000\000\000\025\000\000\000\005Title\000B \000\000C+\000\000"
    157         "\000\000\000\000\000\000\000\012META:title\000w\373\175RCSTR\000\001"
    158         "O\362VR\000\000\000\025\000\000\000\003URL\000Cb\000\000C\217\200\000"
    159         "\000\000\000\000\000\000\000\010META:url\000\343[TRCSTR\000\001O\362"
    160         "VR\000\000\000\025\000\000\000\010Keywords\000D\004\000\000C\002\000"
    161         "\000\000\000\000\000\000\000\000\011META:keyw\000\333\363\334RCSTR"
    162         "\000\001"
     222        NULL
    163223    }
    164224};
    165225
    166 const AttributeTemplate kPersonQueryTemplate[] =
    167     /* /boot/home/config/settings/Tracker/DefaultQueryTemplates/application_x-vnd.Be-bookmark */
     226#undef B_TRANSLATE_CONTEXT
     227#define B_TRANSLATE_CONTEXT "bookmarkQueryColumns"
     228
     229static
     230ColumnData bookmarkQueryColumns[]=
    168231{
    169     {        /* default frame */
     232    {
     233        B_TRANSLATE_MARK("Title"),
     234        40,
     235        171,
     236        B_ALIGN_LEFT,
     237        "META:title",
     238        B_STRING_TYPE,
     239        false,
     240        true
     241    },
     242    {
     243        B_TRANSLATE_MARK("URL"),
     244        226,
     245        287,
     246        B_ALIGN_LEFT,
     247        kAttrURL,
     248        B_STRING_TYPE,
     249        false,
     250        true
     251    },
     252    {
     253        B_TRANSLATE_MARK("Keywords"),
     254        528,
     255        130,
     256        B_ALIGN_LEFT,
     257        "META:keyw",
     258        B_STRING_TYPE,
     259        false,
     260        true
     261    }
     262};
     263
     264static
     265AttributeTemplate personQueryTemplate[] =
     266    /* /boot/home/config/settings/Tracker/DefaultQueryTemplates/
     267        application_x-vnd.Be-bookmark */
     268{
     269    {       /* default frame */
    170270        kAttrWindowFrame,
    171271        B_RECT_TYPE,
    172272        16,
     
    184284        kAttrColumns_be,
    185285        B_RAW_TYPE,
    186286        230,
    187         "O\362VR\000\000\000\025\000\000\000\004Name\000B \000\000B\346\000"
    188         "\000\000\000\000\000\000\000\000\012_stat/name\000\357\323\335RCST"
    189         "R\001\001O\362VR\000\000\000\025\000\000\000\012Work Phone\000C*\000"
    190         "\000B\264\000\000\000\000\000\000\000\000\000\013META:wphone\000C_"
    191         "uRCSTR\000\001O\362VR\000\000\000\025\000\000\000\006E-mail\000C\211"
    192         "\200\000B\272\000\000\000\000\000\000\000\000\000\012META:email\000"
    193         "sW\337RCSTR\000\001O\362VR\000\000\000\025\000\000\000\007Company\000"
    194         "C\277\200\000B\360\000\000\000\000\000\000\000\000\000\014META:com"
    195         "pany\000CS\174RCSTR\000\001"
     287        NULL
    196288    },
    197289};
    198290
    199 const AttributeTemplate kEmailQueryTemplate[] =
     291#undef B_TRANSLATE_CONTEXT
     292#define B_TRANSLATE_CONTEXT "parsonQueryColumns"
     293
     294static
     295ColumnData parsonQueryColumns[]=
     296{
     297    {
     298        B_TRANSLATE_MARK("Name"),
     299        40,
     300        115,
     301        B_ALIGN_LEFT,
     302        "_stat/name",
     303        B_STRING_TYPE,
     304        true,
     305        true
     306    },
     307    {
     308        B_TRANSLATE_MARK("Work Phone"),
     309        170,
     310        90,
     311        B_ALIGN_LEFT,
     312        kAttrWorkPhone,
     313        B_STRING_TYPE,
     314        false,
     315        true
     316    },
     317    {
     318        B_TRANSLATE_MARK("E-mail"),
     319        275,
     320        93,
     321        B_ALIGN_LEFT,
     322        kAttrEmail,
     323        B_STRING_TYPE,
     324        false,
     325        true
     326    },
     327    {
     328        B_TRANSLATE_MARK("Company"),
     329        383,
     330        120,
     331        B_ALIGN_LEFT,
     332        kAttrCompany,
     333        B_STRING_TYPE,
     334        false,
     335        true
     336    }
     337};
     338
     339static
     340AttributeTemplate emailQueryTemplate[] =
    200341    /* /boot/home/config/settings/Tracker/DefaultQueryTemplates/text_x-email */
    201342{
    202343    {        /* default frame */
     
    217358        kAttrColumns_be,
    218359        B_RAW_TYPE,
    219360        222,
    220         "O\362VR\000\000\000\025\000\000\000\007Subject\000B \000\000B\334\000"
    221         "\000\000\000\000\000\000\000\000\014MAIL:subject\000\343\173\337RC"
    222         "STR\000\000O\362VR\000\000\000\025\000\000\000\004From\000C%\000\000"
    223         "C\031\000\000\000\000\000\000\000\000\000\011MAIL:from\000\317s_RC"
    224         "STR\000\000O\362VR\000\000\000\025\000\000\000\004When\000C\246\200"
    225         "\000B\360\000\000\000\000\000\000\000\000\000\011MAIL:when\000\366"
    226         "_\377ETIME\000\000O\362VR\000\000\000\025\000\000\000\006Status\000"
    227         "C\352\000\000BH\000\000\000\000\000\001\000\000\000\013MAIL:status"
    228         "\000G\363\134RCSTR\000\001"
     361        NULL
    229362    },
    230363};
    231364
     365#undef B_TRANSLATE_CONTEXT
     366#define B_TRANSLATE_CONTEXT "emailQueryColumns"
    232367
     368static
     369ColumnData emailQueryColumns[]=
     370{
     371    {
     372        B_TRANSLATE_MARK("Subject"),
     373        40,
     374        110,
     375        B_ALIGN_LEFT,
     376        "MAIL:subject",
     377        B_STRING_TYPE,
     378        false,
     379        false
     380    },
     381    {
     382        B_TRANSLATE_MARK("From"),
     383        165,
     384        153,
     385        B_ALIGN_LEFT,
     386        "MAIL:from",
     387        B_STRING_TYPE,
     388        false,
     389        false
     390    },
     391    {
     392        B_TRANSLATE_MARK("When"),
     393        333,
     394        120,
     395        B_ALIGN_LEFT,
     396        "MAIL:when",
     397        B_STRING_TYPE,
     398        false,
     399        false
     400    },
     401    {
     402        B_TRANSLATE_MARK("Status"),
     403        468,
     404        50,
     405        B_ALIGN_RIGHT,
     406        "MAIL:status",
     407        B_STRING_TYPE,
     408        false,
     409        true
     410    }
     411};
     412
     413
    233414namespace BPrivate {
    234415
    235416class ExtraAttributeLazyInstaller {
     
    299480
    300481// #pragma mark -
    301482
     483#undef B_TRANSLATE_CONTEXT
     484#define B_TRANSLATE_CONTEXT "TrackerInitialState"
    302485
     486
    303487static void
    304488InstallTemporaryBackgroundImages(BNode* node, BMessage* message)
    305489{
     
    549733}
    550734
    551735
     736// In TrackerinitialState.cpp, AttributeTemplate.fBits (attr: _trk/columns)
     737// is big endian, So, in little endian machine (like x86),
     738// we need to swap data when making Localized AttributeTemplates.
     739static void
     740StringToStream(const char* src, BMallocIO& stream, bool swap)
     741{
     742    int32 length = strlen(src);
     743    int32 n = length;
     744    if (swap) {
     745        n = SwapInt32(n);
     746    }
     747    stream.Write(&n, sizeof(int32));
     748    stream.Write(src, (size_t)length + 1);
     749}
     750
     751
     752static void
     753BColumnToStream(BColumn* src, BMallocIO& stream, bool swap)
     754{
     755    uint32 key = AttrHashString("BColumn", B_OBJECT_TYPE);
     756    if (swap) {
     757        key = SwapUInt32(key);
     758    }
     759    stream.Write(&key, sizeof(uint32));
     760
     761    int32 version = kColumnStateArchiveVersion;
     762    if (swap) {
     763        version = SwapInt32(version);
     764    }
     765    stream.Write(&version, sizeof(int32));
     766
     767    StringToStream(src->Title(), stream, swap);
     768
     769    float offset = src->Offset();
     770    if (swap) {
     771        offset = B_SWAP_FLOAT(offset);
     772    }
     773    stream.Write(&offset, sizeof(float));
     774
     775    float width = src->Width();
     776    if (swap) {
     777        width = B_SWAP_FLOAT(width);
     778    }
     779    stream.Write(&width, sizeof(float));
     780
     781    alignment align = src->Alignment();
     782    if (swap) {
     783        align = (alignment)SwapInt32(align);
     784    }
     785    stream.Write(&align, sizeof(alignment));
     786
     787    StringToStream(src->AttrName(), stream, swap);
     788
     789    uint32 attrhash = src->AttrHash();
     790    if (swap) {
     791        attrhash = SwapUInt32(attrhash);
     792    }
     793    stream.Write(&attrhash, sizeof(uint32));
     794
     795    uint32 attrtype = src->AttrType();
     796    if (swap) {
     797        attrtype = SwapUInt32(attrtype);
     798    }
     799    stream.Write(&attrtype, sizeof(uint32));
     800
     801    bool statfield = src->StatField();
     802    stream.Write(&statfield, sizeof(bool));
     803
     804    bool editable = src->Editable();
     805    stream.Write(&editable, sizeof(bool));
     806
     807    StringToStream(src->DisplayAs(), stream, swap);
     808}
     809
     810
     811static size_t
     812mkColumnsBits(char** bits, ColumnData* src, int32 nelm, const char* context)
     813{
     814BMallocIO stream;
     815
     816    for (int32 i = 0; i < nelm; i++) {
     817        BColumn* c = new BColumn(
     818            B_TRANSLATE_WITH_CONTEXT((src[i].title), context),
     819            src[i].offset, src[i].width, src[i].align,  src[i].attributeName,
     820            src[i].attrType, src[i].statField, src[i].editable);
     821
     822        if (!c) break;
     823        BColumnToStream(c, stream,
     824            B_HOST_IS_LENDIAN ? true : false);
     825        delete c;
     826    }
     827
     828    size_t n = stream.Position();
     829    *bits = new char[n];
     830    memcpy(*bits, stream.Buffer(), n);
     831
     832return n;
     833}
     834
     835
     836ArrayDeleter<char> defaultQueryColumnsBitsDeleter(fDefaultQueryColumnsBits);
     837ArrayDeleter<char> bookmarkQueryColumnsBitsDeleter(fBookmarkQueryColumnsBits);
     838ArrayDeleter<char> personQueryColumnsBitsDeleter(fPersonQueryColumnsBits);
     839ArrayDeleter<char> emailQueryColumnsBitsDeleter(fEmailQueryColumnsBits);
     840
     841
    552842void
    553843TTracker::InstallDefaultTemplates()
    554844{
     
    558848
    559849    if (!BContainerWindow::DefaultStateSourceNode(query.String(), &node, false))
    560850        if (BContainerWindow::DefaultStateSourceNode(query.String(), &node, true)) {
     851            size_t n = mkColumnsBits(&fDefaultQueryColumnsBits,
     852                defaultQueryColumns, 4, "DefaultQueryColumns");
     853            defaultQueryTemplate[2].fSize = n;
     854            defaultQueryTemplate[2].fBits= fDefaultQueryColumnsBits;
     855
    561856            AttributeStreamFileNode fileNode(&node);
    562             AttributeStreamTemplateNode tmp(kDefaultQueryTemplate, 3);
     857            AttributeStreamTemplateNode tmp(defaultQueryTemplate, 3);
    563858            fileNode << tmp;
    564859        }
    565860
    566861    (query = kQueryTemplates) += "/application_x-vnd.Be-bookmark";
    567862    if (!BContainerWindow::DefaultStateSourceNode(query.String(), &node, false))
    568863        if (BContainerWindow::DefaultStateSourceNode(query.String(), &node, true)) {
     864            size_t n = mkColumnsBits(&fBookmarkQueryColumnsBits,
     865                bookmarkQueryColumns, 3, "bookmarkQueryColumns");
     866            bookmarkQueryTemplate[2].fSize = n;
     867            bookmarkQueryTemplate[2].fBits= fBookmarkQueryColumnsBits;
     868
    569869            AttributeStreamFileNode fileNode(&node);
    570             AttributeStreamTemplateNode tmp(kBookmarkQueryTemplate, 3);
     870            AttributeStreamTemplateNode tmp(bookmarkQueryTemplate, 3);
    571871            fileNode << tmp;
    572872        }
    573873
    574874    (query = kQueryTemplates) += "/application_x-person";
    575875    if (!BContainerWindow::DefaultStateSourceNode(query.String(), &node, false))
    576876        if (BContainerWindow::DefaultStateSourceNode(query.String(), &node, true)) {
     877            size_t n = mkColumnsBits(&fPersonQueryColumnsBits,
     878                parsonQueryColumns, 4, "parsonQueryColumns");
     879            personQueryTemplate[2].fSize = n;
     880            personQueryTemplate[2].fBits= fPersonQueryColumnsBits;
     881
    577882            AttributeStreamFileNode fileNode(&node);
    578             AttributeStreamTemplateNode tmp(kPersonQueryTemplate, 3);
     883            AttributeStreamTemplateNode tmp(personQueryTemplate, 3);
    579884            fileNode << tmp;
    580885        }
    581886
    582887    (query = kQueryTemplates) += "/text_x-email";
    583888    if (!BContainerWindow::DefaultStateSourceNode(query.String(), &node, false))
    584889        if (BContainerWindow::DefaultStateSourceNode(query.String(), &node, true)) {
     890            size_t n = mkColumnsBits(&fEmailQueryColumnsBits,
     891                emailQueryColumns, 4, "emailQueryColumns");
     892            emailQueryTemplate[2].fSize = n;
     893            emailQueryTemplate[2].fBits= fEmailQueryColumnsBits;
     894
    585895            AttributeStreamFileNode fileNode(&node);
    586             AttributeStreamTemplateNode tmp(kEmailQueryTemplate, 3);
     896            AttributeStreamTemplateNode tmp(emailQueryTemplate, 3);
    587897            fileNode << tmp;
    588898        }
    589899}