// Called when we're closing a document void TabsOnCloseDoc(WindowInfo *win) { if (win->tabs.Count() == 0) return; /* if (win->AsFixed() && win->AsFixed()->userAnnots && win->AsFixed()->userAnnotsModified) { // TODO: warn about unsaved changes } */ int current = TabCtrl_GetCurSel(win->hwndTabBar); TabInfo *tdata = win->currentTab; UpdateTabFileDisplayStateForWin(win, tdata); win->tabSelectionHistory->Remove(tdata); win->tabs.Remove(tdata); delete tdata; TabCtrl_DeleteItem(win->hwndTabBar, current); win->loadedFilePath = nullptr; win->ctrl = nullptr; win->currentTab = nullptr; UpdateTabWidth(win); if (win->tabs.Count() > 0) { tdata = win->tabSelectionHistory->Pop(); TabCtrl_SetCurSel(win->hwndTabBar, win->tabs.Find(tdata)); LoadModelIntoTab(win, tdata); } }
static void RemoveTab(WindowInfo* win, int idx) { TabInfo* tab = win->tabs.at(idx); UpdateTabFileDisplayStateForWin(win, tab); win->tabSelectionHistory->Remove(tab); win->tabs.Remove(tab); if (tab == win->currentTab) { win->ctrl = nullptr; win->currentTab = nullptr; } delete tab; TabCtrl_DeleteItem(win->hwndTabBar, idx); UpdateTabWidth(win); }
// Called when we're closing an entire window (quitting) void TabsOnCloseWindow(WindowInfo *win) { int count = TabsGetCount(win); for (int i = 0; i < count; i++) { TabData *tdata = GetTabData(win, i); if (tdata) { UpdateTabFileDisplayStateForWin(win, tdata); DeleteTabData(tdata, win->ctrl != tdata->ctrl); } } win->tabSelectionHistory->Reset(); TabCtrl_DeleteAllItems(win->hwndTabBar); }
// On tab selection, we save the data for the tab which is losing selection and // load the data of the selected tab into the WindowInfo. LRESULT TabsOnNotify(WindowInfo *win, LPARAM lparam, int tab1, int tab2) { LPNMHDR data = (LPNMHDR)lparam; switch(data->code) { case TCN_SELCHANGING: // TODO: Should we allow the switch of the tab if we are in process of printing? SaveCurrentTabData(win); return FALSE; case TCN_SELCHANGE: { int current = TabCtrl_GetCurSel(win->hwndTabBar); LoadModelIntoTab(win, GetTabData(win, current)); UpdateCurrentTabBgColForWindow(win); } break; case T_CLOSING: // allow the closure return FALSE; case T_CLOSE: { int current = TabCtrl_GetCurSel(win->hwndTabBar); if (tab1 == current) { CloseTab(win); } else { TabData *tdata = GetTabData(win, tab1); win->tabSelectionHistory->Remove(tdata); UpdateTabFileDisplayStateForWin(win, tdata); DeleteTabData(tdata, true); TabCtrl_DeleteItem(win->hwndTabBar, tab1); UpdateTabWidth(win); } } break; case T_DRAG: SwapTabs(win, tab1, tab2); break; } return TRUE; }
// Called when we're closing a document void TabsOnCloseDoc(WindowInfo *win) { int count = TabsGetCount(win); if (count <= 0) return; if (win->AsFixed() && win->AsFixed()->userAnnots && win->AsFixed()->userAnnotsModified) { // TODO: warn about unsaved changes } int current = TabCtrl_GetCurSel(win->hwndTabBar); TabData *tdata = GetTabData(win, current); win->tabSelectionHistory->Remove(tdata); UpdateTabFileDisplayStateForWin(win, tdata); DeleteTabData(tdata, false); TabCtrl_DeleteItem(win->hwndTabBar, current); UpdateTabWidth(win); if (count > 1) { tdata = win->tabSelectionHistory->Pop(); TabCtrl_SetCurSel(win->hwndTabBar, FindTabIndex(win, tdata)); LoadModelIntoTab(win, tdata); UpdateCurrentTabBgColForWindow(win); } }