Exemple #1
0
void wxOSXPrintData::TransferResolutionTo( wxPrintData &data )
{
    PMPrinter printer ;
    PMSessionGetCurrentPrinter( m_macPrintSession, &printer );

    /* assume high quality, will change below if we are able to */
    data.SetQuality(wxPRINT_QUALITY_HIGH);

    PMResolution *resolutions;
    UInt32 resCount;
    resolutions = GetSupportedResolutions(printer, &resCount);
    if (resolutions)
    {
        bool valid = false;
        PMResolution res;
        if ( PMPrinterGetOutputResolution(printer, m_macPrintSettings, &res) == noErr )
            valid = true;

        if ( valid )
        {
            UInt32 i;
            for (i = 0; i < resCount; i++)
            {
                if ((resolutions[i].hRes == res.hRes) && (resolutions[i].vRes = res.vRes))
                    break;
            }
            if (i < resCount)
                data.SetQuality((((i + 1) * 3) / resCount) + wxPRINT_QUALITY_DRAFT);
        }
        free(resolutions);
    }
}
Exemple #2
0
bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data )
{
    HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode;
    HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames;

    if (!hDevMode)
        return false;

    if ( hDevMode )
    {
        LPDEVMODE devMode = (LPDEVMODE)GlobalLock(hDevMode);

        //// Orientation
        if (devMode->dmFields & DM_ORIENTATION)
            data.SetOrientation( devMode->dmOrientation );

        //// Collation
        if (devMode->dmFields & DM_COLLATE)
        {
            if (devMode->dmCollate == DMCOLLATE_TRUE)
                data.SetCollate( true );
            else
                data.SetCollate( false );
        }

        //// Number of copies
        if (devMode->dmFields & DM_COPIES)
            data.SetNoCopies( devMode->dmCopies );

        if (devMode->dmFields & DM_DEFAULTSOURCE)
            data.SetBin( (wxPrintBin)devMode->dmDefaultSource );

        //// Printer name
        if (devMode->dmDeviceName[0] != 0)
            data.SetPrinterName( devMode->dmDeviceName );

        //// Colour
        if (devMode->dmFields & DM_COLOR)
        {
            if (devMode->dmColor == DMCOLOR_COLOR)
                data.SetColour( true );
            else
                data.SetColour( false );
        }
        else
            data.SetColour( true );

        //// Paper size

        // We don't know size of user defined paper and some buggy drivers
        // set both DM_PAPERSIZE and DM_PAPERWIDTH & DM_PAPERLENGTH. Since
        // dmPaperSize >= DMPAPER_USER wouldn't be in wxWin's database, this
        // code wouldn't set m_paperSize correctly.

        bool foundPaperSize = false;
        if ((devMode->dmFields & DM_PAPERSIZE) && (devMode->dmPaperSize < DMPAPER_USER))
        {
            if (wxThePrintPaperDatabase)
            {
                wxPrintPaperType* paper = wxThePrintPaperDatabase->FindPaperTypeByPlatformId(devMode->dmPaperSize);
                if (paper)
                {
                    data.SetPaperId( paper->GetId() );
                    data.SetPaperSize( wxSize(paper->GetWidth() / 10,paper->GetHeight() / 10) );
                    m_customWindowsPaperId = 0;
                    foundPaperSize = true;
                }
            }
            else
            {
                // Shouldn't really get here
                wxFAIL_MSG(wxT("Paper database wasn't initialized in wxPrintData::ConvertFromNative."));
                data.SetPaperId( wxPAPER_NONE );
                data.SetPaperSize( wxSize(0,0) );
                m_customWindowsPaperId = 0;
                
                GlobalUnlock(hDevMode);
                return false;
            }
        }

        if (!foundPaperSize && (devMode->dmFields & DM_PAPERWIDTH) && (devMode->dmFields & DM_PAPERLENGTH))
        {
            // DEVMODE is in tenths of a milimeter
            data.SetPaperSize( wxSize(devMode->dmPaperWidth / 10, devMode->dmPaperLength / 10) );
            data.SetPaperId( wxPAPER_NONE );
            m_customWindowsPaperId = devMode->dmPaperSize;
        }
        else
        {
            // Often will reach this for non-standard paper sizes (sizes which
            // wouldn't be in wxWidget's paper database). Setting
            // m_customWindowsPaperId to devMode->dmPaperSize should be enough
            // to get this paper size working.
            data.SetPaperSize( wxSize(0,0) );
            data.SetPaperId( wxPAPER_NONE );
            m_customWindowsPaperId = devMode->dmPaperSize;
        }

        //// Duplex

        if (devMode->dmFields & DM_DUPLEX)
        {
            switch (devMode->dmDuplex)
            {
                case DMDUP_HORIZONTAL:   data.SetDuplex( wxDUPLEX_HORIZONTAL ); break;
                case DMDUP_VERTICAL:     data.SetDuplex( wxDUPLEX_VERTICAL ); break;
                default:
                case DMDUP_SIMPLEX:      data.SetDuplex( wxDUPLEX_SIMPLEX ); break;
            }
        }
        else
            data.SetDuplex( wxDUPLEX_SIMPLEX );

        //// Quality

        if (devMode->dmFields & DM_PRINTQUALITY)
        {
            switch (devMode->dmPrintQuality)
            {
                case DMRES_MEDIUM:  data.SetQuality( wxPRINT_QUALITY_MEDIUM ); break;
                case DMRES_LOW:     data.SetQuality( wxPRINT_QUALITY_LOW ); break;
                case DMRES_DRAFT:   data.SetQuality( wxPRINT_QUALITY_DRAFT ); break;
                case DMRES_HIGH:    data.SetQuality( wxPRINT_QUALITY_HIGH ); break;
                default:
                {
                    // TODO: if the printer fills in the resolution in DPI, how
                    // will the application know if it's high, low, draft etc.??
                    //                    wxFAIL_MSG("Warning: DM_PRINTQUALITY was not one of the standard values.");
                    data.SetQuality( devMode->dmPrintQuality );
                    break;

                }
            }
        }
        else
            data.SetQuality( wxPRINT_QUALITY_HIGH );

        if (devMode->dmDriverExtra > 0)
            data.SetPrivData( (char *)devMode+devMode->dmSize, devMode->dmDriverExtra );
        else
            data.SetPrivData( NULL, 0 );

        GlobalUnlock(hDevMode);
    }

    if (hDevNames)
    {
        LPDEVNAMES lpDevNames = (LPDEVNAMES)GlobalLock(hDevNames);
        if (lpDevNames)
        {
            // TODO: Unicode-ification

            // Get the port name
            // port is obsolete in WIN32
            // m_printData.SetPortName((LPSTR)lpDevNames + lpDevNames->wDriverOffset);

            // Get the printer name
            wxString printerName = (LPTSTR)lpDevNames + lpDevNames->wDeviceOffset;

            // Not sure if we should check for this mismatch
//            wxASSERT_MSG( (m_printerName.empty() || (devName == m_printerName)), "Printer name obtained from DEVMODE and DEVNAMES were different!");

            if (!printerName.empty())
                data.SetPrinterName( printerName );

            GlobalUnlock(hDevNames);
        }
    }

    return true;
}