09ffe40f08
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19677 a95241bf-73f2-0310-859d-f6bbb57e9c96
206 lines
5.3 KiB
C++
206 lines
5.3 KiB
C++
#include <ScrollView.h>
|
|
#include <TextView.h>
|
|
#include <String.h>
|
|
#include <limits.h>
|
|
|
|
#include "ErrorLogWindow.h"
|
|
|
|
rgb_color white = {255,255,255,255};
|
|
rgb_color notwhite = {255,255,200,255};
|
|
|
|
class Error : public BView {
|
|
public:
|
|
Error(BRect rect,alert_type type,const char *tag,const char *message,bool timestamp,rgb_color bkg);
|
|
|
|
void GetPreferredSize(float *width, float *height);
|
|
void Draw(BRect updateRect);
|
|
void FrameResized(float w, float h);
|
|
private:
|
|
alert_type type;
|
|
};
|
|
|
|
class ErrorPanel : public BView {
|
|
public:
|
|
ErrorPanel(BRect rect) : BView(rect,"ErrorScrollPanel",B_FOLLOW_ALL_SIDES,B_DRAW_ON_CHILDREN | B_FRAME_EVENTS), alerts_displayed(0), add_next_at(0) {}
|
|
|
|
void GetPreferredSize(float *width, float *height) {
|
|
*width = Bounds().Width();
|
|
*height = add_next_at;
|
|
}
|
|
|
|
void TargetedByScrollView(BScrollView *scroll_view) { scroll = scroll_view; /*scroll->ScrollBar(B_VERTICAL)->SetRange(0,add_next_at);*/ }
|
|
void FrameResized(float w, float /*h*/) {
|
|
if (w == Frame().Width())
|
|
return;
|
|
|
|
add_next_at = 0;
|
|
for (int32 i = 0; i < CountChildren(); i++) {
|
|
ChildAt(i)->MoveTo(BPoint(0,add_next_at));
|
|
ChildAt(i)->ResizeTo(w,ChildAt(i)->Frame().Height());
|
|
ChildAt(i)->ResizeToPreferred();
|
|
add_next_at += ChildAt(i)->Bounds().Height();
|
|
}
|
|
ResizeTo(w,add_next_at);
|
|
}
|
|
|
|
int32 alerts_displayed;
|
|
float add_next_at;
|
|
BScrollView *scroll;
|
|
};
|
|
|
|
|
|
// #pragma mark -
|
|
|
|
|
|
ErrorLogWindow::ErrorLogWindow(BRect rect, const char *name, window_type type)
|
|
: BWindow(rect, name, type,
|
|
B_NO_WORKSPACE_ACTIVATION | B_NOT_MINIMIZABLE | B_ASYNCHRONOUS_CONTROLS)
|
|
{
|
|
rect = Bounds();
|
|
rect.right -= B_V_SCROLL_BAR_WIDTH;
|
|
|
|
view = new ErrorPanel(rect);
|
|
AddChild(new BScrollView("ErrorScroller", view, B_FOLLOW_ALL_SIDES, 0, false, true));
|
|
}
|
|
|
|
|
|
void
|
|
ErrorLogWindow::AddError(alert_type type, const char *message, const char *tag, bool timestamp)
|
|
{
|
|
ErrorPanel *panel = (ErrorPanel *)view;
|
|
|
|
Lock();
|
|
|
|
Error *newError = new Error(BRect(0, panel->add_next_at, panel->Bounds().right,
|
|
panel->add_next_at + 1), type, tag, message, timestamp,
|
|
(panel->alerts_displayed++ % 2 == 0) ? white : notwhite);
|
|
|
|
newError->ResizeToPreferred();
|
|
panel->add_next_at += newError->Bounds().Height();
|
|
panel->AddChild(newError);
|
|
panel->ResizeToPreferred();
|
|
|
|
if (panel->add_next_at > Frame().Height()) {
|
|
BScrollBar *bar = panel->scroll->ScrollBar(B_VERTICAL);
|
|
|
|
bar->SetRange(0, panel->add_next_at - Frame().Height());
|
|
bar->SetSteps(1, Frame().Height());
|
|
bar->SetProportion(Frame().Height() / panel->add_next_at);
|
|
} else
|
|
panel->scroll->ScrollBar(B_VERTICAL)->SetRange(0,0);
|
|
|
|
if (IsHidden())
|
|
Show();
|
|
|
|
Unlock();
|
|
}
|
|
|
|
|
|
bool
|
|
ErrorLogWindow::QuitRequested()
|
|
{
|
|
Hide();
|
|
|
|
while (view->CountChildren() != 0)
|
|
view->RemoveChild(view->ChildAt(0));
|
|
|
|
ErrorPanel *panel = (ErrorPanel *)(view);
|
|
panel->add_next_at = 0;
|
|
panel->alerts_displayed = 0;
|
|
|
|
view->ResizeToPreferred();
|
|
return false;
|
|
}
|
|
|
|
|
|
void
|
|
ErrorLogWindow::FrameResized(float newWidth, float newHeight)
|
|
{
|
|
ErrorPanel *panel = (ErrorPanel *)view;
|
|
panel->ResizeTo(newWidth, panel->add_next_at);
|
|
panel->FrameResized(newWidth - B_V_SCROLL_BAR_WIDTH, panel->add_next_at);
|
|
panel->Invalidate();
|
|
|
|
if (panel->add_next_at > newHeight) {
|
|
BScrollBar *bar = panel->scroll->ScrollBar(B_VERTICAL);
|
|
|
|
bar->SetRange(0, panel->add_next_at - Frame().Height());
|
|
bar->SetSteps(1, Frame().Height());
|
|
bar->SetProportion(Frame().Height() / panel->add_next_at);
|
|
} else
|
|
panel->scroll->ScrollBar(B_VERTICAL)->SetRange(0,0);
|
|
}
|
|
|
|
|
|
// #pragma mark -
|
|
|
|
|
|
Error::Error(BRect rect,alert_type atype,const char *tag,const char *message,bool timestamp,rgb_color bkg) : BView(rect,"error",B_FOLLOW_LEFT | B_FOLLOW_RIGHT | B_FOLLOW_TOP,B_NAVIGABLE | B_WILL_DRAW | B_FRAME_EVENTS), type(atype) {
|
|
SetViewColor(bkg);
|
|
SetLowColor(bkg);
|
|
|
|
text_run_array array;
|
|
array.count = 1;
|
|
array.runs[0].offset = 0;
|
|
array.runs[0].font = *be_bold_font;
|
|
array.runs[0].color = HighColor();
|
|
|
|
BString msgString(message);
|
|
msgString.RemoveAll("\r");
|
|
|
|
BTextView *view = new BTextView(BRect(20,0,rect.Width(),rect.Height()),"error_display",BRect(0,3,rect.Width() - 20 - 3,LONG_MAX),B_FOLLOW_ALL_SIDES);
|
|
view->SetLowColor(bkg);
|
|
view->SetViewColor(bkg);
|
|
view->SetText(msgString.String());
|
|
view->MakeSelectable(true);
|
|
view->SetStylable(true);
|
|
view->MakeEditable(false);
|
|
|
|
if (tag != NULL)
|
|
view->Insert(0,tag,strlen(tag),&array);
|
|
|
|
if (timestamp) {
|
|
array.runs[0].color = tint_color(ui_color(B_PANEL_BACKGROUND_COLOR),B_DARKEN_2_TINT);
|
|
array.runs[0].font.SetSize(9);
|
|
time_t thetime = time(NULL);
|
|
BString atime = asctime(localtime(&thetime));
|
|
atime.Prepend(" [");
|
|
atime.RemoveAll("\n");
|
|
atime.Append("]");
|
|
view->Insert(view->TextLength(),atime.String(),atime.Length(),&array);
|
|
}
|
|
|
|
float height,width;
|
|
width = view->Frame().Width();
|
|
height = view->TextHeight(0,view->CountLines()) + 3;
|
|
view->ResizeTo(width,height);
|
|
AddChild(view);
|
|
}
|
|
|
|
|
|
void
|
|
Error::GetPreferredSize(float *width, float *height)
|
|
{
|
|
BTextView *view = static_cast<BTextView *>(FindView("error_display"));
|
|
|
|
*width = view->Frame().Width() + 20;
|
|
*height = view->TextHeight(0, LONG_MAX) + 3;
|
|
}
|
|
|
|
|
|
void
|
|
Error::Draw(BRect updateRect)
|
|
{
|
|
FillRect(updateRect, B_SOLID_LOW);
|
|
}
|
|
|
|
|
|
void
|
|
Error::FrameResized(float w, float h)
|
|
{
|
|
BTextView *view = static_cast<BTextView *>(FindView("error_display"));
|
|
|
|
view->ResizeTo(w - 20, h);
|
|
view->SetTextRect(BRect(0, 3, w - 20, h));
|
|
}
|