From 54bd905223bac1b9f94868e2fc14c9644b840d89 Mon Sep 17 00:00:00 2001
From: Sambuddha Basu <sambuddhabasu1@gmail.com>
Date: Tue, 3 Feb 2015 03:29:32 +0530
Subject: [PATCH] Ticket 8555 - Underline links on mouse over.
B_UNDERSCORE_FACE is not implemented so currently, B_ITALIC_FACE has been
used
---
src/apps/aboutsystem/HyperTextView.cpp | 52 ++++++++++++++++++++++++++++------
src/apps/aboutsystem/HyperTextView.h | 6 ++++
2 files changed, 50 insertions(+), 8 deletions(-)
diff --git a/src/apps/aboutsystem/HyperTextView.cpp b/src/apps/aboutsystem/HyperTextView.cpp
index d1bc4e6..a9fd9ab 100644
a
|
b
|
HyperTextAction::~HyperTextAction()
|
27 | 27 | |
28 | 28 | |
29 | 29 | void |
30 | | HyperTextAction::MouseOver(HyperTextView* view, BPoint where, BMessage* message) |
| 30 | HyperTextAction::MouseOver(HyperTextView* view, BPoint where, int32 startOffset, |
| 31 | int32 endOffset, BMessage* message) |
31 | 32 | { |
32 | 33 | BCursor linkCursor(B_CURSOR_ID_FOLLOW_LINK); |
33 | 34 | view->SetViewCursor(&linkCursor); |
| 35 | |
| 36 | BFont font; |
| 37 | view->GetFont(&font); |
| 38 | font.SetFace(B_ITALIC_FACE); |
| 39 | view->SetFontAndColor(startOffset, endOffset, &font); |
| 40 | } |
| 41 | |
| 42 | |
| 43 | void |
| 44 | HyperTextAction::MouseAway(HyperTextView* view, BPoint where, int32 startOffset, |
| 45 | int32 endOffset, BMessage* message) |
| 46 | { |
| 47 | BFont font(be_plain_font); |
| 48 | view->SetFontAndColor(startOffset, endOffset, &font); |
34 | 49 | } |
35 | 50 | |
36 | 51 | |
… |
… |
HyperTextView::HyperTextView(const char* name, uint32 flags)
|
92 | 107 | BTextView(name, flags), |
93 | 108 | fActionInfos(new ActionInfoList(100, true)) |
94 | 109 | { |
| 110 | this->fLastActionInfo = NULL; |
95 | 111 | } |
96 | 112 | |
97 | 113 | |
… |
… |
HyperTextView::HyperTextView(BRect frame, const char* name, BRect textRect,
|
101 | 117 | BTextView(frame, name, textRect, resizeMask, flags), |
102 | 118 | fActionInfos(new ActionInfoList(100, true)) |
103 | 119 | { |
| 120 | this->fLastActionInfo = NULL; |
104 | 121 | } |
105 | 122 | |
106 | 123 | |
… |
… |
HyperTextView::MouseMoved(BPoint where, uint32 transit,
|
140 | 157 | |
141 | 158 | uint32 buttons; |
142 | 159 | HyperTextAction* action; |
| 160 | const ActionInfo* actionInfo; |
| 161 | if ((actionInfo = this->fLastActionInfo) != NULL |
| 162 | && (action = actionInfo->action) != NULL) { |
| 163 | action->MouseAway(this, where, actionInfo->startOffset, |
| 164 | actionInfo->endOffset, message); |
| 165 | this->fLastActionInfo = NULL; |
| 166 | } |
| 167 | |
143 | 168 | if (message->FindInt32("buttons", (int32*)&buttons) == B_OK |
144 | | && buttons == 0 && (action = _ActionAt(where)) != NULL) { |
145 | | action->MouseOver(this, where, message); |
| 169 | && buttons == 0 && (action = _ActionAt(where)) != NULL |
| 170 | && (actionInfo = _ActionInfoAt(where)) != NULL) { |
| 171 | this->fLastActionInfo = actionInfo; |
| 172 | action->MouseOver(this, where, actionInfo->startOffset, |
| 173 | actionInfo->endOffset, message); |
146 | 174 | return; |
147 | 175 | } |
148 | 176 | |
… |
… |
HyperTextView::InsertHyperText(const char* inText, int32 inLength,
|
193 | 221 | HyperTextAction* |
194 | 222 | HyperTextView::_ActionAt(const BPoint& where) const |
195 | 223 | { |
196 | | int32 offset = OffsetAt(where); |
197 | | |
198 | | ActionInfo pointer(offset, offset + 1, NULL); |
| 224 | const ActionInfo* action = _ActionInfoAt(where); |
199 | 225 | |
200 | | const ActionInfo* action = fActionInfos->BinarySearch(pointer, |
201 | | ActionInfo::CompareEqualIfIntersecting); |
202 | 226 | if (action != NULL) { |
203 | 227 | // verify that the text region was hit |
204 | 228 | BRegion textRegion; |
… |
… |
HyperTextView::_ActionAt(const BPoint& where) const
|
210 | 234 | return NULL; |
211 | 235 | } |
212 | 236 | |
| 237 | |
| 238 | const HyperTextView::ActionInfo* |
| 239 | HyperTextView::_ActionInfoAt(const BPoint& where) const |
| 240 | { |
| 241 | int32 offset = OffsetAt(where); |
| 242 | |
| 243 | ActionInfo pointer(offset, offset + 1, NULL); |
| 244 | |
| 245 | const ActionInfo* action = fActionInfos->BinarySearch(pointer, |
| 246 | ActionInfo::CompareEqualIfIntersecting); |
| 247 | return action; |
| 248 | } |
diff --git a/src/apps/aboutsystem/HyperTextView.h b/src/apps/aboutsystem/HyperTextView.h
index b9d6c2a..9724f11 100644
a
|
b
|
public:
|
21 | 21 | virtual ~HyperTextAction(); |
22 | 22 | |
23 | 23 | virtual void MouseOver(HyperTextView* view, BPoint where, |
| 24 | int32 startOffset, int32 endOffset, |
| 25 | BMessage* message); |
| 26 | void MouseAway(HyperTextView* view, BPoint where, |
| 27 | int32 startOffset, int32 endOffset, |
24 | 28 | BMessage* message); |
25 | 29 | virtual void Clicked(HyperTextView* view, BPoint where, |
26 | 30 | BMessage* message); |
… |
… |
private:
|
59 | 63 | class ActionInfoList; |
60 | 64 | |
61 | 65 | ActionInfoList* fActionInfos; |
| 66 | const ActionInfo* _ActionInfoAt(const BPoint& where) const; |
| 67 | const ActionInfo* fLastActionInfo; |
62 | 68 | }; |
63 | 69 | |
64 | 70 | |