1
0
mirror of https://github.com/azure-rtos/guix.git synced 2025-02-04 07:13:17 +08:00
guix/guix_studio/studiox.cpp

513 lines
14 KiB
C++

// studiox.cpp : Defines the class behaviors for the application.
//
#include "studiox_includes.h"
#include "studioxDoc.h"
#include "splash_screen.h"
#include "studiox_includes.h"
#include "studiox.h"
#include "clone_repo_dialog.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
/* some fonts used by this app */
CFont TitleFont;
CFont MediumFont;
CFont NormalFont;
CFont TinyFont;
CFont ViewHeaderFont;
CFont AsteriskFont;
UINT StudioClipboardFormat = 0;
// CstudioxApp
BEGIN_MESSAGE_MAP(CstudioxApp, CWinApp)
ON_COMMAND(ID_APP_ABOUT, &CstudioxApp::OnAppAbout)
ON_COMMAND(ID_HELP_USER_GUIDE, &CstudioxApp::OnUsersGuide)
// Standard file based document commands
ON_COMMAND(ID_PROJECT_NEW, &CstudioxApp::OnProjectNew)
ON_COMMAND(ID_FILE_NEW, &CstudioxApp::OnProjectNew)
ON_COMMAND(ID_PROJECT_OPEN, &CstudioxApp::OnProjectOpen)
ON_COMMAND(ID_FILE_OPEN, &CstudioxApp::OnProjectOpen)
ON_COMMAND(ID_PROJECT_SAVE, &CstudioxApp::OnProjectSave)
ON_COMMAND(ID_FILE_SAVE, &CstudioxApp::OnProjectSave)
ON_COMMAND(ID_PROJECT_SAVE_AS, &CstudioxApp::OnProjectSaveAs)
ON_COMMAND(ID_PROJECT_CLOSE, &CstudioxApp::OnProjectClose)
ON_COMMAND(ID_FILE_CLOSE, &CstudioxApp::OnProjectClose)
ON_COMMAND(ID_PROJECT_IMPORT, &CstudioxApp::OnProjectMerge)
// Standard print setup command
END_MESSAGE_MAP()
// CstudioxApp construction
CstudioxApp::CstudioxApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
#if defined (REPORT_MEMORY_LEAKS)
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif
}
// The one and only CstudioxApp object
CstudioxApp theApp;
CFrameWnd *CstudioxApp::CreateMainFrame()
{
LoadIcon(IDR_MAINFRAME);
CFrameWnd* pFrame = new CMainFrame();
// create new from resource
if (!pFrame->LoadFrame(IDR_MAINFRAME,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, // default frame styles
NULL, NULL))
{
TRACE(traceAppMsg, 0, "Warning: couldn't create a frame.\n");
// frame will be deleted in PostNcDestroy cleanup
return NULL;
}
// it worked !
return pFrame;
}
// CstudioxApp initialization
CString splash_class_name;
CString studiox_version_string;
void CstudioxApp::DeleteSystemFonts()
{
TitleFont.DeleteObject();
MediumFont.DeleteObject();
NormalFont.DeleteObject();
AsteriskFont.DeleteObject();
TinyFont.DeleteObject();
ViewHeaderFont.DeleteObject();
}
void CstudioxApp::CreateSystemFonts()
{
/* Create the fonts used by app */
// this formula can be used to convert point size to logical units
// lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
HDC dc = ::GetDC(NULL);
// Get number of pixels per logical inch along the screen height
int dpi = GetDeviceCaps(dc, LOGPIXELSY);
int text_scaler = GetTextScaler();
TitleFont.CreateFont(TITLE_FONT_HEIGHT, 0, 0, 0,
FW_BOLD, FALSE, FALSE, 0,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
CLEARTYPE_QUALITY,
DEFAULT_PITCH | FF_SWISS, _T("Arial"));
// Convert point size to logic unit
int height = -MulDiv(MEDIUM_FONT_PT_SIZE, dpi, 72);
height = MulDiv(height, text_scaler, DEFAULT_TEXT_SCALER);
MediumFont.CreateFont(height, 0, 0, 0,
FW_SEMIBOLD, FALSE, FALSE, 0,
ANSI_CHARSET,
OUT_TT_PRECIS,
CLIP_DEFAULT_PRECIS,
CLEARTYPE_QUALITY,
DEFAULT_PITCH | FF_SWISS, _T("Arial"));
height = -MulDiv(NORMAL_FONT_PT_SIZE, dpi, 72);
height = MulDiv(height, text_scaler, DEFAULT_TEXT_SCALER);
NormalFont.CreateFont(height, 0, 0, 0,
FW_NORMAL, FALSE, FALSE, 0,
ANSI_CHARSET,
OUT_TT_PRECIS,
CLIP_DEFAULT_PRECIS,
CLEARTYPE_QUALITY,
DEFAULT_PITCH | FF_SWISS, _T("Arial"));
height = -MulDiv(ASTERISK_FONT_PT_SIZE, dpi, 72);
height = MulDiv(height, text_scaler, DEFAULT_TEXT_SCALER);
AsteriskFont.CreateFont(height, 0, 0, 0,
FW_NORMAL, FALSE, FALSE, 0,
ANSI_CHARSET,
OUT_TT_PRECIS,
CLIP_DEFAULT_PRECIS,
CLEARTYPE_QUALITY,
DEFAULT_PITCH | FF_SWISS, _T("Arial"));
TinyFont.CreateFont(TYNY_FONT_HEIGHT, 0, 0, 0,
FW_BOLD, FALSE, FALSE, 0,
ANSI_CHARSET,
OUT_TT_PRECIS,
CLIP_DEFAULT_PRECIS,
CLEARTYPE_QUALITY,
DEFAULT_PITCH | FF_DONTCARE, NULL);
height = -MulDiv(VIEW_HEADER_FONT_PT_SIZE, dpi, 72);
height = MulDiv(height, text_scaler, DEFAULT_TEXT_SCALER);
ViewHeaderFont.CreateFont(height, 0, 0, 0,
FW_SEMIBOLD, FALSE, FALSE, 0,
ANSI_CHARSET,
OUT_TT_PRECIS,
CLIP_DEFAULT_PRECIS,
CLEARTYPE_QUALITY,
DEFAULT_PITCH | FF_SWISS, _T("Arial"));
ReleaseDC(NULL, dc);
}
BOOL CstudioxApp::InitInstance()
{
// InitCommonControlsEx() is required on Windows XP if an application
// manifest specifies use of ComCtl32.dll version 6 or later to enable
// visual styles. Otherwise, any window creation will fail.
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// Set this to include all the common control classes you want to use
// in your application.
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
// Initialize OLE libraries
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer();
//LoadStdProfileSettings(4); // Load standard INI file options (including MRU)
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views
CreateSystemFonts();
/* Initialize our INI_INFO structure */
ReadIniInfo();
/* Register out clipboard format */
StudioClipboardFormat = RegisterClipboardFormat(_T("GUIX_Studio_Widget_Info"));
/* Create the MainFrame, but don't show it yet */
m_pMainWnd = CreateMainFrame();
if (!m_pMainWnd)
{
return FALSE;
}
studiox_version_string.Format(_T("%d.%d.%d.%d"),
GUIX_MAJOR_VERSION,
GUIX_MINOR_VERSION,
GUIX_PATCH_VERSION,
STUDIOX_VERSION_NUMBER);
#if defined(STUDIO_ENGINEERING_RELEASE)
studiox_version_string += CString("-engineering");
#endif
CString fulltitle = _T("Azure RTOS GUIX Studio ");
fulltitle += studiox_version_string;
m_pMainWnd->SetWindowText(fulltitle);
splash_class_name = AfxRegisterWndClass(
CS_VREDRAW | CS_HREDRAW,
::LoadCursor(NULL, IDC_ARROW),
CreateSolidBrush(RGB(0, 0, 0)),
::LoadIcon(NULL, IDI_APPLICATION));
/* Read command info. */
CMainFrame *pMain = (CMainFrame *) AfxGetMainWnd();
CCommandInfo *pCmdInfo = pMain->GetCmdInfo();
if(m_lpCmdLine[0])
{
pCmdInfo -> ReadCommandLineInfo(m_lpCmdLine);
CString guix_repo_local_path = pCmdInfo->GetGuixRepoLocalPath();
if (!guix_repo_local_path.IsEmpty())
{
if (guix_repo_local_path.GetLength() >= MAX_PATH)
{
return FALSE;
}
char local_path[MAX_PATH];
memset(local_path, 0, MAX_PATH);
HANDLE file_map_handle = pCmdInfo->GetGuixCloneWritePipeHandle();
strcpy_s(local_path, MAX_PATH, CStringA(guix_repo_local_path).GetString());
CloneGUIXRepo(local_path, file_map_handle);
pMain->OnClose();
return TRUE;
}
}
/* Display the Splash screen */
#if !defined(_DEBUG)
//#if 1
if(!pCmdInfo->IsNoGui())
{
int tag_status;
CRect childrect(0, 0, 425, 283);
splash_screen *splash = new splash_screen(TRUE);
splash->CreateEx(0, splash_class_name, NULL,
WS_POPUP|WS_VISIBLE|WS_BORDER, childrect, NULL, 0, NULL);
tag_status = splash->RunModalLoop();
splash->DestroyWindow();
delete splash;
if (tag_status != 0)
{
return FALSE;
}
}
#endif
// The one and only window has been initialized, so show and update it
if (!pCmdInfo->IsNoGui())
{
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
}
//Initialize GDI+ resources
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
if (m_lpCmdLine[0])
{
/* Open the log file. */
if (pCmdInfo->GetLogFile())
{
fprintf(pCmdInfo->GetLogFile(), "\nProject File: %s\\%s\n", (char*)CW2A(pCmdInfo->GetProjectPath()), (char*)CW2A(pCmdInfo->GetProjectName()));
}
/* Open project. */
if (GetProjectView()->OpenProject(pCmdInfo->GetProjectPath(), pCmdInfo->GetProjectName()))
{
CString output_path = pCmdInfo->GetOutputPath();
if (!output_path.IsEmpty())
{
studiox_project *project = GetOpenProject();
if (project)
{
project->mHeader.resource_path = output_path;
project->mHeader.source_path = output_path;
project->mHeader.header_path = output_path;
}
}
if (pCmdInfo->IsXmlMode())
{
/* Open the log file. */
if (pCmdInfo->GetLogFile())
{
fprintf(pCmdInfo->GetLogFile(), "Generating Resource File.\n");
}
if (pCmdInfo->IsBinaryMode())
{
binary_resource_gen *generater = new binary_resource_gen(GetOpenProject(), BINARY_FILE_FORMAT_BIN_STANDALONE);
generater->GenerateBinaryFile(0);
delete generater;
}
else
{
resource_gen* generater = new resource_gen(GetOpenProject());
generater->GenerateResourceFile(0);
delete generater;
}
if (pCmdInfo->GetLogFile())
{
fprintf(pCmdInfo->GetLogFile(), "Resource File Generation Completed.\n");
}
}
else
{
CString pathname = pCmdInfo->GetStringImportFileName();
if (!pathname.IsEmpty())
{
/* Open the log file. */
if (pCmdInfo->GetLogFile())
{
fprintf(pCmdInfo->GetLogFile(), "Improting String Data.\n");
}
//import string
BOOL successed = FALSE;
CString extention = PathFindExtension(pathname);
extention.MakeLower();
if (extention == ".csv")
{
csv_read_write reader;
if (reader.ImportCsvFile(GetOpenProject(), pathname))
{
successed = TRUE;
}
}
else
{
xliff_read_write reader;
if (reader.ImportXliffFile(GetOpenProject(), pathname))
{
successed = TRUE;
}
}
if (successed)
{
GetOpenProject()->SetModified();
Notify("String Data Import Completed.");
}
else
{
ErrorMsg("String Data Import Failed!");
}
}
if (pCmdInfo->IsNoGui())
{
/* Generate resource files. */
if (pCmdInfo->GenResource())
{
if (pCmdInfo->IsBinaryMode())
{
GetProjectView()->OnGenBinary();
}
else
{
GetProjectView()->OnGenResources();
}
}
/* Generate specification files. */
if (pCmdInfo->GenSpecification())
{
GetProjectView()->OnGenApplication();
}
}
}
}
/* Close the log file. */
if(pCmdInfo ->GetLogFile())
{
fclose(pCmdInfo ->GetLogFile());
}
if(pCmdInfo->IsNoGui())
{
pMain->OnClose();
}
}
else
{
((CMainFrame *)AfxGetMainWnd())->DisableMenus();
GetTargetView()->InitialDisplay();
}
// call DragAcceptFiles only if there's a suffix
// In an SDI app, this should occur after ProcessShellCommand
return TRUE;
}
int CstudioxApp::ExitInstance()
{
GdiplusShutdown(gdiplusToken);
return CWinApp::ExitInstance();
}
// App command to run the dialog
void CstudioxApp::OnAppAbout()
{
CRect childrect(0, 0, 425, 283);
splash_screen *splash = new splash_screen(FALSE);
splash->CreateEx(0, splash_class_name, NULL,
WS_POPUP|WS_VISIBLE|WS_BORDER, childrect, m_pMainWnd, 0, NULL);
splash->RunModalLoop();
splash->DestroyWindow();
delete splash;
}
void CstudioxApp::OnUsersGuide()
{
ShellExecute(NULL, _T("open"), _T("https://aka.ms/azrtos-guix-studio-user-guide"), NULL, NULL, SW_SHOW);
}
void CstudioxApp::OnProjectNew()
{
UndoManager()->Reset();
CMainFrame *pMain = (CMainFrame *) m_pMainWnd;
pMain->GetProjectView()->NewProject();
}
void CstudioxApp::OnProjectOpen()
{
UndoManager()->Reset();
CMainFrame *pMain = (CMainFrame *) m_pMainWnd;
pMain->GetProjectView()->OpenProject();
}
void CstudioxApp::OnProjectMerge()
{
UndoManager()->Reset();
CMainFrame *pMain = (CMainFrame *) m_pMainWnd;
pMain->GetProjectView()->MergeProject();
}
void CstudioxApp::OnProjectClose()
{
UndoManager()->Reset();
CMainFrame *pMain = (CMainFrame *) m_pMainWnd;
pMain->GetProjectView()->CloseProject(TRUE);
}
void CstudioxApp::OnProjectSave()
{
UndoManager()->Reset();
if (GetOpenProject())
{
GetOpenProject()->Save();
}
}
void CstudioxApp::OnProjectSaveAs()
{
UndoManager()->Reset();
studiox_project *project = GetOpenProject();
if (project)
{
project->SaveAs();
}
}
// CstudioxApp message handlers