summaryrefslogtreecommitdiffstats
path: root/chrome/browser/repost_form_warning_dialog.cc
blob: c0302657c9f6fba6c1741b0fe4c6f29a661febc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/repost_form_warning_dialog.h"

#include "chrome/browser/browser_list.h"
#include "chrome/browser/navigation_controller.h"
#include "chrome/common/l10n_util.h"
#include "chrome/views/message_box_view.h"
#include "chrome/views/window.h"

#include "generated_resources.h"

///////////////////////////////////////////////////////////////////////////////
// RepostFormWarningDialog, public:

// static
void RepostFormWarningDialog::RunRepostFormWarningDialog(
    NavigationController* navigation_controller) {
  RepostFormWarningDialog* dialog =
      new RepostFormWarningDialog(navigation_controller);
}

RepostFormWarningDialog::~RepostFormWarningDialog() {
  NotificationService::current()->RemoveObserver(
      this, NOTIFY_LOAD_START, NotificationService::AllSources());
  NotificationService::current()->RemoveObserver(
      this, NOTIFY_TAB_CLOSING, NotificationService::AllSources());
}

//////////////////////////////////////////////////////////////////////////////
// RepostFormWarningDialog, views::DialogDelegate implementation:

std::wstring RepostFormWarningDialog::GetWindowTitle() const {
  return l10n_util::GetString(IDS_HTTP_POST_WARNING_TITLE);
}

std::wstring RepostFormWarningDialog::GetDialogButtonLabel(
    DialogButton button) const {
  if (button == DialogDelegate::DIALOGBUTTON_OK)
    return l10n_util::GetString(IDS_HTTP_POST_WARNING_RESEND);
  if (button == DialogDelegate::DIALOGBUTTON_CANCEL)
    return l10n_util::GetString(IDS_HTTP_POST_WARNING_CANCEL);
  return L"";
}

void RepostFormWarningDialog::WindowClosing() {
  delete this;
}

bool RepostFormWarningDialog::Cancel() {
  return true;
}

bool RepostFormWarningDialog::Accept() {
  if (navigation_controller_)
    navigation_controller_->Reload(false);
  return true;
}

///////////////////////////////////////////////////////////////////////////////
// RepostFormWarningDialog, views::WindowDelegate implementation:

views::View* RepostFormWarningDialog::GetContentsView() {
  return message_box_view_;
}

///////////////////////////////////////////////////////////////////////////////
// RepostFormWarningDialog, private:

RepostFormWarningDialog::RepostFormWarningDialog(
    NavigationController* navigation_controller)
      : navigation_controller_(navigation_controller),
        message_box_view_(NULL) {
  message_box_view_ = new MessageBoxView(
      MessageBoxView::kIsConfirmMessageBox,
      l10n_util::GetString(IDS_HTTP_POST_WARNING),
      L"");
  // TODO(beng): fix this - this dialog box should be shown by a method on the
  //             Browser.
  HWND root_hwnd = NULL;
  if (BrowserList::GetLastActive()) {
    root_hwnd = reinterpret_cast<HWND>(BrowserList::GetLastActive()->
        window()->GetNativeHandle());
  }
  views::Window::CreateChromeWindow(root_hwnd, gfx::Rect(), this)->Show();
  NotificationService::current()->
      AddObserver(this, NOTIFY_LOAD_START, NotificationService::AllSources());
  NotificationService::current()->
      AddObserver(this, NOTIFY_TAB_CLOSING, NotificationService::AllSources());
}

void RepostFormWarningDialog::Observe(NotificationType type,
                                      const NotificationSource& source,
                                      const NotificationDetails& details) {
  // Close the dialog if we load a page (because reloading might not apply to
  // the same page anymore) or if the tab is closed, because then we won't have
  // a navigation controller anymore.
  if (window() && navigation_controller_ &&
      (type == NOTIFY_LOAD_START || type == NOTIFY_TAB_CLOSING) &&
      Source<NavigationController>(source).ptr() == navigation_controller_) {
      navigation_controller_ = NULL;
      window()->Close();
    }
}