From 8512f7b05659884cb4f2e5ddf68afe17ae133c53 Mon Sep 17 00:00:00 2001 From: Zhuowei Zhang Date: Sun, 16 Mar 2014 20:46:57 -0400 Subject: [PATCH] Added a simple window to display console messages (fixes #10410) Signed-off-by: Adrien Destugues --- src/apps/webpositive/BrowserApp.cpp | 20 ++++- src/apps/webpositive/BrowserApp.h | 2 + src/apps/webpositive/BrowserWindow.cpp | 7 ++ src/apps/webpositive/BrowserWindow.h | 3 +- src/apps/webpositive/ConsoleWindow.cpp | 100 +++++++++++++++++++++++++ src/apps/webpositive/ConsoleWindow.h | 31 ++++++++ src/apps/webpositive/Jamfile | 1 + 7 files changed, 162 insertions(+), 2 deletions(-) create mode 100644 src/apps/webpositive/ConsoleWindow.cpp create mode 100644 src/apps/webpositive/ConsoleWindow.h diff --git a/src/apps/webpositive/BrowserApp.cpp b/src/apps/webpositive/BrowserApp.cpp index ba6f50b863..bd419eaa73 100644 --- a/src/apps/webpositive/BrowserApp.cpp +++ b/src/apps/webpositive/BrowserApp.cpp @@ -48,11 +48,13 @@ #include "DownloadWindow.h" #include "SettingsMessage.h" #include "SettingsWindow.h" +#include "ConsoleWindow.h" #include "NetworkCookieJar.h" #include "WebKitInfo.h" #include "WebPage.h" #include "WebSettings.h" #include "WebView.h" +#include "WebViewConstants.h" #undef B_TRANSLATION_CONTEXT @@ -76,7 +78,8 @@ BrowserApp::BrowserApp() fCookies(NULL), fContext(NULL), fDownloadWindow(NULL), - fSettingsWindow(NULL) + fSettingsWindow(NULL), + fConsoleWindow(NULL) { #if ENABLE_NATIVE_COOKIES BString cookieStorePath = kApplicationName; @@ -181,6 +184,8 @@ BrowserApp::ReadyToRun() defaultDownloadWindowFrame); BRect settingsWindowFrame = fSettings->GetValue("settings window frame", BRect()); + BRect consoleWindowFrame = fSettings->GetValue("console window frame", + BRect(50, 50, 400, 300)); bool showDownloads = fSettings->GetValue("show downloads", false); fDownloadWindow = new DownloadWindow(downloadWindowFrame, showDownloads, @@ -201,6 +206,8 @@ BrowserApp::ReadyToRun() fSettingsWindow = new SettingsWindow(settingsWindowFrame, fSettings); BWebPage::SetDownloadListener(BMessenger(fDownloadWindow)); + + fConsoleWindow = new ConsoleWindow(consoleWindowFrame); fInitialized = true; @@ -265,6 +272,12 @@ BrowserApp::MessageReceived(BMessage* message) case SHOW_SETTINGS_WINDOW: _ShowWindow(message, fSettingsWindow); break; + case SHOW_CONSOLE_WINDOW: + _ShowWindow(message, fConsoleWindow); + break; + case ADD_CONSOLE_MESSAGE: + fConsoleWindow->PostMessage(message); + break; default: BApplication::MessageReceived(message); @@ -340,6 +353,11 @@ BrowserApp::QuitRequested() fSettings->SetValue("settings window frame", fSettingsWindow->Frame()); fSettingsWindow->Unlock(); } + + if (fConsoleWindow->Lock()) { + fSettings->SetValue("console window frame", fConsoleWindow->Frame()); + fConsoleWindow->Unlock(); + } BMessage cookieArchive; BNetworkCookieJar& cookieJar = fContext->GetCookieJar(); diff --git a/src/apps/webpositive/BrowserApp.h b/src/apps/webpositive/BrowserApp.h index 937cd05a79..baf4fb1175 100644 --- a/src/apps/webpositive/BrowserApp.h +++ b/src/apps/webpositive/BrowserApp.h @@ -40,6 +40,7 @@ class DownloadWindow; class BrowserWindow; class SettingsMessage; class SettingsWindow; +class ConsoleWindow; class BrowserApp : public BApplication { @@ -81,6 +82,7 @@ private: DownloadWindow* fDownloadWindow; SettingsWindow* fSettingsWindow; + ConsoleWindow* fConsoleWindow; }; diff --git a/src/apps/webpositive/BrowserWindow.cpp b/src/apps/webpositive/BrowserWindow.cpp index 71bd484403..79936918c6 100644 --- a/src/apps/webpositive/BrowserWindow.cpp +++ b/src/apps/webpositive/BrowserWindow.cpp @@ -397,6 +397,8 @@ BrowserWindow::BrowserWindow(BRect frame, SettingsMessage* appSettings, new BMessage(SHOW_DOWNLOAD_WINDOW), 'D')); menu->AddItem(new BMenuItem(B_TRANSLATE("Settings"), new BMessage(SHOW_SETTINGS_WINDOW))); + menu->AddItem(new BMenuItem(B_TRANSLATE("Script console"), + new BMessage(SHOW_CONSOLE_WINDOW))); BMenuItem* aboutItem = new BMenuItem(B_TRANSLATE("About"), new BMessage(B_ABOUT_REQUESTED)); menu->AddItem(aboutItem); @@ -1006,6 +1008,7 @@ BrowserWindow::MessageReceived(BMessage* message) case SHOW_DOWNLOAD_WINDOW: case SHOW_SETTINGS_WINDOW: + case SHOW_CONSOLE_WINDOW: message->AddUInt32("workspaces", Workspaces()); be_app->PostMessage(message); break; @@ -1087,6 +1090,10 @@ BrowserWindow::MessageReceived(BMessage* message) } break; } + case ADD_CONSOLE_MESSAGE: + be_app->PostMessage(message); + BWebWindow::MessageReceived(message); + break; default: BWebWindow::MessageReceived(message); diff --git a/src/apps/webpositive/BrowserWindow.h b/src/apps/webpositive/BrowserWindow.h index e9840b445c..8b2093a74d 100644 --- a/src/apps/webpositive/BrowserWindow.h +++ b/src/apps/webpositive/BrowserWindow.h @@ -80,7 +80,8 @@ enum { WINDOW_OPENED = 'wndo', WINDOW_CLOSED = 'wndc', SHOW_DOWNLOAD_WINDOW = 'sdwd', - SHOW_SETTINGS_WINDOW = 'sswd' + SHOW_SETTINGS_WINDOW = 'sswd', + SHOW_CONSOLE_WINDOW = 'scwd' }; #define INTEGRATE_MENU_INTO_TAB_BAR 0 diff --git a/src/apps/webpositive/ConsoleWindow.cpp b/src/apps/webpositive/ConsoleWindow.cpp new file mode 100644 index 0000000000..19d01fa724 --- /dev/null +++ b/src/apps/webpositive/ConsoleWindow.cpp @@ -0,0 +1,100 @@ +/* + * Copyright 2014 Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Zhuowei Zhang + */ +#include "ConsoleWindow.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "BrowserWindow.h" +#include "BrowserApp.h" +#include "WebViewConstants.h" + + +#undef B_TRANSLATION_CONTEXT +#define B_TRANSLATION_CONTEXT "Console Window" + + +enum { + EVAL_CONSOLE_WINDOW_COMMAND = 'ecwc', + CLEAR_CONSOLE_MESSAGES = 'ccms' +}; + + +ConsoleWindow::ConsoleWindow(BRect frame) + : + BWindow(frame, B_TRANSLATE("Script console"), B_TITLED_WINDOW, + B_NORMAL_WINDOW_FEEL, B_AUTO_UPDATE_SIZE_LIMITS + | B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE) +{ + SetLayout(new BGroupLayout(B_VERTICAL, 0.0)); + + fMessagesListView = new BListView("Console messages"); + fClearMessagesButton = new BButton(B_TRANSLATE("Clear"), + new BMessage(CLEAR_CONSOLE_MESSAGES)); + + AddChild(BGroupLayoutBuilder(B_VERTICAL, 0.0) + .Add(new BScrollView("Console messages scroll", + fMessagesListView, 0, true, true)) + .Add(new BSeparatorView(B_HORIZONTAL, B_PLAIN_BORDER)) + .Add(BGroupLayoutBuilder(B_HORIZONTAL, B_USE_SMALL_SPACING) + .Add(fClearMessagesButton) + .SetInsets(0, 5, 0, 5) + ) + .SetInsets(5, 5, 5, 5) + ); + if (!frame.IsValid()) + CenterOnScreen(); +} + + +void +ConsoleWindow::MessageReceived(BMessage* message) +{ + switch (message->what) { + case ADD_CONSOLE_MESSAGE: + { + BString source = message->FindString("source"); + int32 lineNumber = message->FindInt32("line"); + int32 columnNumber = message->FindInt32("column"); + BString text = message->FindString("string"); + BString finalText; + finalText.SetToFormat("%s:%li:%li: %s\n", source.String(), lineNumber, + columnNumber, text.String()); + fMessagesListView->AddItem(new BStringItem(finalText.String())); + break; + } + case CLEAR_CONSOLE_MESSAGES: + { + int count = fMessagesListView->CountItems(); + for (int i = count - 1; i >= 0; i--) { + delete fMessagesListView->RemoveItem(i); + } + break; + } + default: + BWindow::MessageReceived(message); + break; + } +} + + +bool +ConsoleWindow::QuitRequested() +{ + if (!IsHidden()) + Hide(); + return false; +} diff --git a/src/apps/webpositive/ConsoleWindow.h b/src/apps/webpositive/ConsoleWindow.h new file mode 100644 index 0000000000..66d62a8cbe --- /dev/null +++ b/src/apps/webpositive/ConsoleWindow.h @@ -0,0 +1,31 @@ +/* + * Copyright 2014 Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Zhuowei Zhang + */ +#ifndef CONSOLE_WINDOW_H +#define CONSOLE_WINDOW_H + + +#include +#include + + +class BListView; +class BButton; + + +class ConsoleWindow : public BWindow { +public: + ConsoleWindow(BRect frame); + virtual void MessageReceived(BMessage* message); + virtual bool QuitRequested(); +private: + BListView* fMessagesListView; + BButton* fClearMessagesButton; +}; + + +#endif // CONSOLE_WINDOW_H diff --git a/src/apps/webpositive/Jamfile b/src/apps/webpositive/Jamfile index ea555ff293..d6986bec1e 100644 --- a/src/apps/webpositive/Jamfile +++ b/src/apps/webpositive/Jamfile @@ -37,6 +37,7 @@ local sources = SettingsKeys.cpp SettingsWindow.cpp URLInputGroup.cpp + ConsoleWindow.cpp ; # We build WebPositive only for one architecture -- the first architecture for