/******************************************************************************/ /* T_TEXT.CPP: IMPLEMENTATION OF THE CTextTool CLASS */ /* */ /* */ /******************************************************************************/ /* */ /* Methods in this file */ /* */ /* CText Tool Class Object */ /* CTextTool::CTextTool */ /* CTextTool::~CTextTool */ /* CTextTool::CreateTextEditObject */ /* CTextTool::PlaceTextOnBitmap */ /* CTextTool::OnUpdateColors */ /* CTextTool::OnCancel */ /* CTextTool::OnStartDrag */ /* CTextTool::OnEndDrag */ /* CTextTool::OnDrag */ /* CTextTool::OnClickOptions */ /******************************************************************************/ /* */ /* This is the Text edit tool. It creates a tedit class object when the user */ /* is done dragging the selection for the size desired. */ /* */ /* The Once a text object window exist, it is either cancelled or placed */ /* according to the following rules. */ /* */ /* Cancel Rules */ /* - During a Drag, if the user drags more than MAX_MOVE_DIST_FOR_PLACE */ /* - At the End of a Drag, if the user lets up the mouse more than */ /* MAX_MOVE_DIST_FOR_PLACE pixels from where they did the mosue down */ /* - If the user selects anohter tool (in imgtools, select processing, see */ /* CImgTool::Select()). */ /* */ /* Place Rules */ /* - At the End of a Drag, if the user lets up the mouse less than or equal */ /* to MAX_MOVE_DIST_FOR_PLACE pixels from where they did the mosue down */ /* */ /* Also, during the time the edit control object is visible/exists, the scroll*/ /* bars are disabled. */ /* */ /******************************************************************************/ #include "stdafx.h" #include "global.h" #include "pbrush.h" #include "pbrusdoc.h" #include "pbrusfrm.h" #include "pbrusvw.h" #include "docking.h" #include "minifwnd.h" #include "bmobject.h" #include "imgsuprt.h" #include "imgwnd.h" #include "imgbrush.h" #include "imgwell.h" #include "pictures.h" #include "tfont.h" #include "tedit.h" #include "t_Text.h" #ifdef _DEBUG #undef THIS_FILE static CHAR BASED_CODE THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNAMIC( CTextTool, CSelectTool ) #include "memtrace.h" CTextTool NEAR g_TextTool; /******************************************************************************/ CTextTool::CTextTool() { m_nCmdID = IDMX_TEXTTOOL; m_pCTedit = NULL; m_bIsUndoable = TRUE; m_bCanBePrevTool = FALSE; } /******************************************************************************/ CTextTool::~CTextTool() { } /******************************************************************************/ /* Creates the CTedit class object with the appropriate attributes and */ /* dissables the scroll bars on the bitmap window */ void CTextTool::CreateTextEditObject( CImgWnd* pImgWnd, MTI* pmti ) { c_selectRect.SetRect( 0, 0, 0, 0 ); if (pImgWnd == NULL || pImgWnd->m_pImg == NULL) return; BOOL bBackTransparent; CRect cRectTextBox; if (pmti->ptDown.x > pmti->pt.x) { cRectTextBox.left = pmti->pt.x; cRectTextBox.right = pmti->ptDown.x; } else { cRectTextBox.left = pmti->ptDown.x; cRectTextBox.right = pmti->pt.x; } if (pmti->ptDown.y > pmti->pt.y) { cRectTextBox.top = pmti->pt.y; cRectTextBox.bottom = pmti->ptDown.y; } else { cRectTextBox.top = pmti->ptDown.y; cRectTextBox.bottom = pmti->pt.y; } if (cRectTextBox.left < 0) cRectTextBox.left = 0; if (cRectTextBox.top < 0) cRectTextBox.top = 0; if (cRectTextBox.right > pImgWnd->m_pImg->cxWidth - 1) cRectTextBox.right = pImgWnd->m_pImg->cxWidth - 1; if (cRectTextBox.bottom > pImgWnd->m_pImg->cyHeight - 1) cRectTextBox.bottom = pImgWnd->m_pImg->cyHeight - 1; CRect rectImg; pImgWnd->GetClientRect( &rectImg ); pImgWnd->ClientToImage( rectImg ); if (cRectTextBox.left < rectImg.left) cRectTextBox.left = rectImg.left; if (cRectTextBox.top < rectImg.top ) cRectTextBox.top = rectImg.top; if (cRectTextBox.right > rectImg.right) cRectTextBox.right = rectImg.right - 1; if (cRectTextBox.bottom > rectImg.bottom) cRectTextBox.bottom = rectImg.bottom -1; bBackTransparent = ! theImgBrush.m_bOpaque; pImgWnd->ImageToClient( cRectTextBox ); m_pCTedit = new CTedit; if (m_pCTedit != NULL && m_pCTedit->Create( pImgWnd, crLeft, crRight, cRectTextBox, bBackTransparent )) { SetupRubber( pImgWnd->m_pImg ); pImgWnd->EnableScrollBar( SB_BOTH, ESB_DISABLE_BOTH ); } else { TRACE( TEXT("Create Edit Window Failed!\n") ); theApp.SetMemoryEmergency(); } } /******************************************************************************/ /* Places the image of the text edit control on the bitmap */ /* Then it deletes the text edit control, and re-enables the scroll bars */ void CTextTool::PlaceTextOnBitmap( CImgWnd* pImgWnd ) { if (m_pCTedit->IsModified()) { CRect cRectClient; CDC* pDC = CDC::FromHandle(pImgWnd->m_pImg->hDC); m_pCTedit->GetClientRect ( &cRectClient ); m_pCTedit->ClientToScreen( &cRectClient ); pImgWnd->ScreenToClient ( &cRectClient ); pImgWnd->ClientToImage ( cRectClient ); m_pCTedit->GetBitmap( pDC, &cRectClient ); InvalImgRect ( pImgWnd->m_pImg, &cRectClient ); CommitImgRect( pImgWnd->m_pImg, &cRectClient ); pImgWnd->FinishUndo( cRectClient ); DirtyImg( pImgWnd->m_pImg ); } m_pCTedit->DestroyWindow(); m_pCTedit = NULL; pImgWnd->EnableScrollBar( SB_BOTH, ESB_ENABLE_BOTH ); } /******************************************************************************/ /* updates the foreground and background colors */ void CTextTool::OnUpdateColors( CImgWnd* pImgWnd ) { if (m_pCTedit != NULL) { m_pCTedit->SetTextColor( crLeft ); m_pCTedit->SetBackColor( crRight ); } } /******************************************************************************/ void CTextTool::OnActivate( BOOL bActivate ) { if (bActivate) { // Disallow activation if Zoomed. if (CImgWnd::GetCurrent()->GetZoom() > 1 ) { ::MessageBeep( MB_ICONASTERISK ); SelectPrevious(); } } else { if (CWnd::GetCapture() != CImgWnd::c_pImgWndCur && m_pCTedit != NULL && IsWindow(m_pCTedit->m_hWnd) ) { CAttrEdit* pEdit = m_pCTedit->GetEditWindow(); if (pEdit != NULL && IsWindow(pEdit->m_hWnd) && pEdit->GetWindowTextLength() > 0) PlaceTextOnBitmap( CImgWnd::c_pImgWndCur ); else { m_pCTedit->DestroyWindow(); m_pCTedit = NULL; InvalImgRect( CImgWnd::c_pImgWndCur->m_pImg, NULL ); // redraw selection CImgWnd::c_pImgWndCur->EnableScrollBar( SB_BOTH, ESB_ENABLE_BOTH ); } } } CImgTool::OnActivate( bActivate ); } /******************************************************************************/ /* Deletes the text edit control, and refreshes the bitmap display, while */ /* also re-enabling the scroll bars */ void CTextTool::OnCancel(CImgWnd* pImgWnd) { if (m_pCTedit != NULL) { m_pCTedit->DestroyWindow(); m_pCTedit = NULL; } InvalImgRect( pImgWnd->m_pImg, NULL ); // redraw selection pImgWnd->EnableScrollBar( SB_BOTH, ESB_ENABLE_BOTH ); CImgTool::OnCancel( pImgWnd ); } /******************************************************************************/ void CTextTool::OnStartDrag( CImgWnd* pImgWnd, MTI* pmti ) { CImgTool::OnStartDrag( pImgWnd, pmti ); OnDrag( pImgWnd, pmti ); } /******************************************************************************/ /* if a text edit object does not exist, it creates one here. If one does */ /* exist, it checks the distance between the point down and point up. If */ /* less than or equal to MAX_MOVE_DIST_FOR_PLACE it places the bitmap, else */ /* it assumes the user wants to abort the prior text editing session, and */ /* destroys the prior text edit control and creates a new one with the newly */ /* created dragged coordinate box (ptdown and ptup). */ void CTextTool::OnEndDrag( CImgWnd* pImgWnd, MTI* pmti ) { CSize cPtDownUpDistance = pmti->ptDown - pmti->pt; // if the text box exists on a button up, was the button up close enough // to the button down to decide to place instead of throw away and // create a new text edit box. if (m_pCTedit != NULL) { PlaceTextOnBitmap( pImgWnd ); int iDist = max( (abs( cPtDownUpDistance.cx )), (abs( cPtDownUpDistance.cy )) ); if (iDist <= MAX_MOVE_DIST_FOR_PLACE) { ClearStatusBarSize(); CImgTool::OnEndDrag( pImgWnd, pmti ); } else CreateTextEditObject( pImgWnd, pmti ); } else // m_pCTedit == NULL either 1st time or destroyed, since on drag moved more than MAX_MOVE_DIS_FOR_PLACE { CreateTextEditObject( pImgWnd, pmti ); } } /******************************************************************************/ void CTextTool::OnDrag( CImgWnd* pImgWnd, MTI* pmti ) { CPoint ptNew( pmti->pt.x, pmti->pt.y ); CRect rectImg; pImgWnd->GetClientRect( &rectImg ); pImgWnd->ClientToImage( rectImg ); if (! rectImg.PtInRect( ptNew )) { if (ptNew.x < rectImg.left) ptNew.x = rectImg.left; if (ptNew.x > rectImg.right) ptNew.x = rectImg.right; if (ptNew.y < rectImg.top) ptNew.y = rectImg.top; if (ptNew.y > rectImg.bottom) ptNew.y = rectImg.bottom; pmti->pt = ptNew; } CSelectTool::OnDrag( pImgWnd, pmti ); } /******************************************************************************/ /* Set the text edit tool window's options for transparent or opaque */ void CTextTool::OnClickOptions( CImgToolWnd* pWnd, const CRect& optionsRect, const CPoint& clickPoint ) { CSelectTool::OnClickOptions( pWnd, optionsRect, clickPoint ); if (m_pCTedit != NULL) m_pCTedit->SetTransparentMode( ! theImgBrush.m_bOpaque ); } /******************************************************************************/ /* report to the rest of the program if the font palette is showin */ BOOL CTextTool::FontPaletteVisible() { return (m_pCTedit? m_pCTedit->IsFontPaletteVisible(): FALSE); } /******************************************************************************/ /* toggle the visable state of the Font Palette */ void CTextTool::ToggleFontPalette() { if (m_pCTedit) m_pCTedit->ShowFontPalette( m_pCTedit->IsFontPaletteVisible()? SW_HIDE: SW_SHOW ); } /******************************************************************************/ void CTextTool::OnShowControlBars(BOOL bShow) { if (m_pCTedit == NULL) { return; } if (bShow) { if (!theApp.m_bShowTextToolbar) { return; } m_pCTedit->ShowFontToolbar(); } else { m_pCTedit->HideFontToolbar(); } } /******************************************************************************/ void CTextTool::CloseTextTool( CImgWnd* pImgWnd ) { if (! m_pCTedit) return; if ( IsWindow(pImgWnd->m_hWnd) ) { if (! m_pCTedit->IsModified()) { OnCancel( pImgWnd ); return; } if (pRubberImg != pImgWnd->m_pImg) SetupRubber( pImgWnd->m_pImg ); // SetUndo( pImgWnd->m_pImg ); PlaceTextOnBitmap( pImgWnd ); pImgWnd->UpdateWindow(); } } /******************************************************************************/