Ticket #1208: 20070816 - Ticket 1208.diff

File 20070816 - Ticket 1208.diff, 8.2 KB (added by anxiety, 17 years ago)

Diff file, needs to be reviewed.

  • src/apps/mail/Mail.h

     
    9292    M_SIZE,
    9393    M_BEGINNER,
    9494    M_EXPERT,
     95
    9596    /* file */
    9697    M_REPLY,
    9798    M_REPLY_TO_SENDER,
     
    117118    M_STATUS,
    118119    M_OPEN_MAIL_BOX,
    119120    M_OPEN_MAIL_FOLDER,
     121
    120122    /* edit */
    121123    M_SELECT,
    122124    M_QUOTE,
     
    127129    M_SIG_MENU,
    128130    M_FIND,
    129131    M_FIND_AGAIN,
     132
     133    /* queries */
     134    M_EDIT_QUERIES,
     135    M_EXECUTE_QUERY,
     136
    130137    /* encls */
    131138    M_ADD,
    132139    M_REMOVE,
    133140    M_OPEN,
    134141    M_COPY,
     142
    135143    /* nav */
    136144    M_NEXTMSG,
    137145    M_PREVMSG,
    138146    M_SAVE_POSITION,
     147
    139148    /* Spam GUI button and menu items.  Order is important. */
    140149    M_SPAM_BUTTON,
    141150    M_TRAIN_SPAM_AND_DELETE,
     
    261270        status_t TrainMessageAs (const char *CommandWord);
    262271
    263272    private:
     273        const char * _BuildQueryString(BEntry *entry);     
     274
    264275        BEmailMessage   *fMail;
    265276        entry_ref *fRef;            // Reference to currently displayed file
    266277        int32 fFieldState;
  • src/apps/mail/Mail.cpp

     
    119119static const char *kMailFolder = "mail";
    120120static const char *kMailboxFolder = "mail/mailbox";
    121121
     122static const char *kQueriesDirectory = "mail/queries";
     123static const char *kQuerySignature = "application/x-vnd.Be-query"; // B_QUERY_MIMETYPE
     124static const char *kAttrQueryInitialMode = "_trk/qryinitmode"; // taken from src/kits/tracker/Attributes.h
     125static const char *kAttrQueryInitialString = "_trk/qryinitstr";
     126static const char *kAttrQueryInitialNumAttrs = "_trk/qryinitnumattrs";
     127static const char *kAttrQueryInitialAttrs = "_trk/qryinitattrs";
     128static const char *kAttrQueryInitialMime = "_trk/qryinitmime";
     129static const uint32 kAttributeItemMain = 'Fatr'; // taken from src/kits/tracker/FindPanel.h
     130static const uint32 kByNameItem = 'Fbyn'; // taken from src/kits/tracker/FindPanel.h
     131static const uint32 kByAttributeItem = 'Fbya'; // taken from src/kits/tracker/FindPanel.h
     132static const uint32 kByForumlaItem = 'Fbyq'; // taken from src/kits/tracker/FindPanel.h
     133
    122134static const char *kDictDirectory = "word_dictionary";
    123135static const char *kIndexDirectory = "word_index";
    124136static const char *kWordsPath = "/boot/optional/goodies/words";
    125137static const char *kExact = ".exact";
    126138static const char *kMetaphone = ".metaphone";
    127139
    128 
    129140// Text for both the main menu and the pop-up menu.
    130141static const char *kSpamMenuItemTextArray[] = {
    131142    "Mark as Spam and Move to Trash",       // M_TRAIN_SPAM_AND_DELETE
     
    12271238
    12281239//  #pragma mark -
    12291240
     1241/*
     1242// Copied from src/kits/tracker/FindPanel.cpp.
     1243uint32
     1244TMailWindow::InitialMode(const BNode *node)
     1245{
     1246    if (!node || node->InitCheck() != B_OK)
     1247        return kByNameItem;
     1248   
     1249    uint32 result;
     1250    if (node->ReadAttr(kAttrQueryInitialMode, B_INT32_TYPE, 0,
     1251        (int32 *)&result, sizeof(int32)) <= 0)
     1252        return kByNameItem;
    12301253
     1254    return result;
     1255}
     1256
     1257
     1258// Copied from src/kits/tracker/FindPanel.cpp.
     1259int32
     1260TMailWindow::InitialAttrCount(const BNode *node)
     1261{
     1262    if (!node || node->InitCheck() != B_OK)
     1263        return 1;
     1264   
     1265    int32 result;
     1266    if (node->ReadAttr(kAttrQueryInitialNumAttrs, B_INT32_TYPE, 0,
     1267        &result, sizeof(int32)) <= 0)
     1268        return 1;
     1269   
     1270    return result;
     1271}*/
     1272
     1273
    12311274TMailWindow::TMailWindow(BRect rect, const char *title, const entry_ref *ref,
    12321275        const char *to, const BFont *font, bool resending, BMessenger *messenger)
    12331276    : BWindow(rect, title, B_DOCUMENT_WINDOW, 0),
     
    14441487    item->SetTarget(be_app);
    14451488    menu_bar->AddItem(menu);
    14461489   
     1490    //
    14471491    // View Menu
    1448    
     1492    //
    14491493    if (!resending && fIncoming) {
    14501494        menu = new BMenu("View");
    14511495        menu->AddItem(fHeader = new BMenuItem(MDR_DIALECT_CHOICE ("Show Header","H) ヘッダーを表示"),  new BMessage(M_HEADER), 'H'));
     
    15611605        menu_bar->AddItem(menu);
    15621606    }
    15631607   
     1608    //
     1609    // Queries Menu
     1610    //
     1611    menu = new BMenu(MDR_DIALECT_CHOICE("Queries","???"));
     1612    menu->AddItem(new BMenuItem(MDR_DIALECT_CHOICE("Edit Queries...","???..."), new BMessage(M_EDIT_QUERIES), 'E', B_SHIFT_KEY));
     1613    menu->AddSeparatorItem();
     1614    menu_bar->AddItem(menu);
     1615
     1616    BPath queryPath;
     1617    // Get the user home directory
     1618    if (find_directory(B_USER_DIRECTORY, &queryPath) == B_OK) {
     1619        queryPath.Append(kQueriesDirectory);
     1620    }
     1621   
     1622    BDirectory queryDir(queryPath.Path());
     1623
     1624    //  If we find the named query, add it to the menu.
     1625    BEntry entry;
     1626    while (queryDir.GetNextEntry(&entry) == B_OK) {
     1627
     1628        char name[B_FILE_NAME_LENGTH + 1];
     1629        entry.GetName(name);
     1630       
     1631        const char * queryString = _BuildQueryString(&entry);
     1632        if (queryString == NULL)
     1633            continue;
     1634       
     1635        QueryMenu *queryMenu = new QueryMenu(name, false);
     1636        queryMenu->SetTargetForItems(be_app);
     1637        queryMenu->SetPredicate(queryString);
     1638        menu->AddItem(queryMenu);
     1639       
     1640        delete queryString;
     1641    }
     1642
     1643    //
     1644    // Menu Bar
     1645    //
    15641646    Lock();
    15651647    AddChild(menu_bar);
    15661648    height = menu_bar->Bounds().bottom + 1;
     
    16681750        SetTitleForMessage();
    16691751}
    16701752
     1753const char *
     1754TMailWindow::_BuildQueryString(BEntry *entry)
     1755{
     1756    BNode node(entry);
     1757    if (node.InitCheck() != B_OK)
     1758        return NULL;
    16711759
     1760    uint32 mode;
     1761    if (node.ReadAttr(kAttrQueryInitialMode, B_INT32_TYPE, 0, (int32 *)&mode, sizeof(int32)) <= 0)
     1762        mode = kByNameItem;
     1763   
     1764    BString queryString;
     1765    switch(mode) {
     1766        case kByForumlaItem:
     1767        {
     1768            BString buffer;
     1769            if (node.ReadAttrString(kAttrQueryInitialString, &buffer) == B_OK)
     1770                queryString << buffer;
     1771            break;
     1772        }
     1773           
     1774        case kByNameItem:
     1775        {
     1776            BString buffer;
     1777            if (node.ReadAttrString(kAttrQueryInitialString, &buffer) == B_OK)
     1778                queryString << "(name==*" << buffer << "*)";
     1779            break;
     1780        }
     1781       
     1782        case kByAttributeItem:
     1783        {
     1784            int32 count = 1;
     1785            if (node.ReadAttr(kAttrQueryInitialNumAttrs, B_INT32_TYPE, 0, (int32 *)&mode, sizeof(int32)) <= 0)
     1786                count = 1;
     1787               
     1788            attr_info info;
     1789            if (node.GetAttrInfo(kAttrQueryInitialAttrs, &info) != B_OK)
     1790                break;
     1791       
     1792            if (count > 1 )
     1793                queryString << "(";
     1794
     1795            char *buffer = new char[info.size];
     1796            if (node.ReadAttr(kAttrQueryInitialAttrs, B_MESSAGE_TYPE, 0, buffer, (size_t)info.size) == info.size) {
     1797                BMessage message;
     1798                if (message.Unflatten(buffer) == B_OK) {
     1799                    for (int32 index = 0; /*index < count*/; index++) {
     1800
     1801                        const char *field;
     1802                        const char *value;
     1803                        if (message.FindString("menuSelection", index, &field) != B_OK
     1804                            || message.FindString("attrViewText", index, &value) != B_OK)
     1805                            break;
     1806                           
     1807                        // ignore the mime type, we'll force it to be email later
     1808                        if (strcmp(field, "BEOS:TYPE") != 0)
     1809                        {
     1810                            // TODO: check if subMenu contains the type of comparison we are suppose to make here
     1811                            queryString << "(" << field << "==\"" << value << "\")";
     1812
     1813                            int32 logicMenuSelectedIndex;
     1814                            if (message.FindInt32("logicalRelation", index, &logicMenuSelectedIndex) == B_OK) {
     1815                                if (logicMenuSelectedIndex == 0)
     1816                                    queryString << "&&";
     1817                                else if (logicMenuSelectedIndex == 1)
     1818                                    queryString << "||";
     1819                            } else
     1820                                break;
     1821                        }
     1822                    }
     1823                }
     1824            }
     1825           
     1826            if (count > 1 )
     1827                queryString << ")";
     1828
     1829            delete [] buffer;
     1830            break;
     1831        }
     1832           
     1833        default:
     1834            break;
     1835    }
     1836   
     1837    if (queryString.Length() == 0)
     1838        return NULL;
     1839       
     1840    // force it to check for email only     
     1841    if (queryString.FindFirst("text/x-email") < 0 ) {
     1842        BString temp;
     1843        temp << "(" << queryString << "&&(BEOS:TYPE==\"text/x-email\"))";
     1844        queryString = temp;
     1845    }
     1846   
     1847    char * string = (char *)malloc( queryString.Length() );
     1848    sprintf( string, "%s", queryString.String() );
     1849
     1850    return string;
     1851}
     1852
     1853
    16721854void
    16731855TMailWindow::BuildButtonBar()
    16741856{
     
    25892771                fContentView->fTextView->EnableSpellCheck(fSpelling->IsMarked());
    25902772            }
    25912773            break;
     2774           
     2775        case M_EDIT_QUERIES:
     2776        {
     2777            BEntry folderEntry;
     2778            BPath path;
     2779            // Get the user home directory
     2780            if (find_directory(B_USER_DIRECTORY, &path) != B_OK)
     2781                break;
     2782            path.Append(kQueriesDirectory);
     2783            if (folderEntry.SetTo(path.Path()) == B_OK && folderEntry.Exists())
     2784            {
     2785                BMessage thePackage(B_REFS_RECEIVED);
     2786                BMessenger tracker("application/x-vnd.Be-TRAK");
    25922787
     2788                entry_ref ref;
     2789                folderEntry.GetRef(&ref);
     2790                thePackage.AddRef("refs", &ref);
     2791                tracker.SendMessage(&thePackage);
     2792            }
     2793            break;
     2794        }
     2795
    25932796        default:
    25942797            BWindow::MessageReceived(msg);
    25952798    }