From 65688206345d2a67d38526281db9a0f50941b508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Tue, 11 Feb 2014 23:06:37 +0100 Subject: [PATCH] PackageInstaller: Refactoring and cleanup * Extraced common base class BlockingWindow from PackageTextViewer and PackageImagerViewer. * Use layouted version of PackageTextViewer. * Center ReadMe on screen. * Apply margins around the text view. --- src/apps/packageinstaller/BlockingWindow.cpp | 92 ++++++++ src/apps/packageinstaller/BlockingWindow.h | 32 +++ src/apps/packageinstaller/Jamfile | 1 + .../packageinstaller/PackageImageViewer.cpp | 60 +---- .../packageinstaller/PackageImageViewer.h | 11 +- .../packageinstaller/PackageTextViewer.cpp | 219 +++++------------- src/apps/packageinstaller/PackageTextViewer.h | 24 +- 7 files changed, 191 insertions(+), 248 deletions(-) create mode 100644 src/apps/packageinstaller/BlockingWindow.cpp create mode 100644 src/apps/packageinstaller/BlockingWindow.h diff --git a/src/apps/packageinstaller/BlockingWindow.cpp b/src/apps/packageinstaller/BlockingWindow.cpp new file mode 100644 index 0000000000..978d355813 --- /dev/null +++ b/src/apps/packageinstaller/BlockingWindow.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2007-2014, Haiku, Inc. + * Distributed under the terms of the MIT license. + * + * Author: + * Łukasz 'Sil2100' Zemczak + * Stephan Aßmus + */ + + +#include "PackageImageViewer.h" + + +BlockingWindow::BlockingWindow(BRect frame, const char* title, uint32 flags) + : + BWindow(frame, title, B_MODAL_WINDOW, + B_NOT_ZOOMABLE | B_NOT_RESIZABLE | B_NOT_CLOSABLE | flags), + fSemaphore(-1), + fReturnValue(0) +{ +} + + +BlockingWindow::~BlockingWindow() +{ +} + + +bool +BlockingWindow::QuitRequested() +{ + ReleaseSem(0); + return true; +} + + +int32 +BlockingWindow::Go() +{ + int32 returnValue = 0; + + // Since this class can be thought of as a modified BAlert window, no use + // to reinvent a well fledged wheel. This concept has been borrowed from + // the current BAlert implementation + fSemaphore = create_sem(0, "PackageInstaller BlockingWindow"); + if (fSemaphore < B_OK) { + Quit(); + return returnValue; + } + + thread_id callingThread = find_thread(NULL); + BWindow* window = dynamic_cast(BLooper::LooperForThread( + callingThread)); + Show(); + + if (window != NULL) { + // Make sure calling window thread, which is blocked here, is updating + // the window from time to time. + status_t ret; + for (;;) { + do { + ret = acquire_sem_etc(fSemaphore, 1, B_RELATIVE_TIMEOUT, 50000); + } while (ret == B_INTERRUPTED); + + if (ret == B_BAD_SEM_ID) + break; + window->UpdateIfNeeded(); + } + } else { + // Since there are no spinlocks, wait until the semaphore is free + while (acquire_sem(fSemaphore) == B_INTERRUPTED) { + } + } + + returnValue = fReturnValue; + + if (Lock()) + Quit(); + + return returnValue; +} + + +void +BlockingWindow::ReleaseSem(int32 returnValue) +{ + if (fSemaphore >= B_OK) { + delete_sem(fSemaphore); + fSemaphore = -1; + fReturnValue = returnValue; + } +} diff --git a/src/apps/packageinstaller/BlockingWindow.h b/src/apps/packageinstaller/BlockingWindow.h new file mode 100644 index 0000000000..717fb768e4 --- /dev/null +++ b/src/apps/packageinstaller/BlockingWindow.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2014, Stephan Aßmus + * All rights reserved. Distributed under the terms of the MIT license. + */ +#ifndef BLOCKING_WINDOW_H +#define BLOCKING_WINDOW_H + + +#include + + +class BlockingWindow : public BWindow { +public: + BlockingWindow(BRect frame, + const char* title, uint32 flags = 0); + virtual ~BlockingWindow(); + + virtual bool QuitRequested(); + + virtual int32 Go(); + +protected: + void ReleaseSem(int32 returnValue); + +private: + sem_id fSemaphore; + int32 fReturnValue; +}; + + +#endif // BLOCKING_WINDOW_H + diff --git a/src/apps/packageinstaller/Jamfile b/src/apps/packageinstaller/Jamfile index 26ddba7624..a8b6cdb95a 100644 --- a/src/apps/packageinstaller/Jamfile +++ b/src/apps/packageinstaller/Jamfile @@ -10,6 +10,7 @@ Includes [ FGristFiles PackageItem.cpp ] Application PackageInstaller : main.cpp + BlockingWindow.cpp PackageWindow.cpp PackageView.cpp PackageInfo.cpp diff --git a/src/apps/packageinstaller/PackageImageViewer.cpp b/src/apps/packageinstaller/PackageImageViewer.cpp index 25a241b18f..c486b51912 100644 --- a/src/apps/packageinstaller/PackageImageViewer.cpp +++ b/src/apps/packageinstaller/PackageImageViewer.cpp @@ -96,8 +96,7 @@ ImageView::MouseUp(BPoint point) PackageImageViewer::PackageImageViewer(BPositionIO* imageIO) : - BWindow(BRect(100, 100, 100, 100), "", B_MODAL_WINDOW, - B_NOT_ZOOMABLE | B_NOT_RESIZABLE | B_NOT_CLOSABLE) + BlockingWindow(BRect(100, 100, 100, 100), "") { fBackground = new ImageView(imageIO); AddChild(fBackground); @@ -110,60 +109,3 @@ PackageImageViewer::PackageImageViewer(BPositionIO* imageIO) (frame.Height() - Bounds().Height()) / 2.0f); } - -PackageImageViewer::~PackageImageViewer() -{ -} - - -bool -PackageImageViewer::QuitRequested() -{ - if (fSemaphore >= B_OK) { - delete_sem(fSemaphore); - fSemaphore = -1; - } - return true; -} - - -void -PackageImageViewer::Go() -{ - // Since this class can be thought of as a modified BAlert window, no use - // to reinvent a well fledged wheel. This concept has been borrowed from - // the current BAlert implementation - fSemaphore = create_sem(0, "ImageViewer"); - if (fSemaphore < B_OK) { - Quit(); - return; - } - - thread_id callingThread = find_thread(NULL); - BWindow* window = dynamic_cast(BLooper::LooperForThread( - callingThread)); - Show(); - - if (window != NULL) { - // Make sure calling window thread, which is blocked here, is updating - // the window from time to time. - status_t ret; - for (;;) { - do { - ret = acquire_sem_etc(fSemaphore, 1, B_RELATIVE_TIMEOUT, 50000); - } while (ret == B_INTERRUPTED); - - if (ret == B_BAD_SEM_ID) - break; - window->UpdateIfNeeded(); - } - } else { - // Since there are no spinlocks, wait until the semaphore is free - while (acquire_sem(fSemaphore) == B_INTERRUPTED) { - } - } - - if (Lock()) - Quit(); -} - diff --git a/src/apps/packageinstaller/PackageImageViewer.h b/src/apps/packageinstaller/PackageImageViewer.h index 196f2220ea..5f0484c3a7 100644 --- a/src/apps/packageinstaller/PackageImageViewer.h +++ b/src/apps/packageinstaller/PackageImageViewer.h @@ -8,11 +8,11 @@ #ifndef PACKAGE_IMAGE_VIEWER_H #define PACKAGE_IMAGE_VIEWER_H -#include #include #include #include +#include "BlockingWindow.h" class ImageView : public BView { @@ -29,19 +29,12 @@ private: }; -class PackageImageViewer : public BWindow { +class PackageImageViewer : public BlockingWindow { public: PackageImageViewer(BPositionIO* image); - virtual ~PackageImageViewer(); - virtual bool QuitRequested(); - - void Go(); - private: ImageView* fBackground; - - sem_id fSemaphore; }; diff --git a/src/apps/packageinstaller/PackageTextViewer.cpp b/src/apps/packageinstaller/PackageTextViewer.cpp index 482552bc8f..6274aadfa9 100644 --- a/src/apps/packageinstaller/PackageTextViewer.cpp +++ b/src/apps/packageinstaller/PackageTextViewer.cpp @@ -1,9 +1,10 @@ /* - * Copyright (c) 2007-2010, Haiku, Inc. + * Copyright (c) 2007-2014, Haiku, Inc. * Distributed under the terms of the MIT license. * * Author: * Łukasz 'Sil2100' Zemczak + * Stephan Aßmus */ @@ -14,8 +15,7 @@ #include #include -#include -#include +#include enum { @@ -29,78 +29,30 @@ enum { PackageTextViewer::PackageTextViewer(const char *text, bool disclaimer) : - BWindow(BRect(125, 125, 675, 475), B_TRANSLATE("Disclaimer"), - B_MODAL_WINDOW, B_NOT_ZOOMABLE | B_NOT_RESIZABLE | B_NOT_CLOSABLE), - fValue(0) + BlockingWindow(BRect(125, 125, 675, 475), B_TRANSLATE("Disclaimer"), + B_AUTO_UPDATE_SIZE_LIMITS) { _InitView(text, disclaimer); -} - - -PackageTextViewer::~PackageTextViewer() -{ -} - - -int32 -PackageTextViewer::Go() -{ - // Since this class can be thought of as a modified BAlert window, no use - // to reinvent a well fledged wheel. This concept has been borrowed from - // the current BAlert implementation - fSemaphore = create_sem(0, "TextViewer"); - if (fSemaphore < B_OK) { - Quit(); - return B_ERROR; - } - - BWindow *parent = - dynamic_cast(BLooper::LooperForThread(find_thread(NULL))); - Show(); - - if (parent) { - status_t ret; - for (;;) { - do { - ret = acquire_sem_etc(fSemaphore, 1, B_RELATIVE_TIMEOUT, 50000); - } while (ret == B_INTERRUPTED); - - if (ret == B_BAD_SEM_ID) - break; - parent->UpdateIfNeeded(); - } - } - else { - // Since there are no spinlocks, wait until the semaphore is free - while (acquire_sem(fSemaphore) == B_INTERRUPTED) { - } - } - - int32 value = fValue; - if (Lock()) - Quit(); - - return value; + CenterOnScreen(); } void -PackageTextViewer::MessageReceived(BMessage *msg) +PackageTextViewer::MessageReceived(BMessage* message) { - if (msg->what == P_MSG_ACCEPT) { - if (fSemaphore >= B_OK) { - fValue = 1; - delete_sem(fSemaphore); - fSemaphore = -1; - } - } else if (msg->what == P_MSG_DECLINE) { - if (fSemaphore >= B_OK) { - fValue = 0; - delete_sem(fSemaphore); - fSemaphore = -1; - } - } else - BWindow::MessageReceived(msg); + switch (message->what) { + case P_MSG_ACCEPT: + ReleaseSem(1); + break; + + case P_MSG_DECLINE: + ReleaseSem(0); + break; + + default: + BWindow::MessageReceived(message); + break; + } } @@ -108,111 +60,50 @@ PackageTextViewer::MessageReceived(BMessage *msg) void -PackageTextViewer::_InitView(const char *text, bool disclaimer) +PackageTextViewer::_InitView(const char* text, bool disclaimer) { - fBackground = new BView(Bounds(), "background_view", 0, 0); - fBackground->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + BTextView* textView = new BTextView("text_view"); + textView->MakeEditable(false); + textView->MakeSelectable(true); + float margin = ceilf(be_plain_font->Size()); + textView->SetInsets(margin, margin, margin, margin); + BScrollView* scrollView = new BScrollView("scroll_view", textView, 0, false, + true); + + BButton* defaultButton; - BRect bounds; - BRect rect = Bounds(); if (disclaimer) { - BButton *button = new BButton(BRect(0, 0, 1, 1), "accept", - B_TRANSLATE("Accept"), new BMessage(P_MSG_ACCEPT)); - button->ResizeToPreferred(); + defaultButton = new BButton("accept", B_TRANSLATE("Accept"), + new BMessage(P_MSG_ACCEPT)); - bounds = button->Bounds(); - rect.top = rect.bottom - bounds.bottom - 5.0f; - rect.left = rect.right - bounds.right - 5.0f; - rect.bottom = bounds.bottom; - rect.right = bounds.right; - button->MoveTo(rect.LeftTop()); - button->MakeDefault(true); - fBackground->AddChild(button); + BButton* decline = new BButton("decline", B_TRANSLATE("Decline"), + new BMessage(P_MSG_DECLINE)); - button = new BButton(BRect(0, 0, 1, 1), "decline", - B_TRANSLATE("Decline"), new BMessage(P_MSG_DECLINE)); - button->ResizeToPreferred(); - - bounds = button->Bounds(); - rect.left -= bounds.right + 7.0f; - button->MoveTo(rect.LeftTop()); - fBackground->AddChild(button); + BLayoutBuilder::Group<>(this, B_VERTICAL) + .Add(scrollView) + .AddGroup(B_HORIZONTAL) + .AddGlue() + .Add(defaultButton) + .Add(decline) + .End() + .SetInsets(B_USE_WINDOW_INSETS) + ; } else { - BButton *button = new BButton(BRect(0, 0, 1, 1), "accept", - B_TRANSLATE("Continue"), new BMessage(P_MSG_ACCEPT)); - button->ResizeToPreferred(); + defaultButton = new BButton("accept", B_TRANSLATE("Continue"), + new BMessage(P_MSG_ACCEPT)); - bounds = button->Bounds(); - rect.top = rect.bottom - bounds.bottom - 5.0f; - rect.left = rect.right - bounds.right - 5.0f; - rect.bottom = bounds.bottom; - rect.right = bounds.right; - button->MoveTo(rect.LeftTop()); - button->MakeDefault(true); - fBackground->AddChild(button); + BLayoutBuilder::Group<>(this, B_VERTICAL) + .Add(scrollView) + .AddGroup(B_HORIZONTAL) + .AddGlue() + .Add(defaultButton) + .End() + .SetInsets(B_USE_WINDOW_INSETS) + ; } - bounds = Bounds().InsetBySelf(5.0f, 5.0f); - bounds.bottom = rect.top - 6.0f; - bounds.right -= B_V_SCROLL_BAR_WIDTH; + defaultButton->MakeDefault(true); - fText = new BTextView(bounds, "text_view", BRect(0, 0, bounds.Width(), - bounds.Height()), B_FOLLOW_NONE, B_WILL_DRAW); - fText->MakeEditable(false); - fText->MakeSelectable(true); - fText->SetText(text); - - BScrollView *scroll = new BScrollView("scroll_view", fText, - B_FOLLOW_LEFT | B_FOLLOW_TOP, 0, false, true); - - fBackground->AddChild(scroll); - - AddChild(fBackground); + textView->SetText(text); } - -/*void -PackageTextViewer::_InitView(const char *text, bool disclaimer) -{ - SetLayout(new BGroupLayout(B_HORIZONTAL)); - - fText = new BTextView(BRect(0, 0, 1, 1), "text_view", BRect(0, 0, 1, 1), - B_FOLLOW_NONE, B_WILL_DRAW | B_SUPPORTS_LAYOUT); - fText->MakeEditable(false); - fText->MakeSelectable(true); - BScrollView *scroll = new BScrollView("scroll_view", fText, - B_FOLLOW_LEFT | B_FOLLOW_TOP, 0, false, true); - - if (disclaimer) { - BButton *accept = new BButton("accept", B_TRANSLATE("Accept"), - new BMessage(P_MSG_ACCEPT)); - - BButton *decline = new BButton("decline", B_TRANSLATE("Decline"), - new BMessage(P_MSG_DECLINE)); - - fBackground = BGroupLayoutBuilder(B_VERTICAL) - .Add(scroll) - .AddGroup(B_HORIZONTAL, 5.0f) - .AddGlue() - .Add(accept) - .Add(decline) - .End(); - } - else { - BButton *button = new BButton("accept", B_TRANSLATE("Continue"), - new BMessage(P_MSG_ACCEPT)); - - fBackground = BGroupLayoutBuilder(B_VERTICAL) - .Add(scroll) - .AddGroup(B_HORIZONTAL, 5.0f) - .AddGlue() - .Add(button) - .End(); - } - - AddChild(fBackground); - - fBackground->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); - fText->SetText(text); -}*/ - diff --git a/src/apps/packageinstaller/PackageTextViewer.h b/src/apps/packageinstaller/PackageTextViewer.h index d677fd0fb7..76be4409c4 100644 --- a/src/apps/packageinstaller/PackageTextViewer.h +++ b/src/apps/packageinstaller/PackageTextViewer.h @@ -8,28 +8,20 @@ #ifndef PACKAGETEXTVIEWER_H #define PACKAGETEXTVIEWER_H -#include #include #include +#include "BlockingWindow.h" -class PackageTextViewer : public BWindow { - public: - PackageTextViewer(const char *text, bool disclaimer = false); - ~PackageTextViewer(); +class PackageTextViewer : public BlockingWindow { +public: + PackageTextViewer(const char* text, + bool disclaimer = false); - int32 Go(); - - void MessageReceived(BMessage *msg); + virtual void MessageReceived(BMessage* message); - private: - void _InitView(const char *text, bool disclaimer); - - BView *fBackground; - BTextView *fText; - - sem_id fSemaphore; - int32 fValue; +private: + void _InitView(const char *text, bool disclaimer); };