void MainFrame::AdjustSystemTrayIcon(wxCommandEvent& WXUNUSED(event)) { if(CheckOption(wxT("UD_MINIMIZE_TO_SYSTEM_TRAY"))){ if(!m_systemTrayIcon->IsIconInstalled()){ wxString icon(wxT("tray")); if(m_busy){ if(m_paused) icon = wxT("tray_paused"); else icon = wxT("tray_running"); } SetSystemTrayIcon(icon,wxT("UltraDefrag")); if(m_systemTrayIcon->IsIconInstalled()){ if(IsIconized()) Hide(); } } } else { if(m_systemTrayIcon->IsIconInstalled()){ m_systemTrayIcon->RemoveIcon(); Show(); } } }
/** * @brief Initializes main window. */ MainFrame::MainFrame() :wxFrame(NULL,wxID_ANY,wxT("UltraDefrag")) { g_mainFrame = this; m_vList = NULL; m_cMap = NULL; m_currentJob = NULL; m_busy = false; m_paused = false; // set main window icon SetIcons(wxICON(appicon)); // read configuration ReadAppConfiguration(); ProcessCommandEvent(ID_ReadUserPreferences); // set main window title wxString *instdir = new wxString(); //genBTC re-arranged the below, A LOT. wxStandardPaths stdpaths; wxFileName exepath(stdpaths.GetExecutablePath()); wxString cd = exepath.GetPath(); if((wxGetEnv(wxT("UD_INSTALL_DIR"),instdir))&&(cd.CmpNoCase(*instdir) == 0)) { itrace("current directory matches installation location, so it isn't portable"); itrace("installation location: %ls",instdir->wc_str()); m_title = new wxString(wxT(VERSIONINTITLE)); } else { itrace("current directory differs from installation location, so it is portable"); itrace("current directory: %ls",cd.wc_str()); wxSetEnv(wxT("UD_IS_PORTABLE"),wxT("1")); m_title = new wxString(wxT(VERSIONINTITLE_PORTABLE)); } //genBTC re-arranged the above, A LOT. ProcessCommandEvent(ID_SetWindowTitle); delete instdir; // set main window size and position SetSize(m_width,m_height); if(!m_saved){ CenterOnScreen(); GetPosition(&m_x,&m_y); } Move(m_x,m_y); if(m_maximized) Maximize(true); SetMinSize(wxSize(DPI(MAIN_WINDOW_MIN_WIDTH),DPI(MAIN_WINDOW_MIN_HEIGHT))); // create menu, tool and status bars InitMenu(); InitToolbar(); InitStatusBar(); //make sizer1 to hold the the tabbed "notebook". And make the notebook wxBoxSizer* bSizer1; bSizer1 = new wxBoxSizer( wxVERTICAL ); m_notebook1 = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); //make a panel inside the notebook to hold the m_splitter m_panel1 = new wxPanel( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); // create list of volumes and cluster map (with splitter as parent) m_splitter = new wxSplitterWindow(m_panel1,wxID_ANY, wxDefaultPosition,wxDefaultSize, wxSP_3D | wxCLIP_CHILDREN); m_splitter->SetMinimumPaneSize(DPI(MIN_PANEL_HEIGHT)); m_vList = new DrivesList(m_splitter,wxLC_REPORT | wxLC_NO_SORT_HEADER | wxLC_HRULES | wxLC_VRULES | wxBORDER_NONE); m_cMap = new ClusterMap(m_splitter); m_splitter->SplitHorizontally(m_vList,m_cMap); int height = GetClientSize().GetHeight(); int maxPanelHeight = height - DPI(MIN_PANEL_HEIGHT) - m_splitter->GetSashSize(); if(m_separatorPosition < DPI(MIN_PANEL_HEIGHT)) m_separatorPosition = DPI(MIN_PANEL_HEIGHT); else if(m_separatorPosition > maxPanelHeight) m_separatorPosition = maxPanelHeight; m_splitter->SetSashPosition(m_separatorPosition); // update frame layout so we'll be able to initialize // list of volumes and cluster map properly wxSizeEvent evt(wxSize(m_width,m_height)); ProcessEvent(evt); m_splitter->UpdateSize(); InitVolList(); m_vList->SetFocus(); // populate list of volumes m_listThread = new ListThread(); //make sizer2 to Fit the splitter, and initialize it. wxBoxSizer* bSizer2; bSizer2 = new wxBoxSizer( wxVERTICAL ); bSizer2->Add( m_splitter, 1, wxEXPAND, 1 ); m_panel1->SetSizer( bSizer2 ); //Finish Tab1 - Add the Panel1(Splitter+sizer2) to the notebook. m_notebook1->AddPage( m_panel1, wxT("Drives"), false ); //make a 2nd panel inside the notebook to hold the 2nd page(a grid) m_panel2 = new wxPanel( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); m_filesList = new FilesList(m_panel2,wxLC_REPORT /* | wxLC_SINGLE_SEL | wxLC_NO_SORT_HEADER*/ \ | wxLC_VIRTUAL | wxLC_HRULES | wxLC_VRULES | wxBORDER_NONE); InitFilesList(); //make sizer3 to Fit the page2list, and initialize it. wxBoxSizer* bSizer3; bSizer3 = new wxBoxSizer( wxVERTICAL ); bSizer3->Add( m_filesList, 1, wxEXPAND, 1 ); m_panel2->SetSizer( bSizer3 ); bSizer3->Fit( m_panel2 ); //Finish Tab 2 - Add the Panel2(page2list+sizer3) to the notebook. m_notebook1->AddPage( m_panel2, wxT("Files"), false ); //Finish Notebook & initialize bSizer1->Add( m_notebook1, 1, wxEXPAND, 1 ); this->SetSizer( bSizer1 ); // check the boot time defragmenter presence wxFileName btdFile(wxT("%SystemRoot%\\system32\\defrag_native.exe")); btdFile.Normalize(); bool btd = btdFile.FileExists(); m_menuBar->FindItem(ID_BootEnable)->Enable(btd); m_menuBar->FindItem(ID_BootScript)->Enable(btd); m_toolBar->EnableTool(ID_BootEnable,btd); m_toolBar->EnableTool(ID_BootScript,btd); if(btd && ::winx_bootex_check(L"defrag_native") > 0){ m_menuBar->FindItem(ID_BootEnable)->Check(true); m_toolBar->ToggleTool(ID_BootEnable,true); m_btdEnabled = true; } else { m_btdEnabled = false; } // launch threads for time consuming operations m_btdThread = btd ? new BtdThread() : NULL; m_configThread = new ConfigThread(); m_crashInfoThread = new CrashInfoThread(); wxConfigBase *cfg = wxConfigBase::Get(); int ulevel = (int)cfg->Read(wxT("/Upgrade/Level"),1); wxMenuItem *item = m_menuBar->FindItem(ID_HelpUpgradeNone + ulevel); if(item) item->Check(); m_upgradeThread = new UpgradeThread(ulevel); // set system tray icon m_systemTrayIcon = new SystemTrayIcon(); if(!m_systemTrayIcon->IsOk()){ etrace("system tray icon initialization failed"); wxSetEnv(wxT("UD_MINIMIZE_TO_SYSTEM_TRAY"),wxT("0")); } SetSystemTrayIcon(wxT("tray"),wxT("UltraDefrag")); // set localized text ProcessCommandEvent(ID_LocaleChange + g_locale->GetLanguage()); // allow disk processing m_jobThread = new JobThread(); //create query thread to perform queries without blocking the GUI //(sort of like jobs) - may not be good to have both possibly running at once. //Create Query Tab, Tab #3. InitQueryMenu(); UD_DisableTool(ID_Stop); //change stop icon to be not always enabled. }