* Copyright 2025, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Nathan Patrizi, nathan.patrizi@gmail.com
*/
#include "LocationStringView.h"
#include <Cursor.h>
#include <Entry.h>
#include <Font.h>
#include <Path.h>
#include <Roster.h>
#include <String.h>
#include <StringView.h>
LocationStringView::LocationStringView(const char* name, const char* text)
: BStringView(name, text)
{
fOriginalHighColor = HighColor();
fStyledAsLink = false;
}
void
LocationStringView::CheckAndSetStyleForLink()
{
_StyleAsLink(_IsFileLink());
}
void
LocationStringView::MouseDown(BPoint point)
{
if (fStyledAsLink) {
BMessenger tracker("application/x-vnd.Be-TRAK");
BMessage message(B_REFS_RECEIVED);
BEntry dirEntry(fFilePathParent.Path());
entry_ref dirRef;
dirEntry.GetRef(&dirRef);
BEntry entry(fFilePath.Path());
node_ref node;
entry.GetNodeRef(&node);
message.AddRef("refs", &dirRef);
message.AddData("nodeRefToSelect", B_RAW_TYPE, &node, sizeof(node_ref));
tracker.SendMessage(&message);
}
}
void
LocationStringView::MouseMoved(BPoint point, uint32 transit, const BMessage* dragMessage)
{
if (!fStyledAsLink)
return;
switch (transit) {
case B_ENTERED_VIEW:
_MouseOver();
break;
case B_EXITED_VIEW:
_MouseAway();
break;
}
}
void
LocationStringView::_MouseAway()
{
BCursor defaultCursor(B_CURSOR_ID_SYSTEM_DEFAULT);
SetViewCursor(&defaultCursor);
BFont font;
GetFont(&font);
font.SetFace(B_REGULAR_FACE);
SetFont(&font);
}
void
LocationStringView::_MouseOver()
{
BCursor linkCursor(B_CURSOR_ID_FOLLOW_LINK);
SetViewCursor(&linkCursor);
BFont font;
GetFont(&font);
font.SetFace(B_UNDERSCORE_FACE);
SetFont(&font);
}
bool
LocationStringView::_IsFileLink()
{
BString filePath(Text());
return filePath.StartsWith("file:");
}
void
LocationStringView::_StripFileProtocol()
{
BString filePath(Text());
filePath.RemoveFirst("file:");
if (filePath.StartsWith("///"))
filePath.RemoveFirst("//");
else if (filePath.StartsWith("//localhost/"))
filePath.RemoveFirst("//localhost");
fFilePath = filePath.String();
fFilePath.GetParent(&fFilePathParent);
SetText(fFilePathParent.Path());
SetToolTip(fFilePathParent.Path());
}
void
LocationStringView::_StyleAsLink(bool enableLinkStyle)
{
fStyledAsLink = enableLinkStyle;
if (enableLinkStyle) {
SetHighUIColor(B_LINK_TEXT_COLOR);
_StripFileProtocol();
} else {
SetHighColor(fOriginalHighColor);
_MouseAway();
}
}