Changeset 6b7ba36 in Renga


Ignore:
Timestamp:
Nov 17, 2023, 11:16:59 AM (7 months ago)
Author:
PulkoMandy <pulkomandy@…>
Branches:
main
Children:
6c9000e
Parents:
e31c992
Message:

Restore hyperlinks functionality in new chat view

Files:
2 deleted
9 edited

Legend:

Unmodified
Added
Removed
  • CMakeLists.txt

    re31c992 r6b7ba36  
    3535        ${CMAKE_SOURCE_DIR}/ui/TalkView.cpp
    3636        ${CMAKE_SOURCE_DIR}/ui/Xhtml.cpp
    37 
    38         ${CMAKE_SOURCE_DIR}/ui/textview/Bullet.cpp
    39         ${CMAKE_SOURCE_DIR}/ui/textview/BulletData.cpp
    40         ${CMAKE_SOURCE_DIR}/ui/textview/CharacterStyle.cpp
    41         ${CMAKE_SOURCE_DIR}/ui/textview/CharacterStyleData.cpp
    42         ${CMAKE_SOURCE_DIR}/ui/textview/Paragraph.cpp
    43         ${CMAKE_SOURCE_DIR}/ui/textview/ParagraphLayout.cpp
    44         ${CMAKE_SOURCE_DIR}/ui/textview/ParagraphStyle.cpp
    45         ${CMAKE_SOURCE_DIR}/ui/textview/ParagraphStyleData.cpp
    46         ${CMAKE_SOURCE_DIR}/ui/textview/TextDocument.cpp
    47         ${CMAKE_SOURCE_DIR}/ui/textview/TextDocumentLayout.cpp
    48         ${CMAKE_SOURCE_DIR}/ui/textview/TextDocumentView.cpp
    49         ${CMAKE_SOURCE_DIR}/ui/textview/TextEditor.cpp
    50         ${CMAKE_SOURCE_DIR}/ui/textview/TextListener.cpp
    51         ${CMAKE_SOURCE_DIR}/ui/textview/TextSelection.cpp
    52         ${CMAKE_SOURCE_DIR}/ui/textview/TextSpan.cpp
    5337)
    5438
     
    5943        # TODO review all these files for usefulness and relevance
    6044         jabber/Agent.cpp
    61          jabber/ChatTextView.cpp
    6245         jabber/LoginPreferencesView.cpp
    6346         jabber/PreferencesWindow.cpp
     
    10285        ui/RotateChatFilter.cpp
    10386        ui/StatusView.cpp
     87
     88        ${CMAKE_SOURCE_DIR}/ui/textview/Bullet.cpp
     89        ${CMAKE_SOURCE_DIR}/ui/textview/BulletData.cpp
     90        ${CMAKE_SOURCE_DIR}/ui/textview/CharacterStyle.cpp
     91        ${CMAKE_SOURCE_DIR}/ui/textview/CharacterStyleData.cpp
     92        ${CMAKE_SOURCE_DIR}/ui/textview/Paragraph.cpp
     93        ${CMAKE_SOURCE_DIR}/ui/textview/ParagraphLayout.cpp
     94        ${CMAKE_SOURCE_DIR}/ui/textview/ParagraphStyle.cpp
     95        ${CMAKE_SOURCE_DIR}/ui/textview/ParagraphStyleData.cpp
     96        ${CMAKE_SOURCE_DIR}/ui/textview/TextDocument.cpp
     97        ${CMAKE_SOURCE_DIR}/ui/textview/TextDocumentLayout.cpp
     98        ${CMAKE_SOURCE_DIR}/ui/textview/TextDocumentView.cpp
     99        ${CMAKE_SOURCE_DIR}/ui/textview/TextEditor.cpp
     100        ${CMAKE_SOURCE_DIR}/ui/textview/TextListener.cpp
     101        ${CMAKE_SOURCE_DIR}/ui/textview/TextSelection.cpp
     102        ${CMAKE_SOURCE_DIR}/ui/textview/TextSpan.cpp
    104103)
    105104
  • ui/TalkView.cpp

    re31c992 r6b7ba36  
    1111#include <be_apps/NetPositive/NetPositive.h>
    1212#include <Catalog.h>
     13#include <Clipboard.h>
    1314#include <FindDirectory.h>
    1415#include <GridView.h>
     
    233234                _idle_timer = new BMessageRunner(this, idleMessage, kSelfPingDelay, -1);
    234235        }
     236
     237        fTimeline->SetTarget(this);
    235238}
    236239
     
    343346                }
    344347
     348                case 'hlnk':
     349                {
     350                        int32 buttons = msg->GetInt32("buttons", 0);
     351                        BString url = msg->GetString("target");
     352
     353                        if (buttons & B_PRIMARY_MOUSE_BUTTON) {
     354                                // load up browser!!
     355                                char *argv[] = {const_cast<char *>(url.String()), NULL};
     356                                if (!be_roster->IsRunning("text/html"))
     357                                        be_roster->Launch("text/html", 1, argv);
     358                                else {
     359                                        BMessenger messenger("text/html");
     360                                        BMessage msg(B_NETPOSITIVE_OPEN_URL);
     361                                        msg.AddString("be:url", url);
     362                                        messenger.SendMessage(&msg);
     363                                }
     364                        } else {
     365                                // popup menu to copy the URL (add it to the existing BTextView menu?)
     366                                BPopUpMenu* menu = new BPopUpMenu(B_EMPTY_STRING, false, false);
     367
     368                                BMessage* copyMessage = new BMessage('hcpy');
     369                                copyMessage->AddString("url", url);
     370                                BMessage* openMessage = new BMessage('hope');
     371                                openMessage->AddString("url", url);
     372
     373                                BLayoutBuilder::Menu<>(menu)
     374                                        .AddItem("Copy link location", copyMessage)
     375                                        .AddItem("Open in browser", openMessage)
     376                                        .End();
     377                                menu->SetTargetForItems(this);
     378                                BPoint pt = msg->FindPoint("where");
     379                                ConvertToScreen(&pt);
     380                                menu->Go(pt, true, true, true);
     381                        }
     382
     383                        break;
     384                }
     385
     386                // From popup menu on hyerlinks
     387                case 'hope':
     388                {
     389                        // Open URL in browser
     390                        BString url = msg->FindString("url");
     391                        char *argv[] = {const_cast<char *>(url.String()), NULL};
     392                        if (!be_roster->IsRunning("text/html"))
     393                                be_roster->Launch("text/html", 1, argv);
     394                        else {
     395                                BMessenger messenger("text/html");
     396                                BMessage msg(B_NETPOSITIVE_OPEN_URL);
     397                                msg.AddString("be:url", url);
     398                                messenger.SendMessage(&msg);
     399                        }
     400                        break;
     401                }
     402                // From popup menu on hyerlinks
     403                case 'hcpy':
     404                {
     405                        be_clipboard->Lock();
     406                        be_clipboard->Clear();
     407                        BMessage* clip = be_clipboard->Data();
     408                        BString string = msg->FindString("url");
     409                        clip->AddData("text/plain", B_MIME_TYPE, string.String(), string.Length());
     410                        be_clipboard->Commit();
     411                        be_clipboard->Unlock();
     412                        break;
     413                }
     414
    345415                case B_OBSERVER_NOTICE_CHANGE:
    346416                {
  • ui/TalkView.h

    re31c992 r6b7ba36  
    3030#include <private/shared/RegExp.h>
    3131
    32 #include "jabber/ChatTextView.h"
    3332#include "jabber/ChatWidget.h"
    3433#include "jabber/UserID.h"
     
    4039enum {
    4140        kIncomingMessage = 'imsg'
     41};
     42
     43
     44struct Hyperlink
     45{
     46        Hyperlink(int32 s, int32 e, BString t)
     47                : start(s), end(e), target(t) {}
     48        Hyperlink(int32 s, int32 e, std::string t)
     49                : start(s), end(e), target(t.c_str()) {}
     50        int32 start;
     51        int32 end;
     52        BString target;
    4253};
    4354
  • ui/Xhtml.h

    re31c992 r6b7ba36  
    99#define XHTML_H
    1010
    11 #include "jabber/ChatTextView.h"
     11#include "ui/TalkView.h"
    1212
    1313#include <gloox/tag.h>
  • ui/textview/TextDocument.cpp

    re31c992 r6b7ba36  
    178178
    179179        return fDefaultCharacterStyle;
     180}
     181
     182
     183const BMessage*
     184TextDocument::ClickMessageAt(int32 textOffset) const
     185{
     186        int32 paragraphOffset;
     187        const Paragraph& paragraph = ParagraphAt(textOffset, paragraphOffset);
     188
     189        textOffset -= paragraphOffset;
     190        int32 index;
     191        int32 count = paragraph.CountTextSpans();
     192
     193        for (index = 0; index < count; index++) {
     194                const TextSpan& span = paragraph.TextSpanAtIndex(index);
     195                if (textOffset - span.CountChars() < 0)
     196                        return span.ClickMessage();
     197                textOffset -= span.CountChars();
     198        }
     199
     200        return NULL;
    180201}
    181202
  • ui/textview/TextDocument.h

    re31c992 r6b7ba36  
    5757                        const ParagraphStyle& ParagraphStyleAt(int32 textOffset) const;
    5858                        const BCursor           CursorAt(int32 textOffset) const;
    59                         const BMessage&         ClickMessageAt(int32 textOffset) const;
     59                        const BMessage*         ClickMessageAt(int32 textOffset) const;
    6060
    6161                        int32                           CountParagraphs() const;
  • ui/textview/TextDocumentView.cpp

    re31c992 r6b7ba36  
    140140TextDocumentView::MouseDown(BPoint where)
    141141{
     142        BMessage* currentMessage = NULL;
     143        if (Window() != NULL)
     144                currentMessage = Window()->CurrentMessage();
     145
     146        // First of all, check for links and other clickable things
     147        bool unused;
     148        int32 offset = fTextDocumentLayout.TextOffsetAt(where.x, where.y, unused);
     149        const BMessage* message = fTextDocument->ClickMessageAt(offset);
     150        if (message != NULL) {
     151                BMessage clickMessage(*message);
     152                clickMessage.Append(*currentMessage);
     153                Invoke(&clickMessage);
     154        }
     155
    142156        if (!fSelectionEnabled)
    143157                return;
     
    146160
    147161        int32 modifiers = 0;
    148         if (Window() != NULL && Window()->CurrentMessage() != NULL)
    149                 Window()->CurrentMessage()->FindInt32("modifiers", &modifiers);
     162        if (currentMessage != NULL)
     163                currentMessage->FindInt32("modifiers", &modifiers);
    150164
    151165        fMouseDown = true;
  • ui/textview/TextDocumentView.h

    re31c992 r6b7ba36  
    66#define TEXT_DOCUMENT_VIEW_H
    77
     8#include <Invoker.h>
    89#include <String.h>
    910#include <View.h>
     
    1819
    1920
    20 class TextDocumentView : public BView {
     21class TextDocumentView : public BView, public BInvoker {
    2122public:
    2223                                                                TextDocumentView(const char* name = NULL);
  • ui/textview/TextSpan.h

    re31c992 r6b7ba36  
    4747                                                                        { return fCursor; }
    4848                        void                            SetClickMessage(BMessage* message);
     49        inline  const BMessage*         ClickMessage() const
     50                                                                        { return fClickMessage.get(); }
    4951private:
    5052                        void                            _TruncateInsert(int32& start) const;
Note: See TracChangeset for help on using the changeset viewer.