Ticket #8556: untitled_number_v2.patch

File untitled_number_v2.patch, 5.0 KB (added by ejno1, 11 years ago)

The WindowPolicy/class approach

  • src/apps/stylededit/StyledEditApp.cpp

    From 2a358fe514c64cd244915ce511bfb68cbb4f24a4 Mon Sep 17 00:00:00 2001
    From: ejno <none>
    Date: Fri, 28 Jun 2013 12:55:11 +0000
    Subject: [PATCH] WindowPolicy approach for reusing Untitled document numbers
    
    ---
     src/apps/stylededit/StyledEditApp.cpp    |    3 +-
     src/apps/stylededit/StyledEditApp.h      |    1 -
     src/apps/stylededit/StyledEditWindow.cpp |   10 ++--
     src/apps/stylededit/StyledEditWindow.h   |    9 +++-
     src/apps/stylededit/WindowPolicy.h       |   79 ++++++++++++++++++++++++++++++
     5 files changed, 93 insertions(+), 9 deletions(-)
     create mode 100644 src/apps/stylededit/WindowPolicy.h
    
    diff --git a/src/apps/stylededit/StyledEditApp.cpp b/src/apps/stylededit/StyledEditApp.cpp
    index 0460af8..5782cda 100644
    a b StyledEditApp::StyledEditApp()  
    128128        fOpenPanelEncodingMenu = NULL;
    129129
    130130    fWindowCount = 0;
    131     fNextUntitledWindow = 1;
    132131    fBadArguments = false;
    133132}
    134133
    void  
    172171StyledEditApp::OpenDocument()
    173172{
    174173    cascade();
    175     new StyledEditWindow(gWindowRect, fNextUntitledWindow++, fOpenAsEncoding);
     174    new StyledEditWindow(gWindowRect, fOpenAsEncoding);
    176175    fWindowCount++;
    177176}
    178177
  • src/apps/stylededit/StyledEditApp.h

    diff --git a/src/apps/stylededit/StyledEditApp.h b/src/apps/stylededit/StyledEditApp.h
    index 71f1f74..0de971f 100644
    a b private:  
    4949            BMenu*              fOpenPanelEncodingMenu;
    5050            uint32              fOpenAsEncoding;
    5151            int32               fWindowCount;
    52             int32               fNextUntitledWindow;
    5352            bool                fBadArguments;
    5453};
    5554
  • src/apps/stylededit/StyledEditWindow.cpp

    diff --git a/src/apps/stylededit/StyledEditWindow.cpp b/src/apps/stylededit/StyledEditWindow.cpp
    index 4eee321..89d82cd 100644
    a b bs_printf(BString* string, const char* format, ...)  
    7979// #pragma mark -
    8080
    8181
    82 StyledEditWindow::StyledEditWindow(BRect frame, int32 id, uint32 encoding)
     82UntitledWindowPolicy StyledEditWindow::fPolicy = UntitledWindowPolicy();
     83
     84StyledEditWindow::StyledEditWindow(BRect frame, uint32 encoding)
    8385    : BWindow(frame, "untitled", B_DOCUMENT_WINDOW, B_ASYNCHRONOUS_CONTROLS)
    8486{
    8587    _InitWindow(encoding);
    86     BString unTitled(B_TRANSLATE("Untitled "));
    87     unTitled << id;
    88     SetTitle(unTitled.String());
     88    fPolicy.OnOpen(this);
    8989    fSaveItem->SetEnabled(true);
    9090        // allow saving empty files
    9191    Show();
    StyledEditWindow::~StyledEditWindow()  
    112112void
    113113StyledEditWindow::Quit()
    114114{
     115    fPolicy.OnQuit(this);
     116
    115117    _SwitchNodeMonitor(false);
    116118
    117119    _SaveAttrs();
  • src/apps/stylededit/StyledEditWindow.h

    diff --git a/src/apps/stylededit/StyledEditWindow.h b/src/apps/stylededit/StyledEditWindow.h
    index bf239a6..fb95cef 100644
    a b  
    1515#include <Node.h>
    1616#include <Window.h>
    1717
     18
     19#include "WindowPolicy.h"
     20
     21
    1822struct entry_ref;
    1923
    2024class BFilePanel;
    class StyledEditView;  
    2933
    3034class StyledEditWindow : public BWindow {
    3135public:
    32                                 StyledEditWindow(BRect frame, int32 id,
    33                                     uint32 encoding = 0);
     36                                StyledEditWindow(BRect frame, uint32 encoding = 0);
    3437                                StyledEditWindow(BRect frame, entry_ref* ref,
    3538                                    uint32 encoding = 0);
    3639    virtual                     ~StyledEditWindow();
    private:  
    171174            node_ref            fNodeRef;
    172175            node_ref            fFolderNodeRef;
    173176            bool                fNagOnNodeChange;
     177
     178            static UntitledWindowPolicy fPolicy;
    174179};
    175180
    176181
  • new file src/apps/stylededit/WindowPolicy.h

    diff --git a/src/apps/stylededit/WindowPolicy.h b/src/apps/stylededit/WindowPolicy.h
    new file mode 100644
    index 0000000..d662441
    - +  
     1#ifndef WINDOW_POLICY_H
     2#define WINDOW_POLICY_H
     3
     4
     5#include <interface/Window.h>
     6
     7
     8#undef B_TRANSLATION_CONTEXT
     9#define B_TRANSLATION_CONTEXT "StyledEditWindow"
     10
     11
     12class UntitledWindowPolicy
     13{
     14    struct WindowData
     15    {
     16        BWindow *window;
     17        int32 fID;
     18
     19
     20        WindowData(BWindow *win, int32 id) : window(win), fID(id) {}
     21    };
     22
     23
     24    int fNextUntitled;
     25    BList fWindows;
     26
     27
     28public:
     29    UntitledWindowPolicy() : fNextUntitled(1), fWindows() {}
     30
     31
     32    ~UntitledWindowPolicy()
     33    {
     34        for (int32 i = 0; i < fWindows.CountItems(); i++)
     35            delete reinterpret_cast<WindowData *>(fWindows.ItemAt(i));
     36    }
     37
     38
     39    void OnOpen(BWindow *window)
     40    {
     41        BString title(B_TRANSLATE("Untitled "));
     42
     43        WindowData *d = NULL;
     44        for (int32 i = 0; i < fWindows.CountItems(); i++) {
     45            WindowData *t = reinterpret_cast<WindowData *>(fWindows.ItemAt(i));
     46            if (t->window == NULL) {
     47                d = t;
     48                break;
     49            }
     50        }
     51
     52        if (d) {
     53            d->window = window;
     54            title << d->fID;
     55            window->SetTitle(title);
     56            return;
     57        }
     58
     59        title << fNextUntitled;
     60        window->SetTitle(title);
     61        fWindows.AddItem(new WindowData(window, fNextUntitled++));
     62    }
     63
     64
     65    void OnQuit(const BWindow *window)
     66    {
     67        for (int32 i = 0; i < fWindows.CountItems(); i++) {
     68            WindowData *t = reinterpret_cast<WindowData *>(fWindows.ItemAt(i));
     69            if (!t) continue;
     70            if (t->window == window) {
     71                t->window = NULL;
     72                break;
     73            }
     74        }
     75    }
     76};
     77
     78
     79#endif // WINDOW_POLICY_H