void UT_UTF8String::appendBuf (const UT_ByteBuf & buf, UT_UCS4_mbtowc & converter) { UT_uint32 i; UT_UCS4Char wc; const UT_Byte *ptr = buf.getPointer(0); for (i = 0; i < buf.getLength(); i++) { if (converter.mbtowc(wc, static_cast<char>(ptr[i]))) pimpl->appendUCS4(&wc, 1); } }
bool AP_Win32App::_cacheClipboardDoc(PD_DocumentRange *pDocRange) { UT_return_val_if_fail(m_pClipboard && pDocRange, false); UT_ByteBuf buf; UT_Error status;; UT_Byte b = 0; IE_Exp_RTF * pExpRtf = new IE_Exp_RTF(pDocRange->m_pDoc); if (pExpRtf) { status = pExpRtf->copyToBuffer(pDocRange,&buf); if(status != UT_OK) return false; buf.append(&b,1); // NULL terminate the string DELETEP(pExpRtf); } else { return false; } // now create a subdocument ... PD_Document * pDoc = new PD_Document(); if(!pDoc) return false; pDoc->newDocument(); PD_DocumentRange DocRange(pDoc, 2, 2); IE_Imp * pImp = 0; IE_Imp::constructImporter(pDoc, IE_Imp::fileTypeForSuffix(".rtf"),&pImp,0); if(pImp) { pImp->pasteFromBuffer(&DocRange,buf.getPointer(0),buf.getLength(),NULL); delete pImp; } else { return false; } m_pClipboard->setClipboardDoc(pDoc); return true; }
/*! Output text buffer to stream \param data Buffer to output \param length Size of buffer */ void Text_Listener::_outputData(const UT_UCSChar * data, UT_uint32 length) { UT_ByteBuf bBuf; const UT_UCSChar * pData; int mbLen; char pC[MY_MB_LEN_MAX]; if (m_bFirstWrite) { if (m_szEncoding) m_wctomb.setOutCharset(m_szEncoding); _genLineBreak(); if (m_bUseBOM) { _genBOM(); m_pie->write(static_cast<const char *>(m_mbBOM),m_iBOMLen); } m_bFirstWrite = false; } for (pData=data; (pData<data+length); ++pData) { // We let any UCS_LF's (forced line breaks) go out as is. if (*pData==UCS_LF) bBuf.append(reinterpret_cast<UT_Byte *>(m_mbLineBreak),m_iLineBreakLen); else { if (!_wctomb(pC,mbLen,*pData)) { UT_ASSERT_HARMLESS(!m_bIs16Bit); mbLen=1; pC[0]='?'; m_wctomb.initialize(); } UT_ASSERT_HARMLESS(mbLen>=1); bBuf.append(reinterpret_cast<const UT_Byte *>(pC),mbLen); } } m_pie->write(reinterpret_cast<const char *>(bBuf.getPointer(0)),bBuf.getLength()); }
void FV_Selection::pasteRowOrCol(void) { pf_Frag_Strux* cellSDH, *tableSDH; PT_DocPosition pos = m_pView->getPoint(); if(m_iPrevSelectionMode == FV_SelectionMode_TableColumn) { // // GLOB stuff together so it undo's in one go. // getDoc()->beginUserAtomicGlob(); // // Insert a column after the current column // m_pView->cmdInsertCol(m_pView->getPoint(),false); // // Now do all the encapsulating stuff for piecetable manipulations. // // Signal PieceTable Change m_pView->_saveAndNotifyPieceTableChange(); // Turn off list updates getDoc()->disableListUpdates(); if (!m_pView->isSelectionEmpty()) { m_pView->_clearSelection(); } getDoc()->setDontImmediatelyLayout(true); pos = m_pView->getPoint(); PT_DocPosition posTable,posCell; UT_sint32 iLeft,iRight,iTop,iBot; posCell = 0; m_pView->getCellParams(pos, &iLeft, &iRight,&iTop,&iBot); bool bRes = getDoc()->getStruxOfTypeFromPosition(pos,PTX_SectionCell,&cellSDH); bRes = getDoc()->getStruxOfTypeFromPosition(pos,PTX_SectionTable,&tableSDH); UT_return_if_fail(bRes); posTable = getDoc()->getStruxPosition(tableSDH) + 1; UT_sint32 numRows = 0; UT_sint32 numCols = 0; UT_sint32 i = 0; getDoc()-> getRowsColsFromTableSDH(tableSDH, m_pView->isShowRevisions(), m_pView->getRevisionLevel(), &numRows, &numCols); PD_DocumentRange DocRange(getDoc(),posCell,posCell); for(i=0; i<getNumSelections(); i++) { posCell = m_pView->findCellPosAt(posTable,i,iLeft)+2; m_pView->setPoint(posCell); PD_DocumentRange * pR = getNthSelection(i); if(pR->m_pos1 == pR->m_pos2) { // // Dont paste empty cells // continue; } UT_ByteBuf * pBuf = m_vecSelRTFBuffers.getNthItem(i); const unsigned char * pData = pBuf->getPointer(0); UT_uint32 iLen = pBuf->getLength(); DocRange.m_pos1 = posCell; DocRange.m_pos2 = posCell; IE_Imp_RTF * pImpRTF = new IE_Imp_RTF(getDoc()); pImpRTF->pasteFromBuffer(&DocRange,pData,iLen); DELETEP(pImpRTF); fl_SectionLayout * pSL = m_pView->getCurrentBlock()->getSectionLayout(); pSL->checkAndAdjustCellSize(); } getDoc()->endUserAtomicGlob(); getDoc()->setDontImmediatelyLayout(false); m_pView->_generalUpdate(); // restore updates and clean up dirty lists getDoc()->enableListUpdates(); getDoc()->updateDirtyLists(); // Signal PieceTable Changes have finished m_pView->_restorePieceTableState(); // Put the insertion point in a legal position // m_pView->notifyListeners(AV_CHG_MOTION); m_pView->_fixInsertionPointCoords(); m_pView->_ensureInsertionPointOnScreen(); } else { } }
/*! copy the given subset of the given document to the system clipboard in a variety of formats. to minimize the effects of race-conditions, we create all of the buffers we need and then post them to the server (well sorta) all at one time. \param pDocRange a range of the document to be copied */ void AP_UnixApp::copyToClipboard(PD_DocumentRange * pDocRange, bool bUseClipboard) { UT_ByteBuf bufRTF; UT_ByteBuf bufHTML4; UT_ByteBuf bufXHTML; UT_ByteBuf bufTEXT; UT_ByteBuf bufODT; // create RTF buffer to put on the clipboard IE_Exp_RTF * pExpRtf = new IE_Exp_RTF(pDocRange->m_pDoc); if (pExpRtf) { pExpRtf->copyToBuffer(pDocRange,&bufRTF); DELETEP(pExpRtf); } // create XHTML buffer to put on the clipboard IE_Exp_HTML * pExpHtml = new IE_Exp_HTML(pDocRange->m_pDoc); if (pExpHtml) { pExpHtml->set_HTML4 (false); pExpHtml->copyToBuffer (pDocRange, &bufXHTML); DELETEP(pExpHtml); } // create HTML4 buffer to put on the clipboard pExpHtml = new IE_Exp_HTML(pDocRange->m_pDoc); if (pExpHtml) { pExpHtml->set_HTML4 (true); pExpHtml->copyToBuffer(pDocRange, &bufHTML4); DELETEP(pExpHtml); } // Look to see if the ODT plugin is loaded IEFileType ftODT = IE_Exp::fileTypeForMimetype("application/vnd.oasis.opendocument.text"); bool bExpODT = false; if(ftODT != IEFT_Unknown) { // ODT plugin is present construct an exporter // IE_Exp * pODT = NULL; IEFileType genIEFT = IEFT_Unknown; GsfOutput * outBuf = gsf_output_memory_new(); UT_Error err = IE_Exp::constructExporter(pDocRange->m_pDoc,outBuf, ftODT,&pODT,& genIEFT); if(pODT && (genIEFT == ftODT)) { // // Copy to the buffer // err = pODT->copyToBuffer(pDocRange, &bufODT); bExpODT = (err == UT_OK); UT_DEBUGMSG(("Putting ODF on the clipboard...e:%d bExpODT:%d\n", err, bExpODT )); #ifdef DUMP_CLIPBOARD_COPY std::ofstream oss("/tmp/abiword-clipboard-copy.odt"); oss.write( (const char*)bufODT.getPointer (0), bufODT.getLength () ); oss.close(); #endif } } // create UTF-8 text buffer to put on the clipboard IE_Exp_Text * pExpText = new IE_Exp_Text(pDocRange->m_pDoc, "UTF-8"); if (pExpText) { pExpText->copyToBuffer(pDocRange,&bufTEXT); DELETEP(pExpText); } // NOTE: this clearData() will actually release our ownership of // NOTE: the CLIPBOARD property in addition to clearing any // NOTE: stored buffers. I'm omitting it since we seem to get // NOTE: clr callback after we have done some other processing // NOTE: (like adding the new stuff). // m_pClipboard->clearData(true,false); // TODO: handle CLIPBOARD vs PRIMARY XAP_UnixClipboard::T_AllowGet target = ((bUseClipboard) ? XAP_UnixClipboard::TAG_ClipboardOnly : XAP_UnixClipboard::TAG_PrimaryOnly); if (bufRTF.getLength () > 0) m_pClipboard->addRichTextData (target, bufRTF.getPointer (0), bufRTF.getLength ()); if (bufXHTML.getLength () > 0) m_pClipboard->addHtmlData (target, bufXHTML.getPointer (0), bufXHTML.getLength (), true); if (bufHTML4.getLength () > 0) m_pClipboard->addHtmlData (target, bufHTML4.getPointer (0), bufHTML4.getLength (), false); if (bExpODT && bufODT.getLength () > 0) m_pClipboard->addODTData (target, bufODT.getPointer (0), bufODT.getLength ()); if (bufTEXT.getLength () > 0) m_pClipboard->addTextData (target, bufTEXT.getPointer (0), bufTEXT.getLength ()); { // TODO: we have to make a good way to tell if the current selection is just an image FV_View * pView = NULL; if(getLastFocussedFrame()) pView = static_cast<FV_View*>(getLastFocussedFrame()->getCurrentView()); if (pView && !pView->isSelectionEmpty()) { // don't own, don't g_free const UT_ByteBuf * png = 0; pView->saveSelectedImage (&png); if (png && png->getLength() > 0) { m_pClipboard->addPNGData(target, static_cast<const UT_Byte*>(png->getPointer(0)), png->getLength()); } } } m_pClipboard->finishedAddingData(); return; }
/*! copy data in required format to the clipboard */ bool AP_Win32App::_copyFmtToClipboard(PD_DocumentRange * pDocRange, const char * pszFmt) { UT_return_val_if_fail(m_pClipboard && pszFmt, false); UT_ByteBuf buf; UT_Error status;; UT_Byte b = 0; if(0 == strcmp(AP_CLIPBOARD_TEXTPLAIN_8BIT, pszFmt)) { IE_Exp_Text * pExpText = new IE_Exp_Text(pDocRange->m_pDoc); if (pExpText) { status = pExpText->copyToBuffer(pDocRange,&buf); if(status != UT_OK) return false; buf.append(&b,1); // NULL terminate the string m_pClipboard->addData(AP_CLIPBOARD_TEXTPLAIN_8BIT, (UT_Byte *)buf.getPointer(0),buf.getLength()); DELETEP(pExpText); UT_DEBUGMSG(("CopyToClipboard: copying %d bytes in TEXTPLAIN format.\n", buf.getLength())); } else { return false; } } else if(0 == strcmp(AP_CLIPBOARD_TEXTPLAIN_UCS2, pszFmt)) { const char *szEnc = XAP_EncodingManager::get_instance()->getNativeUnicodeEncodingName(); IE_Exp_Text * pExpUnicodeText = new IE_Exp_Text(pDocRange->m_pDoc,szEnc); if (pExpUnicodeText) { status = pExpUnicodeText->copyToBuffer(pDocRange,&buf); if(status != UT_OK) return false; UT_Byte b[2] = {0,0}; buf.append(b,2); // NULL terminate the string m_pClipboard->addData(AP_CLIPBOARD_TEXTPLAIN_UCS2, (UT_Byte *)buf.getPointer(0),buf.getLength()); DELETEP(pExpUnicodeText); UT_DEBUGMSG(("CopyToClipboard: copying %d bytes in TEXTPLAIN UNICODE format.\n", buf.getLength()*2)); } else { return false; } } else if(0 == strcmp(AP_CLIPBOARD_RTF, pszFmt)) { IE_Exp_RTF * pExpRtf = new IE_Exp_RTF(pDocRange->m_pDoc); if (pExpRtf) { status = pExpRtf->copyToBuffer(pDocRange,&buf); if(status != UT_OK) return false; buf.append(&b,1); // NULL terminate the string m_pClipboard->addData(AP_CLIPBOARD_RTF,(UT_Byte *)buf.getPointer(0),buf.getLength()); DELETEP(pExpRtf); UT_DEBUGMSG(("CopyFmtToClipboard: copying %d bytes in RTF format.\n", buf.getLength())); } else { return false; } } return true; }