app_popup.cpp

来自「ncbi源码」· C++ 代码 · 共 318 行

CPP
318
字号
/* * =========================================================================== * PRODUCTION $Log: app_popup.cpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 21:04:40  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18 * PRODUCTION * =========================================================================== *//*  $Id: app_popup.cpp,v 1000.2 2004/06/01 21:04:40 gouriano Exp $ * =========================================================================== * *                            PUBLIC DOMAIN NOTICE *               National Center for Biotechnology Information * *  This software/database is a "United States Government Work" under the *  terms of the United States Copyright Act.  It was written as part of *  the author's official duties as a United States Government employee and *  thus cannot be copyrighted.  This software/database is freely available *  to the public for use. The National Library of Medicine and the U.S. *  Government have not placed any restriction on its use or reproduction. * *  Although all reasonable efforts have been taken to ensure the accuracy *  and reliability of the software and data, the NLM and the U.S. *  Government do not and cannot warrant the performance or results that *  may be obtained by using this software or data. The NLM and the U.S. *  Government disclaim all warranties, express or implied, including *  warranties of performance, merchantability or fitness for any particular *  purpose. * *  Please cite the author in any work or product based on this material. * * =========================================================================== * * Authors:  Peter Meric * * File Description: *    CAppPopup -- launch a url in a web browser */#include <ncbi_pch.hpp>#include <gui/utils/app_popup.hpp>#include <gui/utils/exec.hpp>#include <corelib/ncbiexec.hpp>#ifdef NCBI_OS_MSWIN#include <windows.h>#include <ShellAPI.h>#endif#if defined(NCBI_OS_MAC) || defined(NCBI_OS_DARWIN)#define __NOEXTENSIONS__#include <ApplicationServices/ApplicationServices.h>#endifBEGIN_NCBI_SCOPE//// function prototypes//CAppRegistry s_CreateDefaultAppRegistry(void);//// CAppPopup:: static member definition//CAppRegistry CAppPopup::m_Registry(s_CreateDefaultAppRegistry());CAppInfo::CAppInfo(const string& path)    : m_Exepath(path){}CAppInfo::~CAppInfo(){}const string& CAppInfo::GetExePath(void) const{    return m_Exepath;}CNcbiOstream& filetype::operator<< (CNcbiOstream& strm,                                    filetype::TFileType& ftype){    switch (ftype) {    case filetype::ePdf:        strm << "PDF";        break;    case filetype::eUnknown:        strm << "Unknown";        break;    default:        strm << "Unrecognized file type";        break;    }    return strm;}CAppRegistry s_CreateDefaultAppRegistry(void){    CAppRegistry ar;    ar[filetype::ePdf] = CRef<CAppInfo>(new CAppInfo("acroread"));    return ar;}CAppRegistry::CAppRegistry(){}CAppRegistry::~CAppRegistry(){}CAppRegistry::TAppInfoRef& CAppRegistry::operator[](const TFileType& type){    return m_AppReg[type];}const CAppRegistry::TAppInfoRef& CAppRegistry::Find(TFileType filetype) const{    TRegistry::const_iterator it = m_AppReg.find(filetype);    if (it == m_AppReg.end()) {        ERR_POST(Warning                 << "CAppRegistry::Find(): no application associated with type "                 << filetype                );    }    return it->second;}CAppRegistry& CAppPopup::GetRegistry(void){    return m_Registry;}bool CAppPopup::PopupFile(const string& file, TFileType filetype){    if (file.empty()) {        return false;    }#ifdef NCBI_OS_MSWIN    return PopupURL(file);#elif  defined(NCBI_OS_DARWIN)            FSRef fileRef;    OSErr err = FSPathMakeRef((const UInt8 *) file.c_str(), &fileRef, NULL);    if (err == noErr) {        err = LSOpenFSRef(&fileRef, NULL);    }    return (err == noErr);#else    const CRef<CAppInfo>& ai = m_Registry.Find(filetype);    const string& prog = ai->GetExePath();    const string app(prog + " " + file);    return CExec::System(app.c_str()) != 0;#endif}bool CAppPopup::PopupURL(const string& url){    _TRACE(Info << "CAppPopup::PopupURL: opening URL: " << url);    if (url.empty()) {        return false;    }#ifdef NCBI_OS_MSWIN    int res =         reinterpret_cast<int>(ShellExecute(NULL,                                            "open",                                            url.c_str(),                                            NULL,                                            NULL,                                            SW_SHOWNORMAL));    return res > 32;#elif defined(NCBI_OS_DARWIN)   /* open the url with the default browser */    CFURLRef urlRef = CFURLCreateWithBytes(kCFAllocatorDefault,                                           (const UInt8 *) url.c_str(),                                           url.size(),                                             kCFStringEncodingMacRoman,                                           NULL                                          );    const OSErr err = LSOpenCFURLRef(urlRef, NULL);    return (err == noErr);#elif defined(NCBI_OS_UNIX)    // Use netscape -remote mechanism is netscape is running    // Otherwise, launch netscape anew    string std_in, std_out, std_err;    vector<string> args;    int exit_status;    // try pop up a new window using netscape -remote    args.push_back("-remote");    string arg = "openURL(" + url + ",new-window)";    args.push_back(arg);    exit_status = CExecute::Exec("netscape", args, std_in, std_out, std_err);    if (!exit_status && std_err.empty()) {        return true;    } else {        // start a new netscape        exit_status = CExec::SpawnLP(CExec::eDetach, "netscape",                                     url.c_str(), 0);        return exit_status != -1;    }#else    return false;#endif}END_NCBI_SCOPE/* * =========================================================================== * $Log: app_popup.cpp,v $ * Revision 1000.2  2004/06/01 21:04:40  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18 * * Revision 1.18  2004/05/21 22:27:50  gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.17  2004/05/17 13:54:51  dicuccio * Added include for <widnows.h> in Win32-specific section * * Revision 1.16  2004/03/22 18:07:41  gorelenk * Changed implementations of CAppPopup::PopupURL and CAppPopup::PopupFile, * removed include of urlmon.h to get rid of usage urlmon.dll on Win32 . * * Revision 1.15  2003/09/26 15:47:22  jcherry * One less exec for linkouts under unix * * Revision 1.14  2003/09/25 23:04:26  jcherry * Made linkouts work on unix * * Revision 1.13  2003/09/24 20:10:35  dicuccio * Restore Shellapi.h for Win32 * * Revision 1.12  2003/09/24 18:38:26  dicuccio * +ncbiexec.hpp for CExec * * Revision 1.11  2003/09/24 18:28:02  dicuccio * Dropped internal app spawn function in favor of CExec::System() * * Revision 1.10  2003/08/21 12:04:00  dicuccio * Code formatting changes.  Changed typedefs to be standards-compliant * * Revision 1.9  2003/06/24 19:46:34  rsmith * Get the right Mac header * * Revision 1.8  2003/06/23 19:07:20  meric * Added tests for empty strings * * Revision 1.7  2003/06/23 18:47:46  rsmith * app_popup.cpp * * Revision 1.6  2003/06/19 16:39:33  meric * Renamed AppInfo to CAppInfo * * Revision 1.5  2003/06/19 16:32:57  meric * Added CAppRegistry, a simple application registry for file types * Added unix support for opening files associated with applications * * Revision 1.4  2003/06/17 19:50:25  meric * Replace Popup() with PopupFile() and PopupURL() * * Revision 1.3  2003/06/16 16:56:58  dicuccio * Remove unneeded header for widening strings.  Fix resize of dlg box * * Revision 1.2  2003/06/16 16:01:38  dicuccio * Moved generic print code code from opengl/print to utils. * * Revision 1.1  2003/06/13 18:53:05  meric * Initial revision * * * =========================================================================== */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?