📄 sys_utils.c
字号:
/*------------------------------------------------------------------------------*
* File Name: sys_utils.c *
* Creation: GJL 3/13/02 *
* Purpose: Basic and common utilities for general Origin C development. *
* Copyright (c) OriginLab Corp. 2002, 2003, 2004, 2005, 2006, 2007 *
* All Rights Reserved *
* *
* Modification Log: *
* JCG 06/17/03 QA70-4575 IMP_WIZD_BUG_45_AND_28 *
* EJP 07-10-2003 v7.0622 QA70-4745 SET_PAGE_IMPORT_INFO_ON_123_ASC_IMPORT *
* SY 09-12-2003 QA70-5158 v7.0694 OC_NEED_ROBUST_GET_TEMP_PATH_FUNCTION *
* EJP 11-20-2003 v7.5764 QA70-5587 FAIL_TO_EXPORT_1200DPI_BITMAP *
* EJP 11-24-2003 v7.5769 QA70-5604 LOCALIZE_FILE_TYPE_ALL_FILES *
*------------------------------------------------------------------------------*/
#include <origin.h> // main Origin C header that is precompiled and already include most headers
// TD 10-22-03 REMOVED_DEPENDENCY
//#include "Filter_Utils.h"
#include "local.h"
/// EJP 11-24-2003 v7.5769 QA70-5604 LOCALIZE_FILE_TYPE_ALL_FILES
#define FILETYPE_ALL_FILES _L("[All Files (*.*)] *.*")
/// end LOCALIZE_FILE_TYPE_ALL_FILES
/**
It appends to the string str the ' ' characters until its size
reaches nSize.
*/
void append_blanks_to_size(string &str, int nSize)
{
int nLength = str.GetLength();
for (int ii = nLength + 1; ii <= nSize; ii++)
str += ' ';
return;
}
// Function prototypes of static functions
static int GetFDLogBox( StringArray &saFilePaths, FDLogDialogType fdtDialogType );
static int GetFileDialogBox( StringArray &saFilePaths, StringArray &saFiletypes, FDLogDialogType fdtDialogType = FDLOG_TYPE_OPEN_SINGLE,
LPCSTR lpcszPath = NULL, LPCSTR lpcszFilename = NULL, LPCSTR lpcszDialogName = NULL );
static int GetFileDialogBox( StringArray &saFilePaths, FDLogUseGroup nFDLogUseGroup, FDLogDialogType fdtDialogType = FDLOG_TYPE_OPEN_SINGLE,
LPCSTR lpcszPath = NULL, LPCSTR lpcszFilename = NULL, LPCSTR lpcszDialogName = NULL );
static int GetFileDialogBox( StringArray& saFilePaths, LPCSTR lpcszFileType = NULL, FDLogDialogType fdtDialogType = FDLOG_TYPE_OPEN_SINGLE,
LPCSTR lpcszPath = NULL, LPCSTR lpcszFilename = NULL, LPCSTR lpcszDialogName = NULL );
//////////////////////////////////////////////////////////////////////////////////
/**
Resets or initializes the LabTalk FDLog object. Should be called prior to
opening an FDLog dialog box.
Example:
FDLogInit();
Parameters:
None
Return:
Returns 0 on successful exit.
*/
int FDLogInit()
{
_LT_Obj
{
FDLog.Reset(); // Reset FDLog object
FDLOG.OptionDLG$ = ""; // Reset button to off
FDLOG.Checkname$ = ""; // Reset check box to null
FDLOG.ShowComment = 0; // Reset the comments box to closed
FDLOG.CheckStatus = 0; // Reset checkbox to off
FDLOG.DlgName$ = ""; // Reset dialog name to nothing
FDLOG.Path$ = ""; // Reset default path to nothing
FDLOG.Default$ = ""; // Reset contents of "File Name" edit box to nothing
FDLOG.AsReadOnly = 0; // Reset read only checkbox to disabled
//------------------- CPY v6.0252 t6746 1/26/00 MULTI_OPEN_SUPPORT_BY_ROW_AND_BY_COL_APPEND
FDLOG.MultiOpen.ComboName$ = "";
if( FDLOG.MultiOpen.ComboSel < 1 || FDLOG.MultiOpen.ComboSel > 3 )
FDLOG.MultiOpen.ComboSel = 2; // Import into new columns
//------------------- end t6746
//------------------- GJL v7.0358 QA70-4078 3/17/03 ORIGINC_MULTI_OPEN_SUPPORT
FDLOG.Open.MultiSel = 0; // Reset multiple selection switch (turn off by default)
//------------------- QA70-4078
}
return 0;
}
//------------------- GJL v7.0357 QA70-4078 3/17/03 ORIGINC_MULTI_OPEN_SUPPORT
//////////////////////////////////////////////////////////////////////////////////
/**
Open an FDLog dialog box having the enumerated type FDLogDialogType with
possible values FDLOG_TYPE_SAVE_AS, FDLOG_TYPE_OPEN_SINGLE, FDLOG_TYPE_OPEN_MULTISEL,
and FDLOG_TYPE_MULTI_OPEN. Return the path and filename of all selected files.
Example:
See overloaded GetFileDialogBox functions in this source file.
Parameters:
saFilePaths=Output vector of strings containing path and filename of all selected files
fdtDialogType=Input type of dialog: FDLOG_TYPE_SAVE_AS, FDLOG_TYPE_OPEN_SINGLE, FDLOG_TYPE_OPEN_MULTISEL,
and FDLOG_TYPE_MULTI_OPEN
Return:
Returns the number of selected files.
*/
static int GetFDLogBox( StringArray &saFilePaths, FDLogDialogType fdtDialogType )
{
char szTemp[ MAXFULLPATH ];
saFilePaths.SetSize(1); // Assume 1 file
saFilePaths[0] = ""; // Initialize path and filename to ""
using FDLog = LabTalk.FDLog; // Use LabTalk FDLog object
switch( fdtDialogType ) // Open requested dialog type
{
case FDLOG_TYPE_SAVE_AS:
if( FDLog.SaveAs( "A" ) ) // Open SaveAs dialog box
return 0; // Error, 0 files selected
else
{
LT_get_str( "%A", szTemp, MAXFULLPATH ); // Get filename of selected file from LabTalk variable
saFilePaths[0] = FDLog.Path$ + szTemp; // Return path and filename
}
return 1; // Return number of selected files
case FDLOG_TYPE_OPEN_SINGLE:
FDLog.Open.MultiSel = 0;
if( FDLog.Open( "A" ) ) // Open Single Open dialog box without muliple selection
return 0; // Error, 0 files selected
else
{
LT_get_str( "%A", szTemp, MAXFULLPATH ); // Get filename of selected file from LabTalk variable
saFilePaths[0] = FDLog.Path$ + szTemp; // Return path and filename
}
return 1; // Return number of selected files
case FDLOG_TYPE_OPEN_MULTISEL:
FDLog.Open.MultiSel = 1;
if( FDLog.Open( "A" ) ) // Open Single Open dialog box with multiple selection
return 0; // Error, 0 files selected
saFilePaths.SetSize(FDLog.MultiOpen.Count);
for( int ii = 0; ii < FDLog.MultiOpen.Count; ii++ ) // For each file selected
{
FDLog.Get("A", ii+1); // Get filename into LabTalk variable
LT_get_str( "%A", szTemp, MAXFULLPATH ); // Get filename of selected file from LabTalk variable
saFilePaths[ii] = FDLog.Path$ + szTemp; // Return path and filename
}
return ii; // Return number of selected files
case FDLOG_TYPE_MULTI_OPEN:
FDLog.MultiOpen.ColView = FDLOG_MULTI_OPEN_SHOW_FILE_SIZE |
FDLOG_MULTI_OPEN_SHOW_MODIFY; // Display Filename, Size, and Modified
FDLog.Checkname$=""; // Clear Checkbox name
if( FDLog.MultiOpen() == NANUM ) // Open Multi-Open dialog box
return 0; // Error, 0 files selected
saFilePaths.SetSize(FDLog.MultiOpen.Count);
for( int ii = 0; ii < FDLog.MultiOpen.Count; ii++ ) // For each file selected
{
FDLog.Get("A", ii+1); // Get path and filename into LabTalk variable
LT_get_str( "%A", szTemp, MAXFULLPATH ); // Get path and filename of selected file from LabTalk variable
saFilePaths[ii] = szTemp; // Return path and filename
}
return ii; // Return number of selected files
default:
return 0; // Return with 0 files saved or opened
}
return 0; // Return with 0 files saved or opened
}
//------------------- QA70-4078
//////////////////////////////////////////////////////////////////////////////////
/**
Open an FDLog SaveAs, Open (with or without multiple selection enabled), or
MultiOpen dialog box passing the file types to list in an array of strings.
Example:
See overloaded GetSaveAsBox, GetOpenBox, and GetMultiOpenBox functions in
this source file.
Parameters:
saFilePaths=Output vector of strings containing path and filename of all selected files
saFiletypes=Vector containing file types to list in the dialog box, each element
of vector must follow syntax of LabTalk FDLog.TypeN$ object property
fdtDialogType=Input type of dialog: FDLOG_TYPE_SAVE_AS, FDLOG_TYPE_OPEN_SINGLE, FDLOG_TYPE_OPEN_MULTISEL,
and FDLOG_TYPE_MULTI_OPEN
lpcszPath=Initial path when dialog opens, default NULL uses FDLog tracking
lpcszFileName=Initial filename when dialog opens, default NULL uses an empty string
lpcszDialogName=Title of the dialog box, default NULL uses "Open" or "Save As"
Return:
Returns the number of selected files.
*/
static int GetFileDialogBox( StringArray &saFilePaths, StringArray &saFiletypes, FDLogDialogType fdtDialogType,
LPCSTR lpcszPath, LPCSTR lpcszFilename, LPCSTR lpcszDialogName ) // fdtDialogType = FDLOG_TYPE_OPEN_SINGLE, lpcszPath = NULL, lpcszFilename = NULL, lpcszDialogName = NULL
{
int ii, iSize;
string strDefaultPath = lpcszPath;
string strDefaultFilename = lpcszFilename;
string strDialogName = lpcszDialogName;
string strLTCommand;
_LT_Obj
{
if( strDefaultPath.IsEmpty() ) // If path is not passed as argument...
strDefaultPath = FDLog.Path$; // get last used path from FDLog object for tracking
FDLogInit(); // Initialize LabTalk FDLog object
if( !strDefaultPath.IsEmpty() ) // If path is passed as argument or is being tracked...
FDLog.Path$ = strDefaultPath; // initialize path
FDLog.Default$ = strDefaultFilename; // Initialize filename
iSize = saFiletypes.GetSize(); // Get number of file types
if( iSize <= 1 && saFiletypes[ii].IsEmpty() ) // If no file types are specified...
{
iSize = 0; // set size as 0
FDLog.NumTypes = iSize; // initialize number of passed filetypes to 0
}
else // Else filetypes are specified...
{
FDLog.NumTypes = iSize; // initialize number of passed filetypes
FDLog.Deftype=1; // initialize default filetype to first in filetype list
for( ii = 0; ii < iSize; ii++ ) // loop on all filetypes
{
strLTCommand.Format( "FDLog.Type%d$=%s;", ii+1, saFiletypes[ii] ); // create enumerated LabTalk command
LT_execute( strLTCommand ); // execute enumerated LabTalk command to initialize filetypes
}
}
FDLog.DlgName$ = strDialogName; // Initialize dialog box name
return GetFDLogBox(saFilePaths, fdtDialogType); // Open FDLog dialog box and get path and filename(s)
}
}
/**
Open an FDLog SaveAs, Open (with or without multiple selection enabled), or
MultiOpen dialog box using an enumerated FDLog.UseGroup code to indicate the
set of file types to list. See sys_utils.h or the Origin.ini file for a list
of the enumerated FDLOG.UseGroup codes.
Example:
See overloaded GetSaveAsBox, GetOpenBox, and GetMultiOpenBox functions in
this source file.
Parameters:
saFilePaths=Output vector of strings containing path and filename of all selected files
nFDLogUseGroup=A LabTalk FDLog.UseGroup code as enumerated in sys_utils.h and in the Origin.ini file
fdtDialogType=Input type of dialog: FDLOG_TYPE_SAVE_AS, FDLOG_TYPE_OPEN_SINGLE, FDLOG_TYPE_OPEN_MULTISEL,
and FDLOG_TYPE_MULTI_OPEN
lpcszPath=Initial path when dialog opens, default NULL uses FDLog tracking
lpcszFileName=Initial filename when dialog opens, default NULL uses an empty string
lpcszDialogName=Title of the dialog box, default NULL uses "Open" or "Save As"
Return:
Returns the number of selected files.
*/
static int GetFileDialogBox( StringArray &saFilePaths, FDLogUseGroup nFDLogUseGroup, FDLogDialogType fdtDialogType,
LPCSTR lpcszPath, LPCSTR lpcszFilename, LPCSTR lpcszDialogName ) // fdtDialogType = FDLOG_TYPE_OPEN_SINGLE, lpcszPath = NULL, lpcszFilename = NULL, lpcszDialogName = NULL
{
string strFDLogUseGroup;
string strDefaultPath = lpcszPath;
string strDefaultFilename = lpcszFilename;
string strDialogName = lpcszDialogName;
string strIniKeyName;
double dNumGroups;
char szTemp[ MAXFULLPATH ];
_LT_Obj
{
FDLogInit(); // Initialize LabTalk FDLog object
if( nFDLogUseGroup < FDLOG_FILTER_ASCII )
{
ini.file$ = "Origin.ini"; // Look in Origin.ini file for UseGroup NumGroups and Name
// Check that UseGroup is between 1 and ini.FileExt.NumGroups
LT_get_var( "ini.FileExt.NumGroups", &dNumGroups ); // Get number of currently defined UseGroups
if( nFDLogUseGroup > dNumGroups || nFDLogUseGroup < 1 ) // If UseGroup is out of bounds use blank for All Files
strFDLogUseGroup = "";
else // Else get UseGroup name from Origin.ini
{
strIniKeyName.Format( "%%A=ini.FileExt.%d_Name$", nFDLogUseGroup ); // Format LabTalk command to get UseGroup name
LT_execute( strIniKeyName ); // Get specfied UseGroup name
LT_get_str( "%A", szTemp, MAXFULLPATH );
strFDLogUseGroup = szTemp;
}
FDLog.UseGroup( strFDLogUseGroup ); // Execute FDLog.UseGroup method to set file types and path
}
else
{
switch( nFDLogUseGroup )
{
case FDLOG_FILTER_ASCII:
FDLog.UseGroup("ASCII");
FDLog.AddUserTypes(FILTER_TYPE_ASCII);
break;
case FDLOG_FILTER_BINARY:
FDLog.NumTypes = 0;
FDLog.AddUserTypes(FILTER_TYPE_BINARY);
FDlog.AddType(FILETYPE_ALL_FILES);
break;
case FDLOG_FILTER_USERDEFINED:
FDLog.NumTypes = 0;
FDLog.AddUserTypes(FILTER_TYPE_USERDEFINED);
FDlog.AddType(FILETYPE_ALL_FILES);
break;
}
}
if( !strDefaultPath.IsEmpty() ) // If path is passed as argument...
FDLog.Path$ = strDefaultPath; // initialize path overwriting FDLog.UseGroup setting
FDLog.Default$ = strDefaultFilename; // Initialize filename
FDLog.DlgName$ = strDialogName; // Initialize dialog box name
return GetFDLogBox(saFilePaths, fdtDialogType); // Open FDLog dialog box and get path and filename(s)
}
}
//////////////////////////////////////////////////////////////////////////////////
/**
An easier to use version of GetFileDialogBox that works for a single file type.
Example:
See overloaded GetSaveAsBox, GetOpenBox, and GetMultiOpenBox functions in
this source file.
Parameters:
saFilePaths=Output vector of strings containing path and filename of all selected files
lpcszFileType="*.ext description", or "[decription (*.ext)] *.ext", or just "*.ext"
fdtDialogType=Input type of dialog: FDLOG_TYPE_SAVE_AS, FDLOG_TYPE_OPEN_SINGLE, FDLOG_TYPE_OPEN_MULTISEL,
and FDLOG_TYPE_MULTI_OPEN
lpcszPath=Initial path when dialog opens, default NULL uses FDLog tracking
lpcszFileName=Initial filename when dialog opens, default NULL uses an empty string
lpcszDialogName=Title of the dialog box, default NULL uses "Open" or "Save As"
Return:
Returns the number of selected files.
*/
static int GetFileDialogBox( StringArray& saFilePaths, LPCSTR lpcszFileType, FDLogDialogType fdtDialogType,
LPCSTR lpcszPath, LPCSTR lpcszFilename, LPCSTR lpcszDialogName) // lpcszFileType = NULL, fdtDialogType = FDLOG_TYPE_OPEN_SINGLE, lpcszPath = NULL, lpcszFileName = NULL, lpcszDialogName = NULL
{
string strFileType;
if( lpcszFileType )
strFileType = lpcszFileType;
else
strFileType = "*.* All Files";
string strFileTypeText;
strFileType.TrimLeft(); // In case there are blanks to ensure proper testing of 1st char
if(strFileType[0] == '[')
strFileTypeText = strFileType;// User specified in correct LabTalk syntax, we will use as is
else
{
// We will construct the proper syntax here
if(strFileType[0] != '*' || strFileType[1] != '.')
return ""; // Bad format, return empty string
int nFileTypeTextSeparator = strFileType.Find(' ');
if(nFileTypeTextSeparator > 0) // There is explanation text after ext
{
string strText = strFileType;
strFileType = strText.Left(nFileTypeTextSeparator);
strText = strText.Mid(nFileTypeTextSeparator+1);
strFileTypeText = "[" + strText + " (" + strFileType + ")] " + strFileType;
}
else
strFileTypeText = "[" + strFileType + " (" + strFileType + ")] " + strFileType;
}
StringArray saFiletypes;
saFiletypes.SetSize( 1 );
saFiletypes[0]=strFileTypeText; // "[Project (*.OPJ)] *.OPJ";
return GetFileDialogBox( saFilePaths, saFiletypes, fdtDialogType, lpcszPath, lpcszFilename, lpcszDialogName );
}
//////////////////////////////////////////////////////////////////////////////////
/**
Open an FDLog Browse (OpenPath) dialog box.
Example:
string strPath;
strPath = BrowseGetPath(); // or
strPath = BrowseGetPath( "C:\\Program Files\\" ); // or
strPath = BrowseGetPath( GetAppPath() + "OriginC\\", "Browse" );
Parameters:
lpcszPath=Initial path when dialog opens, default NULL uses FDLog tracking
lpcszDialogName=Title of the dialog box, default NULL uses "Open"
Return:
Returns the path browsed to or an empty string if Cancel button in dialog
box is clicked.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -