Better looking toolbar styles (especially on Windows)
[qemu-gui.git] / notebook.cpp
blob372ac182ba74178accf4d3c27e943ace74b38b2b
1 #include "notebook.h"
2 #include "console.h"
3 #include "vncpanel.h"
4 #include "vm.h"
5 #include <wx/wx.h>
7 DEFINE_EVENT_TYPE(EVT_NEW_VM)
8 DEFINE_EVENT_TYPE(EVT_OPEN_VM)
10 WelcomeHtmlWindow::WelcomeHtmlWindow(wxWindow *parent)
11 :wxHtmlWindow(parent){
12 this->LoadPage(wxT("welcome.html"));
15 void WelcomeHtmlWindow::OnLinkClicked(const wxHtmlLinkInfo& link){
16 const wxString href = link.GetHref();
18 if(!href.CmpNoCase(wxT("/vm/new"))){
19 wxCommandEvent event(EVT_NEW_VM,wxID_ANY);
20 ProcessEvent(event);
21 return;
24 if(!href.CmpNoCase(wxT("/vm/open"))){
25 wxCommandEvent event(EVT_OPEN_VM,wxID_ANY);
26 ProcessEvent(event);
27 return;
30 LoadPage(href);
33 QemuUINotebookPage::QemuUINotebookPage(wxWindow *parent,QemuVM *vm,wxPanel *info,VNCPanel *vncpanel,ConsolePanel *console)
34 :wxPanel(parent,wxID_ANY),
35 vm(vm),
36 info(info),
37 vncpanel(vncpanel),
38 console(console),
39 active(NULL){
41 sizer = new wxBoxSizer(wxVERTICAL);
42 #if 0
43 if(vncpanel)
44 sizer->Add(vncpanel,1,wxEXPAND);
45 if(console)
46 sizer->Add(console,1,wxEXPAND);
47 #endif
48 //SetAutoLayout(true);
49 SetSizer(sizer);
52 QemuVM* QemuUINotebookPage::GetVM(){
53 return this->vm;
56 void QemuUINotebookPage::SetVM(QemuVM *vm){
57 this->vm = vm;
60 void QemuUINotebookPage::ShowInfo(){
61 active = info;
64 bool QemuUINotebookPage::IsInfoPageActive(){
65 return active == info;
68 VNCPanel* QemuUINotebookPage::GetScreen(){
69 return this->vncpanel;
72 void QemuUINotebookPage::SetVNCPanel(VNCPanel *vncpanel){
73 this->vncpanel = vncpanel;
74 sizer->Add(vncpanel,1,wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL,0);
75 sizer->Layout();
78 bool QemuUINotebookPage::IsScreenActive(){
79 return active == vncpanel;
82 ConsolePanel* QemuUINotebookPage::GetConsole(){
83 return this->console;
86 void QemuUINotebookPage::SetConsole(ConsolePanel *console){
87 this->console = console;
88 GetSizer()->Add(console,1,wxEXPAND,0);
89 GetSizer()->Layout();
92 bool QemuUINotebookPage::IsConsoleActive(){
93 return active == console;
96 void QemuUINotebookPage::ShowScreen(){
97 this->console->Show(false);
98 this->vncpanel->Show(true);
99 GetSizer()->Layout();
100 active = vncpanel;
103 void QemuUINotebookPage::ShowConsole(){
104 this->vncpanel->Show(false);
105 this->console->Show(true);
106 GetSizer()->Layout();
107 active = console;
110 QemuUINotebook::QemuUINotebook(wxWindow *parent)
111 :wxNotebook(parent,QEMU_VM_NOTEBOOK,wxDefaultPosition,
112 wxDefaultSize,wxNB_TOP)
114 this->homepage = NULL;
117 void QemuUINotebook::ShowContextMenu(const wxPoint& pos)
119 wxMenu menu;
120 menu.Append(QEMU_VM_NOTEBOOK_CONTEXT_CLOSE, _("C&lose"));
121 PopupMenu(&menu, pos);
124 void QemuUINotebook::OnMouseEvent(wxMouseEvent& event)
126 wxEventType eventType = event.GetEventType();
128 static int lastTabID = -1;
130 if(eventType==wxEVT_LEFT_DOWN){
131 // Save the selected tab
132 lastTabID=HitTest(wxPoint(event.GetX(),event.GetY()));
133 wxSetCursor(wxCursor(wxCURSOR_HAND));
134 } else if(eventType == wxEVT_RIGHT_DOWN){
135 this->contextTabID = HitTest(event.GetPosition());
136 ShowContextMenu(event.GetPosition());
137 lastTabID=-1;
138 } else if(eventType==wxEVT_LEFT_UP && lastTabID >= 0){
139 int tabID = HitTest(wxPoint(event.GetX(), event.GetY()));
140 //std::cout << "OLD: " << lastTabID << " NEW: " << tabID << "\n";
141 if(tabID >= 0 && tabID != lastTabID){
142 wxNotebookPage* page=GetPage(lastTabID);
143 wxString text = GetPageText(lastTabID);
144 int image = GetPageImage(lastTabID);
145 RemovePage(lastTabID);
146 InsertPage(tabID, page, text, true, image);
147 // update window menu
149 lastTabID=-1;
150 wxSetCursor(wxCursor(wxCURSOR_ARROW));
151 } else {
152 lastTabID = -1;
155 event.Skip();
158 void QemuUINotebook::CreateHomepage(){
159 if(this->homepage)
160 return;
162 this->homepage = new WelcomeHtmlWindow(this);
163 this->InsertPage(0,homepage,_("Welcome"),true);
167 int QemuUINotebook::ShowHomepage(){
168 // if there is no homepage create it
169 if(!homepage){
170 CreateHomepage();
171 return 0;
174 for(int i = 0; i < GetPageCount(); i++){
175 if(homepage == GetPage(i)){
176 SetSelection(i);
177 return i;
181 return 0;
184 void QemuUINotebook::CloseHomepage(){
185 if(!homepage)
186 return;
188 for(int i = 0; i < GetPageCount(); i++){
189 if(homepage == GetPage(i)){
190 RemovePage(i);
191 delete homepage;
192 homepage = NULL;
193 return;
198 bool QemuUINotebook::IsHomepage(const int pos){
199 wxNotebookPage *page = this->GetPage(pos);
200 return page == this->homepage;
203 bool QemuUINotebook::HasHomepage(){
204 return homepage != NULL;
207 void QemuUINotebook::AddVM(QemuVM *vm){
208 QemuUINotebookPage *page = new QemuUINotebookPage(this,vm);
209 VNCPanel *vncpanel = new VNCPanel(page,wxString(wxT("127.0.0.1")),1);
210 ConsolePanel *console = new ConsolePanel(page,vm);
211 page->SetVNCPanel(vncpanel);
212 page->SetConsole(console);
213 page->ShowConsole();
214 AddPage(page,vm->GetTitle());
215 SetSelection(GetPageCount() - 1);
218 QemuUINotebookPage* QemuUINotebook::GetCurrentVMTab(){
219 const int sel = GetSelection();
220 if(sel == -1)
221 return NULL;
222 if(IsHomepage(sel))
223 return NULL;
225 return (QemuUINotebookPage *)GetCurrentPage();
229 QemuVM* QemuUINotebook::GetCurrentVM(){
230 QemuUINotebookPage *tab = GetCurrentVMTab();
231 if(tab)
232 return tab->GetVM();
233 else
234 return NULL;
237 BEGIN_EVENT_TABLE(QemuUINotebook,wxNotebook)
238 EVT_MOUSE_EVENTS(QemuUINotebook::OnMouseEvent)
239 END_EVENT_TABLE()