diff options
Diffstat (limited to 'RealtimeSync')
-rw-r--r-- | RealtimeSync/RealtimeSync.vcxproj | 37 | ||||
-rw-r--r-- | RealtimeSync/app_icon.h | 40 | ||||
-rw-r--r-- | RealtimeSync/application.cpp | 19 | ||||
-rw-r--r-- | RealtimeSync/gui_generated.cpp | 144 | ||||
-rw-r--r-- | RealtimeSync/gui_generated.h | 35 | ||||
-rw-r--r-- | RealtimeSync/main_dlg.cpp | 123 | ||||
-rw-r--r-- | RealtimeSync/makefile | 7 | ||||
-rw-r--r-- | RealtimeSync/resources.cpp | 79 | ||||
-rw-r--r-- | RealtimeSync/resources.h | 36 | ||||
-rw-r--r-- | RealtimeSync/tray_menu.cpp | 165 |
10 files changed, 224 insertions, 461 deletions
diff --git a/RealtimeSync/RealtimeSync.vcxproj b/RealtimeSync/RealtimeSync.vcxproj index dbaa2aa5..99f64740 100644 --- a/RealtimeSync/RealtimeSync.vcxproj +++ b/RealtimeSync/RealtimeSync.vcxproj @@ -99,7 +99,7 @@ <WarningLevel>Level4</WarningLevel> <Optimization>Disabled</Optimization> <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Program Files\C++\Boost;C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc12_x86_debug_dll\mswud;..</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x86_debug_dll\mswud;..</AdditionalIncludeDirectories> <PrecompiledHeaderFile>wx+/pch.h</PrecompiledHeaderFile> <DisableSpecificWarnings>4100;4512</DisableSpecificWarnings> <MultiProcessorCompilation>true</MultiProcessorCompilation> @@ -114,10 +114,10 @@ <GenerateDebugInformation>true</GenerateDebugInformation> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> <AdditionalDependencies>wxmsw29ud_adv.lib;wxmsw29ud_core.lib;wxbase29ud.lib;wxpngd.lib;wxzlibd.lib;wxbase29ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage\lib;C:\Program Files\C++\wxWidgets\lib\vc12_x86_debug_dll</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Data\C++\Boost\stage\lib;C:\Data\C++\wxWidgets\lib\vc12_x86_debug_dll</AdditionalLibraryDirectories> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Data\C++\wxWidgets\include</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);ZEN_ARCHITECTURE_X86</PreprocessorDefinitions> </ResourceCompile> </ItemDefinitionGroup> @@ -127,7 +127,7 @@ <WarningLevel>Level4</WarningLevel> <Optimization>Disabled</Optimization> <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Program Files\C++\Boost;C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc12_x64_debug_dll\mswud;..</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x64_debug_dll\mswud;..</AdditionalIncludeDirectories> <PrecompiledHeaderFile>wx+/pch.h</PrecompiledHeaderFile> <DisableSpecificWarnings>4100;4512</DisableSpecificWarnings> <MultiProcessorCompilation>true</MultiProcessorCompilation> @@ -144,12 +144,12 @@ <GenerateDebugInformation>true</GenerateDebugInformation> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> <AdditionalDependencies>wxmsw29ud_adv.lib;wxmsw29ud_core.lib;wxbase29ud.lib;wxpngd.lib;wxzlibd.lib;wxbase29ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib;C:\Program Files\C++\wxWidgets\lib\vc12_x64_debug_dll</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Data\C++\Boost\stage_x64\lib;C:\Data\C++\wxWidgets\lib\vc12_x64_debug_dll</AdditionalLibraryDirectories> <LinkStatus> </LinkStatus> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Data\C++\wxWidgets\include</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);ZEN_ARCHITECTURE_X64</PreprocessorDefinitions> </ResourceCompile> </ItemDefinitionGroup> @@ -160,7 +160,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Program Files\C++\Boost;C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc12_x86_release_lib\mswu;..</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x86_release_lib\mswu;..</AdditionalIncludeDirectories> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <DisableSpecificWarnings>4100;4512;4996</DisableSpecificWarnings> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> @@ -174,14 +174,14 @@ <OptimizeReferences>true</OptimizeReferences> <AdditionalDependencies>wxbase29u.lib;wxmsw29u_adv.lib;wxmsw29u_core.lib;wxpng.lib;wxzlib.lib;wxbase29u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> - <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage\lib;C:\Program Files\C++\wxWidgets\lib\vc12_x86_release_lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Data\C++\Boost\stage\lib;C:\Data\C++\wxWidgets\lib\vc12_x86_release_lib</AdditionalLibraryDirectories> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Data\C++\wxWidgets\include</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);ZEN_ARCHITECTURE_X86</PreprocessorDefinitions> </ResourceCompile> <PostBuildEvent> - <Command>"C:\Program Files\C++\CodeSigning\SignCode.cmd" "$(TargetPath)"</Command> + <Command>"C:\Data\C++\CodeSigning\SignCode.cmd" "$(TargetPath)"</Command> </PostBuildEvent> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> @@ -191,7 +191,7 @@ <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <PreprocessorDefinitions>_SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Program Files\C++\Boost;C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc12_x64_release_lib\mswu;..</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Data\C++\Boost;C:\Data\C++\wxWidgets\include;C:\Data\C++\wxWidgets\lib\vc12_x64_release_lib\mswu;..</AdditionalIncludeDirectories> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <DisableSpecificWarnings>4100;4512;4996</DisableSpecificWarnings> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> @@ -205,14 +205,14 @@ <OptimizeReferences>true</OptimizeReferences> <AdditionalDependencies>wxmsw29u_adv.lib;wxmsw29u_core.lib;wxbase29u.lib;wxpng.lib;wxzlib.lib;wxbase29u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> - <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib;C:\Program Files\C++\wxWidgets\lib\vc12_x64_release_lib</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>C:\Data\C++\Boost\stage_x64\lib;C:\Data\C++\wxWidgets\lib\vc12_x64_release_lib</AdditionalLibraryDirectories> </Link> <ResourceCompile> - <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>C:\Data\C++\wxWidgets\include</AdditionalIncludeDirectories> <PreprocessorDefinitions>%(PreprocessorDefinitions);ZEN_ARCHITECTURE_X64</PreprocessorDefinitions> </ResourceCompile> <PostBuildEvent> - <Command>"C:\Program Files\C++\CodeSigning\SignCode.cmd" "$(TargetPath)"</Command> + <Command>"C:\Data\C++\CodeSigning\SignCode.cmd" "$(TargetPath)"</Command> </PostBuildEvent> </ItemDefinitionGroup> <ItemGroup> @@ -228,14 +228,18 @@ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> </ClCompile> + <ClCompile Include="..\wx+\image_resources.cpp" /> <ClCompile Include="..\wx+\image_tools.cpp" /> <ClCompile Include="..\wx+\mouse_move_dlg.cpp" /> + <ClCompile Include="..\wx+\popup_dlg.cpp" /> + <ClCompile Include="..\wx+\popup_dlg_generated.cpp" /> <ClCompile Include="..\zen\debug_memory_leaks.cpp" /> <ClCompile Include="..\zen\dir_watcher.cpp" /> <ClCompile Include="..\zen\dst_hack.cpp" /> <ClCompile Include="..\zen\file_handling.cpp" /> <ClCompile Include="..\zen\file_io.cpp" /> <ClCompile Include="..\zen\file_traverser.cpp" /> + <ClCompile Include="..\zen\format_unit.cpp" /> <ClCompile Include="..\zen\notify_removal.cpp" /> <ClCompile Include="..\zen\privilege.cpp" /> <ClCompile Include="..\zen\scroll_window_under_cursor.cpp" /> @@ -244,7 +248,6 @@ <ClCompile Include="gui_generated.cpp" /> <ClCompile Include="main_dlg.cpp" /> <ClCompile Include="monitor.cpp" /> - <ClCompile Include="resources.cpp" /> <ClCompile Include="tray_menu.cpp" /> <ClCompile Include="xml_ffs.cpp" /> <ClCompile Include="xml_proc.cpp" /> @@ -253,9 +256,7 @@ <ResourceCompile Include="resource.rc" /> </ItemGroup> <ItemGroup> - <None Include="WxWizFrame.fbp"> - <SubType>Designer</SubType> - </None> + <None Include="RealtimeSync.fbp" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> diff --git a/RealtimeSync/app_icon.h b/RealtimeSync/app_icon.h new file mode 100644 index 00000000..fcd2b548 --- /dev/null +++ b/RealtimeSync/app_icon.h @@ -0,0 +1,40 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * +// ************************************************************************** + +#ifndef RTS_APP_ICON_8914578394545 +#define RTS_APP_ICON_8914578394545 + +#include <wx/icon.h> +#include <wx+/image_resources.h> + +namespace zen +{ +inline +wxIcon getRtsIcon() +{ + //wxWidgets' bitmap to icon conversion on OS X can only deal with very specific sizes => check on all platforms! + assert(getResourceImage(L"RealtimeSync").GetWidth () == getResourceImage(L"RealtimeSync").GetHeight() && + getResourceImage(L"RealtimeSync").GetWidth() % 128 == 0); +#ifdef ZEN_WIN + //for compatibility it seems we need to stick with a "real" icon + return wxIcon(L"A_RTS_ICON"); + +#elif defined ZEN_LINUX + //attention: make sure to not implicitly call "instance()" again => deadlock on Linux + wxIcon icon; + icon.CopyFromBitmap(getResourceImage(L"RealtimeSync")); //use big logo bitmap for better quality + return icon; + +#elif defined ZEN_MAC + wxIcon icon; + icon.CopyFromBitmap(getResourceImage(L"RealtimeSync").ConvertToImage().Scale(128, 128, wxIMAGE_QUALITY_HIGH)); //"von hinten durch die Brust ins Auge" + return icon; +#endif +} +} + + +#endif //RTS_APP_ICON_8914578394545 diff --git a/RealtimeSync/application.cpp b/RealtimeSync/application.cpp index c2ed4078..a0d693d6 100644 --- a/RealtimeSync/application.cpp +++ b/RealtimeSync/application.cpp @@ -10,9 +10,10 @@ #include <zen/thread.h> #include <wx/event.h> #include <wx/log.h> -#include <wx/msgdlg.h> +#include <wx/tooltip.h> #include <wx+/string_conv.h> -//#include "resources.h" +#include <wx+/popup_dlg.h> +#include <wx+/image_resources.h> #include "xml_ffs.h" #include "../lib/localization.h" #include "../lib/ffs_paths.h" @@ -71,7 +72,15 @@ bool Application::OnInit() ::gtk_rc_parse((zen::getResourceDir() + "styles.gtk_rc").c_str()); //remove inner border from bitmap buttons #endif - SetAppName(L"FreeFileSync"); //reuse FFS's name, to have "GetUserDataDir()/GetResourcesDir()" return the same directory in ffs_paths.cpp +#ifdef ZEN_WIN + wxToolTip::SetMaxWidth(-1); //disable tooltip wrapping -> Windows only +#endif + //Windows User Experience Interaction Guidelines: tool tips should have 5s timeout, info tips no timeout => compromise: + wxToolTip::SetAutoPop(7000); //http://msdn.microsoft.com/en-us/library/windows/desktop/aa511495.aspx + + SetAppName(L"RealtimeSync"); + + initResourceImages(getResourceDir() + Zstr("Resources.zip")); //do not call wxApp::OnInit() to avoid using default commandline parser @@ -101,7 +110,7 @@ void Application::onEnterEventLoop(wxEvent& event) } catch (const FileError& e) { - wxMessageBox(e.toString(), L"RealtimeSync" + _("Error"), wxOK | wxICON_ERROR); + showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); //continue! } @@ -119,7 +128,7 @@ void Application::onEnterEventLoop(wxEvent& event) filename += Zstr(".ffs_batch"); else { - wxMessageBox(replaceCpy(_("Cannot open file %x."), L"%x", fmtFileName(filename)), L"RealtimeSync" + _("Error"), wxOK | wxICON_ERROR); + showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setMainInstructions(replaceCpy(_("Cannot open file %x."), L"%x", fmtFileName(filename)))); return; } } diff --git a/RealtimeSync/gui_generated.cpp b/RealtimeSync/gui_generated.cpp index 16b52345..3b3ad3fe 100644 --- a/RealtimeSync/gui_generated.cpp +++ b/RealtimeSync/gui_generated.cpp @@ -13,7 +13,7 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxSize( 420,350 ), wxDefaultSize ); + this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize ); this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); m_menubar1 = new wxMenuBar( 0 ); @@ -36,7 +36,7 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_menuHelp = new wxMenu(); wxMenuItem* m_menuItemContent; - m_menuItemContent = new wxMenuItem( m_menuHelp, wxID_HELP, wxString( _("&Content") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL ); + m_menuItemContent = new wxMenuItem( m_menuHelp, wxID_HELP, wxString( _("&View help") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL ); m_menuHelp->Append( m_menuItemContent ); m_menuHelp->AppendSeparator(); @@ -50,6 +50,9 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr bSizerMain = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer161; + bSizer161 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer16; bSizer16 = new wxBoxSizer( wxHORIZONTAL ); @@ -64,27 +67,30 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_staticText3 = new wxStaticText( this, wxID_ANY, _("1. Select folders to watch."), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText3->Wrap( -1 ); - bSizer15->Add( m_staticText3, 0, wxLEFT, 10 ); + bSizer15->Add( m_staticText3, 0, 0, 5 ); m_staticText4 = new wxStaticText( this, wxID_ANY, _("2. Enter a command line."), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText4->Wrap( -1 ); - bSizer15->Add( m_staticText4, 0, wxLEFT, 10 ); + bSizer15->Add( m_staticText4, 0, 0, 5 ); m_staticText5 = new wxStaticText( this, wxID_ANY, _("3. Press 'Start'."), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText5->Wrap( -1 ); - bSizer15->Add( m_staticText5, 0, wxLEFT, 10 ); + bSizer15->Add( m_staticText5, 0, 0, 5 ); - bSizer16->Add( bSizer15, 0, wxTOP|wxLEFT, 5 ); + bSizer16->Add( bSizer15, 0, wxALL, 5 ); - bSizerMain->Add( bSizer16, 0, 0, 5 ); + bSizer161->Add( bSizer16, 0, 0, 5 ); m_staticText811 = new wxStaticText( this, wxID_ANY, _("To get started just import a .ffs_batch file."), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText811->Wrap( -1 ); m_staticText811->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizerMain->Add( m_staticText811, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizer161->Add( m_staticText811, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizerMain->Add( bSizer161, 0, wxALL|wxEXPAND, 5 ); m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizerMain->Add( m_staticline2, 0, wxEXPAND, 5 ); @@ -95,9 +101,12 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr wxBoxSizer* bSizer1; bSizer1 = new wxBoxSizer( wxVERTICAL ); - m_staticText7 = new wxStaticText( m_panelMain, wxID_ANY, _("Folders to watch"), wxDefaultPosition, wxDefaultSize, 0 ); + wxBoxSizer* bSizer151; + bSizer151 = new wxBoxSizer( wxVERTICAL ); + + m_staticText7 = new wxStaticText( m_panelMain, wxID_ANY, _("Folders to watch:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText7->Wrap( -1 ); - bSizer1->Add( m_staticText7, 0, wxALL, 5 ); + bSizer151->Add( m_staticText7, 0, wxALL, 5 ); m_panelMainFolder = new wxPanel( m_panelMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); m_panelMainFolder->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); @@ -150,7 +159,7 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_panelMainFolder->SetSizer( fgSizer1 ); m_panelMainFolder->Layout(); fgSizer1->Fit( m_panelMainFolder ); - bSizer1->Add( m_panelMainFolder, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + bSizer151->Add( m_panelMainFolder, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); m_scrolledWinFolders = new wxScrolledWindow( m_panelMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); m_scrolledWinFolders->SetScrollRate( 10, 10 ); @@ -162,7 +171,10 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_scrolledWinFolders->SetSizer( bSizerFolders ); m_scrolledWinFolders->Layout(); bSizerFolders->Fit( m_scrolledWinFolders ); - bSizer1->Add( m_scrolledWinFolders, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizer151->Add( m_scrolledWinFolders, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizer1->Add( bSizer151, 1, wxALL|wxEXPAND, 5 ); m_staticline212 = new wxStaticLine( m_panelMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizer1->Add( m_staticline212, 0, wxEXPAND, 5 ); @@ -170,12 +182,9 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr wxBoxSizer* bSizer14; bSizer14 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText8 = new wxStaticText( m_panelMain, wxID_ANY, _("Idle time [seconds]"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText8 = new wxStaticText( m_panelMain, wxID_ANY, _("Idle time (in seconds):"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText8->Wrap( -1 ); - bSizer14->Add( m_staticText8, 0, wxALL, 5 ); - - - bSizer14->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer14->Add( m_staticText8, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); m_spinCtrlDelay = new wxSpinCtrl( m_panelMain, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); m_spinCtrlDelay->SetToolTip( _("Idle time between last detected change and execution of command") ); @@ -183,20 +192,26 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr bSizer14->Add( m_spinCtrlDelay, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - bSizer1->Add( bSizer14, 0, wxALIGN_RIGHT|wxEXPAND, 5 ); + bSizer1->Add( bSizer14, 0, wxALIGN_RIGHT|wxEXPAND|wxALL, 5 ); m_staticline211 = new wxStaticLine( m_panelMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizer1->Add( m_staticline211, 0, wxEXPAND, 5 ); - m_staticText6 = new wxStaticText( m_panelMain, wxID_ANY, _("Command line"), wxDefaultPosition, wxDefaultSize, 0 ); + wxBoxSizer* bSizer141; + bSizer141 = new wxBoxSizer( wxVERTICAL ); + + m_staticText6 = new wxStaticText( m_panelMain, wxID_ANY, _("Command line:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText6->Wrap( -1 ); - bSizer1->Add( m_staticText6, 0, wxALL, 5 ); + bSizer141->Add( m_staticText6, 0, wxALL, 5 ); m_textCtrlCommand = new wxTextCtrl( m_panelMain, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_textCtrlCommand->SetMaxLength( 0 ); m_textCtrlCommand->SetToolTip( _("The command is triggered if:\n- files or subfolders change\n- new folders arrive (e.g. USB stick insert)") ); - bSizer1->Add( m_textCtrlCommand, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizer141->Add( m_textCtrlCommand, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizer1->Add( bSizer141, 0, wxALL|wxEXPAND, 5 ); m_panelMain->SetSizer( bSizer1 ); @@ -207,7 +222,7 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_staticline5 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizerMain->Add( m_staticline5, 0, wxEXPAND, 5 ); - m_buttonStart = new zen::BitmapTextButton( this, wxID_OK, _("Start"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonStart = new zen::BitmapTextButton( this, wxID_OK, _("&Start"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_buttonStart->SetDefault(); m_buttonStart->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); @@ -218,6 +233,8 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr this->Layout(); bSizerMain->Fit( this ); + this->Centre( wxBOTH ); + // Connect Events this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDlgGenerated::OnClose ) ); this->Connect( m_menuItem13->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnConfigLoad ) ); @@ -232,17 +249,6 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr MainDlgGenerated::~MainDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDlgGenerated::OnClose ) ); - this->Disconnect( wxID_OPEN, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnConfigLoad ) ); - this->Disconnect( wxID_SAVEAS, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnConfigSave ) ); - this->Disconnect( wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnMenuQuit ) ); - this->Disconnect( wxID_HELP, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnShowHelp ) ); - this->Disconnect( wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnMenuAbout ) ); - m_bpButtonAddFolder->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDlgGenerated::OnAddFolder ), NULL, this ); - m_bpButtonRemoveTopFolder->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDlgGenerated::OnRemoveTopFolder ), NULL, this ); - m_buttonStart->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDlgGenerated::OnStart ), NULL, this ); - } FolderGenerated::FolderGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) @@ -275,75 +281,3 @@ FolderGenerated::FolderGenerated( wxWindow* parent, wxWindowID id, const wxPoint FolderGenerated::~FolderGenerated() { } - -ErrorDlgGenerated::ErrorDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxSize( 300,160 ), wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); - - m_panel3 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel3->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - wxBoxSizer* bSizer16; - bSizer16 = new wxBoxSizer( wxVERTICAL ); - - - bSizer16->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer26; - bSizer26 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap10 = new wxStaticBitmap( m_panel3, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer26->Add( m_bitmap10, 0, wxRIGHT|wxLEFT, 10 ); - - m_textCtrl8 = new wxTextCtrl( m_panel3, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,150 ), wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER ); - bSizer26->Add( m_textCtrl8, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); - - - bSizer16->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - - m_panel3->SetSizer( bSizer16 ); - m_panel3->Layout(); - bSizer16->Fit( m_panel3 ); - bSizer24->Add( m_panel3, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer24->Add( m_staticline2, 0, wxEXPAND, 5 ); - - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonRetry = new wxButton( this, wxID_RETRY, _("&Retry"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonRetry->SetDefault(); - bSizerStdButtons->Add( m_buttonRetry, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - - - bSizer24->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); - - - this->SetSizer( bSizer24 ); - this->Layout(); - bSizer24->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); - m_buttonRetry->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); -} - -ErrorDlgGenerated::~ErrorDlgGenerated() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); - m_buttonRetry->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); - m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); - -} diff --git a/RealtimeSync/gui_generated.h b/RealtimeSync/gui_generated.h index 182f75ca..a816e10a 100644 --- a/RealtimeSync/gui_generated.h +++ b/RealtimeSync/gui_generated.h @@ -32,10 +32,8 @@ namespace zen { class BitmapTextButton; } #include <wx/scrolwin.h> #include <wx/spinctrl.h> #include <wx/frame.h> -#include <wx/statbmp.h> -#include <wx/dialog.h> -#include "../zen/i18n.h" +#include "zen/i18n.h" /////////////////////////////////////////////////////////////////////////// @@ -91,7 +89,7 @@ protected: public: - MainDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("RealtimeSync - Automated Synchronization"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); + MainDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); ~MainDlgGenerated(); @@ -116,33 +114,4 @@ public: }; -/////////////////////////////////////////////////////////////////////////////// -/// Class ErrorDlgGenerated -/////////////////////////////////////////////////////////////////////////////// -class ErrorDlgGenerated : public wxDialog -{ -private: - -protected: - wxPanel* m_panel3; - wxStaticBitmap* m_bitmap10; - wxTextCtrl* m_textCtrl8; - wxStaticLine* m_staticline2; - wxBoxSizer* bSizerStdButtons; - wxButton* m_buttonRetry; - wxButton* m_buttonCancel; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnRetry( wxCommandEvent& event ) { event.Skip(); } - virtual void OnAbort( wxCommandEvent& event ) { event.Skip(); } - - -public: - - ErrorDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Error"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~ErrorDlgGenerated(); - -}; - #endif //__GUI_GENERATED_H__ diff --git a/RealtimeSync/main_dlg.cpp b/RealtimeSync/main_dlg.cpp index 7b3e0f92..f29f396b 100644 --- a/RealtimeSync/main_dlg.cpp +++ b/RealtimeSync/main_dlg.cpp @@ -5,24 +5,27 @@ // ************************************************************************** #include "main_dlg.h" -#include "resources.h" -#include <wx/msgdlg.h> #include <wx/wupdlock.h> #include <wx/filedlg.h> #include <wx+/bitmap_button.h> #include <wx+/string_conv.h> #include <wx+/mouse_move_dlg.h> #include <wx+/font_size.h> +#include <wx+/popup_dlg.h> +#include <wx+/image_resources.h> #include <zen/assert_static.h> #include <zen/file_handling.h> #include <zen/build_info.h> #include "xml_proc.h" #include "tray_menu.h" #include "xml_ffs.h" +#include "app_icon.h" #include "../lib/help_provider.h" #include "../lib/process_xml.h" #include "../lib/ffs_paths.h" -#ifdef ZEN_MAC +#ifdef ZEN_LINUX +#include <gtk/gtk.h> +#elif defined ZEN_MAC #include <ApplicationServices/ApplicationServices.h> #endif @@ -34,7 +37,14 @@ class DirectoryPanel : public FolderGenerated public: DirectoryPanel(wxWindow* parent) : FolderGenerated(parent), - dirName(*this, *m_buttonSelectDir, *m_txtCtrlDirectory) {} + dirName(*this, *m_buttonSelectDir, *m_txtCtrlDirectory) + { +#ifdef ZEN_LINUX + //file drag and drop directly into the text control unhelpfully inserts in format "file://..<cr><nl>"; see folder_history_box.cpp + if (GtkWidget* widget = m_txtCtrlDirectory->GetConnectWidget()) + ::gtk_drag_dest_unset(widget); +#endif + } void setName(const wxString& dirname) { dirName.setName(dirname); } wxString getName() const { return dirName.getName(); } @@ -55,10 +65,16 @@ MainDialog::MainDialog(wxDialog* dlg, const Zstring& cfgFileName) { #ifdef ZEN_WIN new MouseMoveWindow(*this); //ownership passed to "this" + wxWindowUpdateLocker dummy(this); //leads to GUI corruption problems on Linux/OS X! #endif - wxWindowUpdateLocker dummy(this); //avoid display distortion - SetIcon(GlobalResources::instance().programIconRTS); //set application icon +#ifdef ZEN_LINUX + //file drag and drop directly into the text control unhelpfully inserts in format "file://..<cr><nl>"; see folder_history_box.cpp + if (GtkWidget* widget = m_txtCtrlDirectoryMain->GetConnectWidget()) + ::gtk_drag_dest_unset(widget); +#endif + + SetIcon(getRtsIcon()); //set application icon setRelativeFontSize(*m_buttonStart, 1.5); @@ -67,8 +83,6 @@ MainDialog::MainDialog(wxDialog* dlg, const Zstring& cfgFileName) m_bpButtonAddFolder ->SetBitmapLabel(getResourceImage(L"item_add")); m_bpButtonRemoveTopFolder->SetBitmapLabel(getResourceImage(L"item_remove")); - ///m_buttonStart ->setBitmapFront(getResourceImage(L"startRts"), 5); - setBitmapTextLabel(*m_buttonStart, getResourceImage(L"startRts").ConvertToImage(), m_buttonStart->GetLabel(), 5, 8); @@ -89,12 +103,12 @@ MainDialog::MainDialog(wxDialog* dlg, const Zstring& cfgFileName) rts::readRealOrBatchConfig(currentConfigFile, newConfig); //throw FfsXmlError loadCfgSuccess = true; } - catch (const xmlAccess::FfsXmlError& error) + catch (const xmlAccess::FfsXmlError& e) { - if (error.getSeverity() == xmlAccess::FfsXmlError::WARNING) - wxMessageBox(error.toString(),L"RealtimeSync" + _("Warning"), wxOK | wxICON_WARNING, this); + if (e.getSeverity() == xmlAccess::FfsXmlError::WARNING) + showNotificationDialog(this, DialogInfoType::WARNING, PopupDialogCfg().setDetailInstructions(e.toString())); else - wxMessageBox(error.toString(), L"RealtimeSync" + _("Error"), wxOK | wxICON_ERROR, this); + showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); } const bool startWatchingImmediately = loadCfgSuccess && !cfgFileName.empty(); @@ -102,15 +116,6 @@ MainDialog::MainDialog(wxDialog* dlg, const Zstring& cfgFileName) setConfiguration(newConfig); setLastUsedConfig(currentConfigFile); //----------------------------------------------------------------------------------------- - //Layout(); - //Fit(); - - m_scrolledWinFolders->Fit(); //adjust scrolled window size - m_scrolledWinFolders->Layout(); //fix small layout problem - m_panelMain->Layout(); //adjust stuff inside scrolled window - Fit(); //adapt dialog size - - Center(); if (startWatchingImmediately) //start watch mode directly { @@ -124,9 +129,9 @@ MainDialog::MainDialog(wxDialog* dlg, const Zstring& cfgFileName) Show(); #ifdef ZEN_MAC ProcessSerialNumber psn = { 0, kCurrentProcess }; + ::SetFrontProcess(&psn); //call before TransformProcessType() so that OSX menu is updated correctly ::TransformProcessType(&psn, kProcessTransformToForegroundApplication); //show dock icon, even if we're not an application bundle //if the executable is not yet in a bundle or if it is called through a launcher, we need to set focus manually: - ::SetFrontProcess(&psn); #endif } @@ -147,9 +152,9 @@ MainDialog::~MainDialog() { writeRealConfig(currentCfg, lastConfigFileName()); //throw FfsXmlError } - catch (const xmlAccess::FfsXmlError& error) + catch (const xmlAccess::FfsXmlError& e) { - wxMessageBox(error.toString().c_str(), L"RealtimeSync" + _("Error"), wxOK | wxICON_ERROR, this); + showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); } } @@ -193,17 +198,20 @@ void MainDialog::OnMenuAbout(wxCommandEvent& event) build += L" x86"; assert_static(zen::is32BitBuild || zen::is64BitBuild); - wxMessageBox(L"RealtimeSync" L"\n\n" + replaceCpy(_("Build: %x"), L"%x", build), _("About"), wxOK, this); + showNotificationDialog(this, DialogInfoType::INFO, PopupDialogCfg(). + setTitle(_("About")). + setMainInstructions(L"RealtimeSync" L"\n\n" + replaceCpy(_("Build: %x"), L"%x", build))); } void MainDialog::OnKeyPressed(wxKeyEvent& event) { const int keyCode = event.GetKeyCode(); - if (keyCode == WXK_ESCAPE) + { Close(); - + return; + } event.Skip(); } @@ -230,8 +238,9 @@ void MainDialog::OnStart(wxCommandEvent& event) } Show(); //don't show for EXIT_APP #ifdef ZEN_MAC + ::SetFrontProcess(&psn); //call before TransformProcessType() so that OSX menu is updated correctly + //why isn't this covered by wxWindows::Raise()?? ::TransformProcessType(&psn, kProcessTransformToForegroundApplication); //show dock icon again - ::SetFrontProcess(&psn); //why isn't this covered by wxWindows::Raise()?? #endif Raise(); } @@ -266,7 +275,7 @@ void MainDialog::OnConfigSave(wxCommandEvent& event) } catch (const xmlAccess::FfsXmlError& e) { - wxMessageBox(e.toString().c_str(), L"RealtimeSync" + _("Error"), wxOK | wxICON_ERROR, this); + showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); } } @@ -279,13 +288,13 @@ void MainDialog::loadConfig(const Zstring& filename) { rts::readRealOrBatchConfig(filename, newConfig); } - catch (const xmlAccess::FfsXmlError& error) + catch (const xmlAccess::FfsXmlError& e) { - if (error.getSeverity() == xmlAccess::FfsXmlError::WARNING) - wxMessageBox(error.toString(), L"RealtimeSync" + _("Warning"), wxOK | wxICON_WARNING, this); + if (e.getSeverity() == xmlAccess::FfsXmlError::WARNING) + showNotificationDialog(this, DialogInfoType::WARNING, PopupDialogCfg().setDetailInstructions(e.toString())); else { - wxMessageBox(error.toString(), L"RealtimeSync" + _("Error"), wxOK | wxICON_ERROR, this); + showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); return; } } @@ -300,7 +309,7 @@ void MainDialog::setLastUsedConfig(const Zstring& filename) //set title if (filename == lastConfigFileName()) { - SetTitle(_("RealtimeSync - Automated Synchronization")); + SetTitle(L"RealtimeSync - " + _("Automated Synchronization")); currentConfigFileName.clear(); } else @@ -317,7 +326,7 @@ void MainDialog::OnConfigLoad(wxCommandEvent& event) wxEmptyString, utfCvrtTo<wxString>(beforeLast(currentConfigFileName, FILE_NAME_SEPARATOR)), //default dir; empty string if / not found wxEmptyString, - wxString(L"RealtimeSync (*.ffs_real;*.ffs_batch)|*.ffs_real;*.ffs_batch") + L"|" +_("All files") + L" (*.*)|*", + wxString(L"RealtimeSync (*.ffs_real; *.ffs_batch)|*.ffs_real;*.ffs_batch") + L"|" +_("All files") + L" (*.*)|*", wxFD_OPEN); if (filePicker.ShowModal() == wxID_OK) loadConfig(utfCvrtTo<Zstring>(filePicker.GetPath())); @@ -336,7 +345,6 @@ void MainDialog::setConfiguration(const xmlAccess::XmlRealConfig& cfg) { //clear existing folders dirNameFirst->setName(wxString()); - clearAddFolders(); if (!cfg.directories.empty()) @@ -389,10 +397,10 @@ void MainDialog::OnRemoveFolder(wxCommandEvent& event) { //find folder pair originating the event const wxObject* const eventObj = event.GetEventObject(); - for (std::vector<DirectoryPanel*>::const_iterator i = dirNamesExtra.begin(); i != dirNamesExtra.end(); ++i) - if (eventObj == static_cast<wxObject*>((*i)->m_bpButtonRemoveFolder)) + for (auto it = dirNamesExtra.begin(); it != dirNamesExtra.end(); ++it) + if (eventObj == static_cast<wxObject*>((*it)->m_bpButtonRemoveFolder)) { - removeAddFolder(i - dirNamesExtra.begin()); + removeAddFolder(it - dirNamesExtra.begin()); return; } } @@ -423,7 +431,9 @@ void MainDialog::addFolder(const std::vector<Zstring>& newFolders, bool addFront if (newFolders.size() == 0) return; - wxWindowUpdateLocker dummy(this); //avoid display distortion +#ifdef ZEN_WIN + wxWindowUpdateLocker dummy(this); //leads to GUI corruption problems on Linux/OS X! +#endif int folderHeight = 0; for (auto it = newFolders.begin(); it != newFolders.end(); ++it) @@ -459,19 +469,18 @@ void MainDialog::addFolder(const std::vector<Zstring>& newFolders, bool addFront //adapt delete top folder pair button m_bpButtonRemoveTopFolder->Show(); - m_panelMainFolder->Layout(); - //update controls - m_scrolledWinFolders->Fit(); //adjust scrolled window size - m_scrolledWinFolders->Layout(); //fix small layout problem - m_panelMain->Layout(); //adjust stuff inside scrolled window - Fit(); //adapt dialog size + GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() + Layout(); + Refresh(); //remove a little flicker near the start button } void MainDialog::removeAddFolder(size_t pos) { - wxWindowUpdateLocker dummy(this); //avoid display distortion +#ifdef ZEN_WIN + wxWindowUpdateLocker dummy(this); //leads to GUI corruption problems on Linux/OS X! +#endif if (pos < dirNamesExtra.size()) { @@ -498,24 +507,28 @@ void MainDialog::removeAddFolder(size_t pos) m_panelMainFolder->Layout(); } - //update controls - m_scrolledWinFolders->Fit(); //adjust scrolled window size - m_panelMain->Layout(); //adjust stuff inside scrolled window - Fit(); //adapt dialog size + GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() + Layout(); + Refresh(); //remove a little flicker near the start button } } void MainDialog::clearAddFolders() { - wxWindowUpdateLocker dummy(this); //avoid display distortion +#ifdef ZEN_WIN + wxWindowUpdateLocker dummy(this); //leads to GUI corruption problems on Linux/OS X! +#endif - dirNamesExtra.clear(); bSizerFolders->Clear(true); + dirNamesExtra.clear(); + + m_scrolledWinFolders->SetMinSize(wxSize(-1, 0)); m_bpButtonRemoveTopFolder->Hide(); m_panelMainFolder->Layout(); - m_scrolledWinFolders->SetMinSize(wxSize(-1, 0)); - Fit(); //adapt dialog size + GetSizer()->SetSizeHints(this); //~=Fit() + Layout(); + Refresh(); //remove a little flicker near the start button } diff --git a/RealtimeSync/makefile b/RealtimeSync/makefile index 50a08049..8098d586 100644 --- a/RealtimeSync/makefile +++ b/RealtimeSync/makefile @@ -42,7 +42,7 @@ CXXFLAGS += -DZEN_MAC WX_CONFIG_BIN =$(HOME)/Desktop/wxWidgets-2.9.5/lib/release/bin/wx-config CXXFLAGS += -I$(HOME)/Desktop/boost_1_54_0 BOOST_LIB_DIR =$(HOME)/Desktop/boost_1_54_0/stage/lib -MACOS_SDK =-mmacosx-version-min=10.7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk +MACOS_SDK =-mmacosx-version-min=10.7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk #-Wl,-Bstatic not supported on OSX! # link wxWidgets and boost statically -> check dependencies with: otool -L RealtimeSync @@ -56,7 +56,6 @@ CPP_LIST= #internal list of all *.cpp files needed for compilation CPP_LIST+=application.cpp CPP_LIST+=gui_generated.cpp CPP_LIST+=main_dlg.cpp -CPP_LIST+=resources.cpp CPP_LIST+=tray_menu.cpp CPP_LIST+=monitor.cpp CPP_LIST+=xml_ffs.cpp @@ -74,7 +73,11 @@ CPP_LIST+=../zen/file_handling.cpp CPP_LIST+=../zen/file_io.cpp CPP_LIST+=../zen/file_traverser.cpp CPP_LIST+=../zen/zstring.cpp +CPP_LIST+=../zen/format_unit.cpp CPP_LIST+=../wx+/image_tools.cpp +CPP_LIST+=../wx+/image_resources.cpp +CPP_LIST+=../wx+/popup_dlg.cpp +CPP_LIST+=../wx+/popup_dlg_generated.cpp #list of all *.o files (we need the "RTS" subdirectory to handle "../*.cpp" files OBJECT_LIST=$(CPP_LIST:%.cpp=../OBJ/RTS_GCC_Make_Release/RTS/%.o) diff --git a/RealtimeSync/resources.cpp b/RealtimeSync/resources.cpp deleted file mode 100644 index 34c9e8dc..00000000 --- a/RealtimeSync/resources.cpp +++ /dev/null @@ -1,79 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * -// ************************************************************************** - -#include "resources.h" -#include <memory> -#include <zen/utf.h> -#include <wx/wfstream.h> -#include <wx/zipstrm.h> -#include <wx/image.h> -#include "../lib/ffs_paths.h" - -using namespace zen; - - -const GlobalResources& GlobalResources::instance() -{ - static GlobalResources inst; - return inst; -} - - -GlobalResources::GlobalResources() -{ - wxFFileInputStream input(utfCvrtTo<wxString>(zen::getResourceDir()) + L"Resources.zip"); - if (input.IsOk()) //if not... we don't want to react too harsh here - { - //activate support for .png files - wxImage::AddHandler(new wxPNGHandler); //ownership passed - - wxZipInputStream resourceFile(input, wxConvUTF8); - //do NOT rely on wxConvLocal! May result in "Cannot convert from the charset 'Unknown encoding (-1)'!" - - while (true) - { - std::unique_ptr<wxZipEntry> entry(resourceFile.GetNextEntry()); - if (entry.get() == nullptr) - break; - - const wxString name = entry->GetName(); - - //generic image loading - if (endsWith(name, L".png")) - bitmaps.insert(std::make_pair(name, wxImage(resourceFile, wxBITMAP_TYPE_PNG))); - } - } - -#ifdef ZEN_WIN - //for compatibility it seems we need to stick with a "real" icon - programIconRTS = wxIcon(L"A_RTS_ICON"); - -#elif defined ZEN_LINUX - programIconRTS.CopyFromBitmap(getImage(L"RealtimeSync")); - -#elif defined ZEN_MAC - assert(getImage(L"RealtimeSync").GetWidth () == getImage(L"RealtimeSync").GetHeight() && - getImage(L"RealtimeSync").GetWidth() % 128 == 0); - //wxWidgets' bitmap to icon conversion on OS X can only deal with very specific sizes - programIconRTS.CopyFromBitmap(getImage(L"RealtimeSync").ConvertToImage().Scale(128, 128, wxIMAGE_QUALITY_HIGH)); -#endif - -} - - -const wxBitmap& GlobalResources::getImage(const wxString& name) const -{ - auto it = bitmaps.find(!contains(name, L'.') ? //assume .png ending if nothing else specified - name + L".png" : - name); - if (it != bitmaps.end()) - return it->second; - else - { - assert(false); - return wxNullBitmap; - } -} diff --git a/RealtimeSync/resources.h b/RealtimeSync/resources.h deleted file mode 100644 index 7cec3a73..00000000 --- a/RealtimeSync/resources.h +++ /dev/null @@ -1,36 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * -// ************************************************************************** - -#ifndef RESOURCES_H_INCLUDED_870857342085670826521345 -#define RESOURCES_H_INCLUDED_870857342085670826521345 - -#include <map> -#include <wx/bitmap.h> -#include <wx/icon.h> - - -class GlobalResources -{ -public: - static const GlobalResources& instance(); - - const wxBitmap& getImage(const wxString& name) const; - - //image resource objects - wxIcon programIconRTS; - -private: - GlobalResources(); - GlobalResources(const GlobalResources&); //=delete - GlobalResources& operator=(const GlobalResources&); //=delete - - std::map<wxString, wxBitmap> bitmaps; -}; - -inline -const wxBitmap& getResourceImage(const wxString& name) { return GlobalResources::instance().getImage(name); } - -#endif //RESOURCES_H_INCLUDED_870857342085670826521345 diff --git a/RealtimeSync/tray_menu.cpp b/RealtimeSync/tray_menu.cpp index e1cf8cad..6e67b5ec 100644 --- a/RealtimeSync/tray_menu.cpp +++ b/RealtimeSync/tray_menu.cpp @@ -5,20 +5,17 @@ // ************************************************************************** #include "tray_menu.h" -#include <zen/build_info.h> -#include <zen/tick_count.h> #include <zen/thread.h> -#include <wx+/mouse_move_dlg.h> -#include <wx+/image_tools.h> -//#include <wx+/string_conv.h> -#include <wx+/shell_execute.h> -#include <wx+/std_button_order.h> +#include <zen/tick_count.h> #include <wx/taskbar.h> #include <wx/icon.h> //Linux needs this #include <wx/app.h> +#include <wx/menu.h> #include <wx/timer.h> -#include "resources.h" -#include "gui_generated.h" +#include <wx+/image_tools.h> +#include <zen/shell_execute.h> +#include <wx+/popup_dlg.h> +#include <wx+/image_resources.h> #include "monitor.h" #include "../lib/resolve_path.h" @@ -67,7 +64,7 @@ public: trayBmp(getResourceImage(L"RTS_tray_24x24")) //use a 24x24 bitmap for perfect fit #endif { - Connect(wxEVT_TASKBAR_LEFT_DCLICK, wxCommandEventHandler(TrayIconObject::OnDoubleClick), nullptr, this); + Connect(wxEVT_TASKBAR_LEFT_DCLICK, wxEventHandler(TrayIconObject::OnDoubleClick), nullptr, this); setMode(mode); } @@ -122,24 +119,29 @@ private: { CONTEXT_RESTORE = 1, //wxWidgets: "A MenuItem ID of zero does not work under Mac" CONTEXT_SHOW_ERROR, - CONTEXT_ABORT = wxID_EXIT, - CONTEXT_ABOUT = wxID_ABOUT + CONTEXT_ABORT = wxID_EXIT }; virtual wxMenu* CreatePopupMenu() { wxMenu* contextMenu = new wxMenu; + + wxMenuItem* defaultItem = nullptr; switch (mode) { case TRAY_MODE_ACTIVE: case TRAY_MODE_WAITING: - contextMenu->Append(CONTEXT_RESTORE, _("&Restore")); + defaultItem = new wxMenuItem(contextMenu, CONTEXT_RESTORE, _("&Restore")); break; case TRAY_MODE_ERROR: - contextMenu->Append(CONTEXT_SHOW_ERROR, _("&Show error")); + defaultItem = new wxMenuItem(contextMenu, CONTEXT_SHOW_ERROR, _("&Show error")); break; } - contextMenu->Append(CONTEXT_ABOUT, _("&About")); +#ifdef ZEN_WIN //no wxMenuItem::SetFont() on Linux and OS X: wasn't wxWidgets supposed to be *portable* at some point in time????? + defaultItem->SetFont(wxNORMAL_FONT->Bold()); +#endif + contextMenu->Append(defaultItem); + contextMenu->AppendSeparator(); contextMenu->Append(CONTEXT_ABORT, _("&Exit")); //event handling @@ -163,34 +165,10 @@ private: case CONTEXT_SHOW_ERROR: showErrorMsgRequested = true; break; - - case CONTEXT_ABOUT: - { - //ATTENTION: the modal dialog below does NOT disable all GUI input, e.g. user may still double-click on tray icon - //no crash in this context, but the double-click is remembered and executed after the modal dialog quits - SetEvtHandlerEnabled(false); - ZEN_ON_SCOPE_EXIT(SetEvtHandlerEnabled(true)); - - wxString build = __TDATE__; -#if wxUSE_UNICODE - build += L" - Unicode"; -#else - build += L" - ANSI"; -#endif //wxUSE_UNICODE - - if (zen::is64BitBuild) - build += L" x64"; - else - build += L" x86"; - assert_static(zen::is32BitBuild || zen::is64BitBuild); - - wxMessageBox(L"RealtimeSync" L"\n\n" + replaceCpy(_("Build: %x"), L"%x", build), _("About"), wxOK); - } - break; } } - void OnDoubleClick(wxCommandEvent& event) + void OnDoubleClick(wxEvent& event) { switch (mode) { @@ -262,85 +240,6 @@ private: }; //############################################################################################################## - -//#define ERROR_DLG_ENABLE_TIMEOUT -class ErrorDlgWithTimeout : public ErrorDlgGenerated -{ -public: - ErrorDlgWithTimeout(wxWindow* parent, const wxString& messageText) : - ErrorDlgGenerated(parent) -#ifdef ERROR_DLG_ENABLE_TIMEOUT - , secondsLeft(15) //give user some time to read msg!? -#endif - { -#ifdef ZEN_WIN - new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" -#endif - setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonRetry).setCancel(m_buttonCancel)); - - m_bitmap10->SetBitmap(getResourceImage(L"msg_error")); - m_textCtrl8->SetValue(messageText); - -#ifdef ERROR_DLG_ENABLE_TIMEOUT - //count down X seconds then automatically press "retry" - timer.Connect(wxEVT_TIMER, wxEventHandler(ErrorDlgWithTimeout::OnTimerEvent), nullptr, this); - timer.Start(1000); //timer interval in ms - updateButtonLabel(); -#endif - Fit(); //child-element widths have changed: image was set - m_buttonRetry->SetFocus(); - } - - enum ButtonPressed - { - BUTTON_RETRY, - BUTTON_ABORT - }; - -private: -#ifdef ERROR_DLG_ENABLE_TIMEOUT - void OnTimerEvent(wxEvent& event) - { - if (secondsLeft <= 0) - { - EndModal(BUTTON_RETRY); - return; - } - --secondsLeft; - updateButtonLabel(); - } - - void updateButtonLabel() - { - m_buttonRetry->SetLabel(_("&Retry") + L" (" + replaceCpy(_P("1 sec", "%x sec", secondsLeft), L"%x", numberTo<std::wstring>(secondsLeft)) + L")"); - Layout(); - } -#endif - - void OnClose(wxCloseEvent& event) { EndModal(BUTTON_ABORT); } - void OnRetry(wxCommandEvent& event) { EndModal(BUTTON_RETRY); } - void OnAbort(wxCommandEvent& event) { EndModal(BUTTON_ABORT); } - -#ifdef ERROR_DLG_ENABLE_TIMEOUT - int secondsLeft; - wxTimer timer; -#endif -}; - - -bool reportErrorTimeout(const std::wstring& msg) //return true: "retry"; false: "abort" -{ - ErrorDlgWithTimeout errorDlg(nullptr, msg); - errorDlg.Raise(); - switch (static_cast<ErrorDlgWithTimeout::ButtonPressed>(errorDlg.ShowModal())) - { - case ErrorDlgWithTimeout::BUTTON_RETRY: - return true; - case ErrorDlgWithTimeout::BUTTON_ABORT: - return false; - } - return false; -} } @@ -351,7 +250,7 @@ rts::AbortReason rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& conf if (dirNamesNonFmt.empty()) { - wxMessageBox(_("A folder input field is empty."), L"RealtimeSync" + _("Error"), wxOK | wxICON_ERROR); + showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setMainInstructions(_("A folder input field is empty."))); return SHOW_GUI; } @@ -360,7 +259,7 @@ rts::AbortReason rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& conf if (cmdLine.empty()) { - wxMessageBox(_("Invalid command line:") + L" \"\"", L"RealtimeSync" + _("Error"), wxOK | wxICON_ERROR); + showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setMainInstructions(_("Incorrect command line:") + L" \"\"")); return SHOW_GUI; } @@ -385,7 +284,15 @@ rts::AbortReason rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& conf virtual void executeExternalCommand() { auto cmdLineExp = expandMacros(cmdLine_); - zen::shellExecute(cmdLineExp, zen::EXEC_TYPE_SYNC); + try + { + shellExecute2(cmdLineExp, EXEC_TYPE_SYNC); //throw FileError + } + catch (const FileError& e) + { + warn_static("fix dialog hiding on OSX !!") + showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + } } virtual void requestUiRefresh() @@ -406,12 +313,14 @@ rts::AbortReason rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& conf trayIcon.doUiRefreshNow(); //throw AbortMonitoring if (trayIcon.getShowErrorRequested()) - { - if (reportErrorTimeout(msg)) //return true: "retry"; false: "abort" - return; - else - throw AbortMonitoring(SHOW_GUI); - } + switch (showConfirmationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg(). + setDetailInstructions(msg), _("&Retry"))) + { + case ConfirmationButton::DO_IT: //retry + return; + case ConfirmationButton::CANCEL: + throw AbortMonitoring(SHOW_GUI); + } boost::this_thread::sleep(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL)); } } |