diff options
author | John Abd-El-Malek <jabdelmalek@google.com> | 2014-05-23 17:28:10 -0700 |
---|---|---|
committer | John Abd-El-Malek <jabdelmalek@google.com> | 2014-05-23 17:41:56 -0700 |
commit | 3f3b45cc74b0499912409f766a595945dbbfc4c5 (patch) | |
tree | ec400b6965477b88ea7f0d335f7e5c52044c346c /fpdfsdk/src/pdfwindow | |
parent | 6fe4aed948337175f6f7f81bb03c37b9c7f535da (diff) | |
download | pdfium-3f3b45cc74b0499912409f766a595945dbbfc4c5.tar.xz |
Convert all line endings to LF.
Diffstat (limited to 'fpdfsdk/src/pdfwindow')
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_Button.cpp | 106 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_Caret.cpp | 394 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp | 1324 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_Edit.cpp | 2632 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp | 1456 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_FontMap.cpp | 1202 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_Icon.cpp | 544 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_IconList.cpp | 1184 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_Label.cpp | 374 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_ListBox.cpp | 1264 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp | 490 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_Note.cpp | 3558 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp | 2706 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_Signature.cpp | 440 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp | 220 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_Utils.cpp | 5688 | ||||
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_Wnd.cpp | 2684 |
17 files changed, 13133 insertions, 13133 deletions
diff --git a/fpdfsdk/src/pdfwindow/PWL_Button.cpp b/fpdfsdk/src/pdfwindow/PWL_Button.cpp index c71e5cc8b4..f95469aa93 100644 --- a/fpdfsdk/src/pdfwindow/PWL_Button.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_Button.cpp @@ -1,53 +1,53 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_Button.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-
-/* ------------------------------- CPWL_Button ---------------------------------- */
-
-CPWL_Button::CPWL_Button() :
- m_bMouseDown(FALSE)
-{
-}
-
-CPWL_Button::~CPWL_Button()
-{
-// PWL_TRACE("~CPWL_Button\n");
-}
-
-CFX_ByteString CPWL_Button::GetClassName() const
-{
- return "CPWL_Button";
-}
-
-void CPWL_Button::OnCreate(PWL_CREATEPARAM & cp)
-{
- cp.eCursorType = FXCT_HAND;
-}
-
-FX_BOOL CPWL_Button::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonDown(point, nFlag);
-
- m_bMouseDown = TRUE;
- SetCapture();
-
- return TRUE;
-}
-
-FX_BOOL CPWL_Button::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonUp(point, nFlag);
-
- ReleaseCapture();
- m_bMouseDown = FALSE;
-
- return TRUE;
-}
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_Button.h" +#include "../../include/pdfwindow/PWL_Utils.h" + +/* ------------------------------- CPWL_Button ---------------------------------- */ + +CPWL_Button::CPWL_Button() : + m_bMouseDown(FALSE) +{ +} + +CPWL_Button::~CPWL_Button() +{ +// PWL_TRACE("~CPWL_Button\n"); +} + +CFX_ByteString CPWL_Button::GetClassName() const +{ + return "CPWL_Button"; +} + +void CPWL_Button::OnCreate(PWL_CREATEPARAM & cp) +{ + cp.eCursorType = FXCT_HAND; +} + +FX_BOOL CPWL_Button::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonDown(point, nFlag); + + m_bMouseDown = TRUE; + SetCapture(); + + return TRUE; +} + +FX_BOOL CPWL_Button::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonUp(point, nFlag); + + ReleaseCapture(); + m_bMouseDown = FALSE; + + return TRUE; +} + diff --git a/fpdfsdk/src/pdfwindow/PWL_Caret.cpp b/fpdfsdk/src/pdfwindow/PWL_Caret.cpp index e54538ea73..cdc7d57a9b 100644 --- a/fpdfsdk/src/pdfwindow/PWL_Caret.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_Caret.cpp @@ -1,197 +1,197 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_Caret.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-
-#define PWL_CARET_FLASHINTERVAL 500
-
-//////////////////////////////////////////////////////////////////////
-// Construction/Destruction
-//////////////////////////////////////////////////////////////////////
-
-CPWL_Caret::CPWL_Caret() :
- m_bFlash(FALSE),
- m_ptHead(0,0),
- m_ptFoot(0,0),
- m_fWidth(0.4f),
- m_nDelay(0)
-{
-}
-
-CPWL_Caret::~CPWL_Caret()
-{
-}
-
-CFX_ByteString CPWL_Caret::GetClassName() const
-{
- return "CPWL_Caret";
-}
-
-void CPWL_Caret::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
-{
- GetCaretApp(sAppStream,CPDF_Point(0.0f,0.0f));
-}
-
-void CPWL_Caret::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- if (IsVisible() && m_bFlash)
- {
- CPDF_Rect rcRect = GetCaretRect();
- CPDF_Rect rcClip = GetClipRect();
-
- CFX_PathData path;
-
- path.SetPointCount(2);
-
- FX_FLOAT fCaretX = rcRect.left + m_fWidth * 0.5f;
- FX_FLOAT fCaretTop = rcRect.top;
- FX_FLOAT fCaretBottom = rcRect.bottom;
-
- if (!rcClip.IsEmpty())
- {
- rcRect.Intersect(rcClip);
- if (!rcRect.IsEmpty())
- {
- fCaretTop = rcRect.top;
- fCaretBottom = rcRect.bottom;
- path.SetPoint(0, fCaretX, fCaretBottom, FXPT_MOVETO);
- path.SetPoint(1, fCaretX, fCaretTop, FXPT_LINETO);
- }
- else
- {
- return;
- }
- }
- else
- {
- path.SetPoint(0, fCaretX, fCaretBottom, FXPT_MOVETO);
- path.SetPoint(1, fCaretX, fCaretTop, FXPT_LINETO);
- }
-
- CFX_GraphStateData gsd;
- gsd.m_LineWidth = m_fWidth;
-
- pDevice->DrawPath(&path, pUser2Device, &gsd,0, ArgbEncode(255,0,0,0), FXFILL_ALTERNATE);
- }
-}
-
-void CPWL_Caret::GetCaretApp(CFX_ByteTextBuf & sAppStream,const CPDF_Point & ptOffset)
-{
- if (IsVisible() && m_bFlash)
- {
- CFX_ByteTextBuf sCaret;
-
- CPDF_Rect rcRect = GetCaretRect();
- CPDF_Rect rcClip = GetClipRect();
-
- rcRect = CPWL_Utils::OffsetRect(rcRect,ptOffset.x,ptOffset.y);
- rcClip = CPWL_Utils::OffsetRect(rcClip,ptOffset.x,ptOffset.y);
-
- sCaret << "q\n";
- if (!rcClip.IsEmpty())
- {
- sCaret << rcClip.left << " " << rcClip.bottom + 2.5f << " "
- << rcClip.right - rcClip.left << " " << rcClip.top - rcClip.bottom - 4.5f << " re W n\n";
- }
- sCaret << m_fWidth << " w\n0 G\n";
- sCaret << rcRect.left + m_fWidth/2 << " " << rcRect.bottom << " m\n";
- sCaret << rcRect.left + m_fWidth/2 << " " << rcRect.top << " l S\nQ\n";
-
- sAppStream << sCaret;
- }
-}
-
-CFX_ByteString CPWL_Caret::GetCaretAppearanceStream(const CPDF_Point & ptOffset)
-{
- CFX_ByteTextBuf sCaret;
- GetCaretApp(sCaret,ptOffset);
- return sCaret.GetByteString();
-}
-
-void CPWL_Caret::TimerProc()
-{
- if (m_nDelay > 0)
- {
- m_nDelay--;
- }
- else
- {
- m_bFlash = !m_bFlash;
- InvalidateRect();
- }
-}
-
-CPDF_Rect CPWL_Caret::GetCaretRect() const
-{
- return CPDF_Rect(m_ptFoot.x,
- m_ptFoot.y,
- m_ptHead.x + this->m_fWidth,
- m_ptHead.y);
-}
-
-void CPWL_Caret::SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot)
-{
- if (bVisible)
- {
- if (IsVisible())
- {
- if (m_ptHead.x != ptHead.x || m_ptHead.y != ptHead.y ||
- m_ptFoot.x != ptFoot.x || m_ptFoot.y != ptFoot.y)
- {
- this->m_ptHead = ptHead;
- this->m_ptFoot = ptFoot;
-
- m_bFlash = TRUE;
- //Move(GetCaretRect(),FALSE,TRUE);
- Move(m_rcInvalid, FALSE, TRUE);
- }
- }
- else
- {
- this->m_ptHead = ptHead;
- this->m_ptFoot = ptFoot;
-
- EndTimer();
- BeginTimer(PWL_CARET_FLASHINTERVAL);
-
- CPWL_Wnd::SetVisible(TRUE);
- m_bFlash = TRUE;
-
- //Move(GetCaretRect(),FALSE,TRUE);
- Move(m_rcInvalid, FALSE, TRUE);
- }
- }
- else
- {
- this->m_ptHead = CPDF_Point(0,0);
- this->m_ptFoot = CPDF_Point(0,0);
-
- m_bFlash = FALSE;
- if (IsVisible())
- {
- EndTimer();
- CPWL_Wnd::SetVisible(FALSE);
- }
- }
-}
-
-void CPWL_Caret::InvalidateRect(CPDF_Rect * pRect)
-{
- if (pRect)
- {
- CPDF_Rect rcRefresh = CPWL_Utils::InflateRect(*pRect,0.5f);
- rcRefresh.top += 1;
- rcRefresh.bottom -= 1;
-
- CPWL_Wnd::InvalidateRect(&rcRefresh);
- }
- else
- CPWL_Wnd::InvalidateRect(pRect);
-}
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_Caret.h" +#include "../../include/pdfwindow/PWL_Utils.h" + +#define PWL_CARET_FLASHINTERVAL 500 + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CPWL_Caret::CPWL_Caret() : + m_bFlash(FALSE), + m_ptHead(0,0), + m_ptFoot(0,0), + m_fWidth(0.4f), + m_nDelay(0) +{ +} + +CPWL_Caret::~CPWL_Caret() +{ +} + +CFX_ByteString CPWL_Caret::GetClassName() const +{ + return "CPWL_Caret"; +} + +void CPWL_Caret::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream) +{ + GetCaretApp(sAppStream,CPDF_Point(0.0f,0.0f)); +} + +void CPWL_Caret::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + if (IsVisible() && m_bFlash) + { + CPDF_Rect rcRect = GetCaretRect(); + CPDF_Rect rcClip = GetClipRect(); + + CFX_PathData path; + + path.SetPointCount(2); + + FX_FLOAT fCaretX = rcRect.left + m_fWidth * 0.5f; + FX_FLOAT fCaretTop = rcRect.top; + FX_FLOAT fCaretBottom = rcRect.bottom; + + if (!rcClip.IsEmpty()) + { + rcRect.Intersect(rcClip); + if (!rcRect.IsEmpty()) + { + fCaretTop = rcRect.top; + fCaretBottom = rcRect.bottom; + path.SetPoint(0, fCaretX, fCaretBottom, FXPT_MOVETO); + path.SetPoint(1, fCaretX, fCaretTop, FXPT_LINETO); + } + else + { + return; + } + } + else + { + path.SetPoint(0, fCaretX, fCaretBottom, FXPT_MOVETO); + path.SetPoint(1, fCaretX, fCaretTop, FXPT_LINETO); + } + + CFX_GraphStateData gsd; + gsd.m_LineWidth = m_fWidth; + + pDevice->DrawPath(&path, pUser2Device, &gsd,0, ArgbEncode(255,0,0,0), FXFILL_ALTERNATE); + } +} + +void CPWL_Caret::GetCaretApp(CFX_ByteTextBuf & sAppStream,const CPDF_Point & ptOffset) +{ + if (IsVisible() && m_bFlash) + { + CFX_ByteTextBuf sCaret; + + CPDF_Rect rcRect = GetCaretRect(); + CPDF_Rect rcClip = GetClipRect(); + + rcRect = CPWL_Utils::OffsetRect(rcRect,ptOffset.x,ptOffset.y); + rcClip = CPWL_Utils::OffsetRect(rcClip,ptOffset.x,ptOffset.y); + + sCaret << "q\n"; + if (!rcClip.IsEmpty()) + { + sCaret << rcClip.left << " " << rcClip.bottom + 2.5f << " " + << rcClip.right - rcClip.left << " " << rcClip.top - rcClip.bottom - 4.5f << " re W n\n"; + } + sCaret << m_fWidth << " w\n0 G\n"; + sCaret << rcRect.left + m_fWidth/2 << " " << rcRect.bottom << " m\n"; + sCaret << rcRect.left + m_fWidth/2 << " " << rcRect.top << " l S\nQ\n"; + + sAppStream << sCaret; + } +} + +CFX_ByteString CPWL_Caret::GetCaretAppearanceStream(const CPDF_Point & ptOffset) +{ + CFX_ByteTextBuf sCaret; + GetCaretApp(sCaret,ptOffset); + return sCaret.GetByteString(); +} + +void CPWL_Caret::TimerProc() +{ + if (m_nDelay > 0) + { + m_nDelay--; + } + else + { + m_bFlash = !m_bFlash; + InvalidateRect(); + } +} + +CPDF_Rect CPWL_Caret::GetCaretRect() const +{ + return CPDF_Rect(m_ptFoot.x, + m_ptFoot.y, + m_ptHead.x + this->m_fWidth, + m_ptHead.y); +} + +void CPWL_Caret::SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot) +{ + if (bVisible) + { + if (IsVisible()) + { + if (m_ptHead.x != ptHead.x || m_ptHead.y != ptHead.y || + m_ptFoot.x != ptFoot.x || m_ptFoot.y != ptFoot.y) + { + this->m_ptHead = ptHead; + this->m_ptFoot = ptFoot; + + m_bFlash = TRUE; + //Move(GetCaretRect(),FALSE,TRUE); + Move(m_rcInvalid, FALSE, TRUE); + } + } + else + { + this->m_ptHead = ptHead; + this->m_ptFoot = ptFoot; + + EndTimer(); + BeginTimer(PWL_CARET_FLASHINTERVAL); + + CPWL_Wnd::SetVisible(TRUE); + m_bFlash = TRUE; + + //Move(GetCaretRect(),FALSE,TRUE); + Move(m_rcInvalid, FALSE, TRUE); + } + } + else + { + this->m_ptHead = CPDF_Point(0,0); + this->m_ptFoot = CPDF_Point(0,0); + + m_bFlash = FALSE; + if (IsVisible()) + { + EndTimer(); + CPWL_Wnd::SetVisible(FALSE); + } + } +} + +void CPWL_Caret::InvalidateRect(CPDF_Rect * pRect) +{ + if (pRect) + { + CPDF_Rect rcRefresh = CPWL_Utils::InflateRect(*pRect,0.5f); + rcRefresh.top += 1; + rcRefresh.bottom -= 1; + + CPWL_Wnd::InvalidateRect(&rcRefresh); + } + else + CPWL_Wnd::InvalidateRect(pRect); +} + diff --git a/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp b/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp index 7650a23e5b..020765aba5 100644 --- a/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp @@ -1,662 +1,662 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_EditCtrl.h"
-#include "../../include/pdfwindow/PWL_Edit.h"
-#include "../../include/pdfwindow/PWL_ListBox.h"
-#include "../../include/pdfwindow/PWL_ComboBox.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-
-#define PWLCB_DEFAULTFONTSIZE 12.0f
-
-#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
-#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb))
-
-
-/* ---------------------------- CPWL_CBListBox ---------------------------- */
-
-FX_BOOL CPWL_CBListBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonUp(point,nFlag);
-
- if (m_bMouseDown)
- {
- ReleaseCapture();
- m_bMouseDown = FALSE;
-
- if (this->ClientHitTest(point))
- {
- if (CPWL_Wnd * pParent = GetParentWindow())
- {
- pParent->OnNotify(this,PNM_LBUTTONUP,0,PWL_MAKEDWORD(point.x,point.y));
- }
-
- FX_BOOL bExit = FALSE;
- OnNotifySelChanged(FALSE,bExit, nFlag);
- if (bExit) return FALSE;
- }
- }
-
- return TRUE;
-}
-
-FX_BOOL CPWL_CBListBox::OnKeyDown(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag)
-{
- if (!m_pList) return FALSE;
-
- switch (nChar)
- {
- default:
- return FALSE;
- case FWL_VKEY_Up:
- case FWL_VKEY_Down:
- case FWL_VKEY_Home:
- case FWL_VKEY_Left:
- case FWL_VKEY_End:
- case FWL_VKEY_Right:
- break;
- }
-
- switch (nChar)
- {
- case FWL_VKEY_Up:
- m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- break;
- case FWL_VKEY_Down:
- m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- break;
- case FWL_VKEY_Home:
- m_pList->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- break;
- case FWL_VKEY_Left:
- m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- break;
- case FWL_VKEY_End:
- m_pList->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- break;
- case FWL_VKEY_Right:
- m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- break;
- case FWL_VKEY_Delete:
- break;
- }
-
- OnNotifySelChanged(TRUE,bExit, nFlag);
-
- return TRUE;
-}
-
-FX_BOOL CPWL_CBListBox::OnChar(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag)
-{
- if (!m_pList) return FALSE;
-
- if (!m_pList->OnChar(nChar,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag))) return FALSE;
-
- if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetParentWindow())
- {
- pComboBox->SetSelectText();
- }
-
- OnNotifySelChanged(TRUE,bExit,nFlag);
-
- return TRUE;
-}
-
-/* ---------------------------- CPWL_CBButton ---------------------------- */
-
-void CPWL_CBButton::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
-{
- CPWL_Wnd::GetThisAppearanceStream(sAppStream);
-
- CPDF_Rect rectWnd = CPWL_Wnd::GetWindowRect();
-
- if (IsVisible() && !rectWnd.IsEmpty())
- {
- CFX_ByteTextBuf sButton;
-
- CPDF_Point ptCenter = this->GetCenterPoint();
-
- CPDF_Point pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
- CPDF_Point pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
- CPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
-
- if (IsFloatBigger(rectWnd.right - rectWnd.left,PWL_CBBUTTON_TRIANGLE_HALFLEN * 2)
- &&
- IsFloatBigger(rectWnd.top - rectWnd.bottom,PWL_CBBUTTON_TRIANGLE_HALFLEN)
- )
- {
- sButton << "0 g\n";
- sButton << pt1.x << " " << pt1.y << " m\n";
- sButton << pt2.x << " " << pt2.y << " l\n";
- sButton << pt3.x << " " << pt3.y << " l\n";
- sButton << pt1.x << " " << pt1.y << " l f\n";
-
- sAppStream << "q\n" << sButton << "Q\n";
- }
- }
-}
-
-void CPWL_CBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
-
- CPDF_Rect rectWnd = CPWL_Wnd::GetWindowRect();
-
- if (IsVisible() && !rectWnd.IsEmpty())
- {
- CPDF_Point ptCenter = this->GetCenterPoint();
-
- CPDF_Point pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
- CPDF_Point pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
- CPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
-
- if (IsFloatBigger(rectWnd.right - rectWnd.left,PWL_CBBUTTON_TRIANGLE_HALFLEN * 2)
- &&
- IsFloatBigger(rectWnd.top - rectWnd.bottom,PWL_CBBUTTON_TRIANGLE_HALFLEN)
- )
- {
- CFX_PathData path;
-
- path.SetPointCount(4);
- path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);
- path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);
- path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);
- path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);
-
- pDevice->DrawPath(&path, pUser2Device, NULL,
- CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR,GetTransparency()),
- 0, FXFILL_ALTERNATE);
- }
- }
-}
-
-FX_BOOL CPWL_CBButton::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonDown(point,nFlag);
-
- SetCapture();
-
- if (CPWL_Wnd * pParent = GetParentWindow())
- {
- pParent->OnNotify(this,PNM_LBUTTONDOWN,0,PWL_MAKEDWORD(point.x,point.y));
- }
-
- return TRUE;
-}
-
-FX_BOOL CPWL_CBButton::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonUp(point, nFlag);
-
- ReleaseCapture();
-
- return TRUE;
-}
-
-/* ---------------------------- CPWL_ComboBox ---------------------------- */
-
-CPWL_ComboBox::CPWL_ComboBox() : m_pEdit(NULL),
- m_pButton(NULL),
- m_pList(NULL),
- m_bPopup(FALSE),
- m_nPopupWhere(0),
- m_nSelectItem(-1),
- m_pFillerNotify(NULL)
-{
-}
-
-CFX_ByteString CPWL_ComboBox::GetClassName() const
-{
- return "CPWL_ComboBox";
-}
-
-void CPWL_ComboBox::OnCreate(PWL_CREATEPARAM & cp)
-{
- cp.dwFlags &= ~PWS_HSCROLL;
- cp.dwFlags &= ~PWS_VSCROLL;
-}
-
-void CPWL_ComboBox::SetFocus()
-{
- if (m_pEdit)
- m_pEdit->SetFocus();
-}
-
-void CPWL_ComboBox::KillFocus()
-{
- SetPopup(FALSE);
- CPWL_Wnd::KillFocus();
-}
-
-CFX_WideString CPWL_ComboBox::GetText() const
-{
- if (m_pEdit)
- {
- return m_pEdit->GetText();
- }
- return CFX_WideString();
-}
-
-void CPWL_ComboBox::SetText(FX_LPCWSTR text)
-{
- if (m_pEdit)
- m_pEdit->SetText(text);
-}
-
-void CPWL_ComboBox::AddString(FX_LPCWSTR string)
-{
- if (m_pList)
- m_pList->AddString(string);
-}
-
-FX_INT32 CPWL_ComboBox::GetSelect() const
-{
- return m_nSelectItem;
-}
-
-void CPWL_ComboBox::SetSelect(FX_INT32 nItemIndex)
-{
- if (m_pList)
- m_pList->Select(nItemIndex);
-
- m_pEdit->SetText(m_pList->GetText());
-
- m_nSelectItem = nItemIndex;
-}
-
-void CPWL_ComboBox::SetEditSel(FX_INT32 nStartChar,FX_INT32 nEndChar)
-{
- if (m_pEdit)
- {
- m_pEdit->SetSel(nStartChar,nEndChar);
- }
-}
-
-void CPWL_ComboBox::GetEditSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const
-{
- nStartChar = -1;
- nEndChar = -1;
-
- if (m_pEdit)
- {
- m_pEdit->GetSel(nStartChar,nEndChar);
- }
-}
-
-void CPWL_ComboBox::Clear()
-{
- if (m_pEdit)
- {
- m_pEdit->Clear();
- }
-}
-
-void CPWL_ComboBox::CreateChildWnd(const PWL_CREATEPARAM & cp)
-{
- CreateEdit(cp);
- CreateButton(cp);
- CreateListBox(cp);
-}
-
-void CPWL_ComboBox::CreateEdit(const PWL_CREATEPARAM & cp)
-{
- if (!m_pEdit)
- {
- m_pEdit = new CPWL_CBEdit;
- m_pEdit->AttachFFLData(m_pFormFiller);
-
- PWL_CREATEPARAM ecp = cp;
- ecp.pParentWnd = this;
- ecp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PES_CENTER | PES_AUTOSCROLL | PES_UNDO;
-
- if (HasFlag(PWS_AUTOFONTSIZE))
- ecp.dwFlags |= PWS_AUTOFONTSIZE;
-
- if (!HasFlag(PCBS_ALLOWCUSTOMTEXT))
- ecp.dwFlags |= PWS_READONLY;
-
- ecp.rcRectWnd = CPDF_Rect(0,0,0,0);
- ecp.dwBorderWidth = 0;
- ecp.nBorderStyle = PBS_SOLID;
-
- m_pEdit->Create(ecp);
- }
-}
-
-void CPWL_ComboBox::CreateButton(const PWL_CREATEPARAM & cp)
-{
- if (!m_pButton)
- {
- m_pButton = new CPWL_CBButton;
-
- PWL_CREATEPARAM bcp = cp;
- bcp.pParentWnd = this;
- bcp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND;
- bcp.sBackgroundColor = PWL_SCROLLBAR_BKCOLOR;
- bcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR;
- bcp.dwBorderWidth = 2;
- bcp.nBorderStyle = PBS_BEVELED;
- bcp.eCursorType = FXCT_ARROW;
-
- m_pButton->Create(bcp);
- }
-}
-
-void CPWL_ComboBox::CreateListBox(const PWL_CREATEPARAM & cp)
-{
- if (!m_pList)
- {
- m_pList = new CPWL_CBListBox;
- m_pList->AttachFFLData(m_pFormFiller);
- PWL_CREATEPARAM lcp = cp;
- lcp.pParentWnd = this;
- lcp.dwFlags = PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PLBS_HOVERSEL | PWS_VSCROLL;
- lcp.nBorderStyle = PBS_SOLID;
- lcp.dwBorderWidth = 1;
- lcp.eCursorType = FXCT_ARROW;
- lcp.rcRectWnd = CPDF_Rect(0,0,0,0);
-
- if (cp.dwFlags & PWS_AUTOFONTSIZE)
- lcp.fFontSize = PWLCB_DEFAULTFONTSIZE;
- else
- lcp.fFontSize = cp.fFontSize;
-
- if (cp.sBorderColor.nColorType == COLORTYPE_TRANSPARENT)
- lcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR;
-
- if (cp.sBackgroundColor.nColorType == COLORTYPE_TRANSPARENT)
- lcp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
-
- m_pList->Create(lcp);
- }
-}
-
-void CPWL_ComboBox::RePosChildWnd()
-{
- CPDF_Rect rcClient = GetClientRect();
-
- if (m_bPopup)
- {
- CPDF_Rect rclient = GetClientRect();
- CPDF_Rect rcButton = rclient;
- CPDF_Rect rcEdit = rcClient;
- CPDF_Rect rcList = CPWL_Wnd::GetWindowRect();
-
- FX_FLOAT fOldWindowHeight = m_rcOldWindow.Height();
- FX_FLOAT fOldClientHeight = fOldWindowHeight - GetBorderWidth() * 2;
-
- switch (m_nPopupWhere)
- {
- case 0:
- rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;
-
- if (rcButton.left < rclient.left)
- rcButton.left = rclient.left;
-
- rcButton.bottom = rcButton.top - fOldClientHeight;
-
- rcEdit.right = rcButton.left - 1.0f;
-
- if (rcEdit.left < rclient.left)
- rcEdit.left = rclient.left;
-
- if (rcEdit.right < rcEdit.left)
- rcEdit.right = rcEdit.left;
-
- rcEdit.bottom = rcEdit.top - fOldClientHeight;
-
- rcList.top -= fOldWindowHeight;
-
- break;
- case 1:
- rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;
-
- if (rcButton.left < rclient.left)
- rcButton.left = rclient.left;
-
- rcButton.top = rcButton.bottom + fOldClientHeight;
-
- rcEdit.right = rcButton.left - 1.0f;
-
- if (rcEdit.left < rclient.left)
- rcEdit.left = rclient.left;
-
- if (rcEdit.right < rcEdit.left)
- rcEdit.right = rcEdit.left;
-
- rcEdit.top = rcEdit.bottom + fOldClientHeight;
-
- rcList.bottom += fOldWindowHeight;
-
- break;
- }
-
- if (m_pButton)
- m_pButton->Move(rcButton,TRUE,FALSE);
-
- if (m_pEdit)
- m_pEdit->Move(rcEdit,TRUE,FALSE);
-
- if (m_pList)
- {
- m_pList->SetVisible(TRUE);
- m_pList->Move(rcList,TRUE,FALSE);
- m_pList->ScrollToListItem(m_nSelectItem);
- }
- }
- else
- {
- CPDF_Rect rcButton = rcClient;
-
- rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;
-
- if (rcButton.left < rcClient.left)
- rcButton.left = rcClient.left;
-
- if (m_pButton)
- m_pButton->Move(rcButton,TRUE,FALSE);
-
- CPDF_Rect rcEdit = rcClient;
- rcEdit.right = rcButton.left - 1.0f;
-
- if (rcEdit.left < rcClient.left)
- rcEdit.left = rcClient.left;
-
- if (rcEdit.right < rcEdit.left)
- rcEdit.right = rcEdit.left;
-
- if (m_pEdit)
- m_pEdit->Move(rcEdit,TRUE,FALSE);
-
- if (m_pList)
- m_pList->SetVisible(FALSE);
- }
-}
-
-void CPWL_ComboBox::SelectAll()
-{
- if (m_pEdit && HasFlag(PCBS_ALLOWCUSTOMTEXT))
- m_pEdit->SelectAll();
-}
-
-CPDF_Rect CPWL_ComboBox::GetFocusRect() const
-{
- return CPDF_Rect();
-}
-
-void CPWL_ComboBox::SetPopup(FX_BOOL bPopup)
-{
- if (!m_pList) return;
- if (bPopup == m_bPopup) return;
- FX_FLOAT fListHeight = m_pList->GetContentRect().Height();
- if (!IsFloatBigger(fListHeight,0.0f)) return;
-
- if (bPopup)
- {
- if (m_pFillerNotify)
- {
- FX_INT32 nWhere = 0;
- FX_FLOAT fPopupRet = 0.0f;
- FX_FLOAT fPopupMin = 0.0f;
- if (m_pList->GetCount() > 3)
- fPopupMin = m_pList->GetFirstHeight() * 3 + m_pList->GetBorderWidth() * 2;
- FX_FLOAT fPopupMax = fListHeight + m_pList->GetBorderWidth() * 2;
- m_pFillerNotify->QueryWherePopup(GetAttachedData(), fPopupMin,fPopupMax,nWhere,fPopupRet);
-
- if (IsFloatBigger(fPopupRet,0.0f))
- {
- m_bPopup = bPopup;
-
- CPDF_Rect rcWindow = CPWL_Wnd::GetWindowRect();
- m_rcOldWindow = rcWindow;
- switch (nWhere)
- {
- default:
- case 0:
- rcWindow.bottom -= fPopupRet;
- break;
- case 1:
- rcWindow.top += fPopupRet;
- break;
- }
-
- m_nPopupWhere = nWhere;
- Move(rcWindow, TRUE, TRUE);
- }
- }
- }
- else
- {
- m_bPopup = bPopup;
- Move(m_rcOldWindow, TRUE, TRUE);
- }
-}
-
-FX_BOOL CPWL_ComboBox::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)
-{
- if (!m_pList) return FALSE;
- if (!m_pEdit) return FALSE;
-
- m_nSelectItem = -1;
-
- switch (nChar)
- {
- case FWL_VKEY_Up:
- if (m_pList->GetCurSel() > 0)
- {
- FX_BOOL bExit = FALSE;
- if (m_pList->OnKeyDown(nChar,bExit,nFlag))
- {
- if (bExit) return FALSE;
- SetSelectText();
- }
- }
- return TRUE;
- case FWL_VKEY_Down:
- if (m_pList->GetCurSel() < m_pList->GetCount() - 1)
- {
- FX_BOOL bExit = FALSE;
- if (m_pList->OnKeyDown(nChar,bExit,nFlag))
- {
- if (bExit) return FALSE;
- SetSelectText();
- }
- }
- return TRUE;
- }
-
- if (HasFlag(PCBS_ALLOWCUSTOMTEXT))
- return m_pEdit->OnKeyDown(nChar,nFlag);
- else
- return FALSE;
-}
-
-FX_BOOL CPWL_ComboBox::OnChar(FX_WORD nChar, FX_DWORD nFlag)
-{
- if (!m_pList) return FALSE;
- if (!m_pEdit) return FALSE;
-
- m_nSelectItem = -1;
- FX_BOOL bExit = FALSE;
-
- if (HasFlag(PCBS_ALLOWCUSTOMTEXT))
- {
- return m_pEdit->OnChar(nChar,nFlag);
- }
- else
- {
- if (m_pList->OnChar(nChar,bExit,nFlag))
- {
- return bExit;
- }
- else
- return FALSE;
- }
-}
-
-void CPWL_ComboBox::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
-{
- switch (msg)
- {
- case PNM_LBUTTONDOWN:
- if (pWnd == m_pButton)
- {
- SetPopup(!m_bPopup);
- return;
- }
- break;
- case PNM_LBUTTONUP:
- if (m_pEdit && m_pList)
- {
- if (pWnd == m_pList)
- {
- SetSelectText();
- SelectAll();
- m_pEdit->SetFocus();
- SetPopup(FALSE);
- return;
- }
- }
- }
-
- CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
-}
-
-FX_BOOL CPWL_ComboBox::IsPopup() const
-{
- return m_bPopup;
-}
-
-void CPWL_ComboBox::SetSelectText()
-{
- CFX_WideString swText = m_pList->GetText();
- m_pEdit->SelectAll();
- m_pEdit->ReplaceSel(m_pList->GetText());
- m_pEdit->SelectAll();
-
- m_nSelectItem = m_pList->GetCurSel();
-}
-
-FX_BOOL CPWL_ComboBox::IsModified() const
-{
- return m_pEdit->IsModified();
-}
-
-void CPWL_ComboBox::SetFillerNotify(IPWL_Filler_Notify* pNotify)
-{
- m_pFillerNotify = pNotify;
-
- if (m_pEdit)
- m_pEdit->SetFillerNotify(pNotify);
-
- if (m_pList)
- m_pList->SetFillerNotify(pNotify);
-}
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_EditCtrl.h" +#include "../../include/pdfwindow/PWL_Edit.h" +#include "../../include/pdfwindow/PWL_ListBox.h" +#include "../../include/pdfwindow/PWL_ComboBox.h" +#include "../../include/pdfwindow/PWL_Utils.h" + +#define PWLCB_DEFAULTFONTSIZE 12.0f + +#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) +#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) +#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) +#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb)) + + +/* ---------------------------- CPWL_CBListBox ---------------------------- */ + +FX_BOOL CPWL_CBListBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonUp(point,nFlag); + + if (m_bMouseDown) + { + ReleaseCapture(); + m_bMouseDown = FALSE; + + if (this->ClientHitTest(point)) + { + if (CPWL_Wnd * pParent = GetParentWindow()) + { + pParent->OnNotify(this,PNM_LBUTTONUP,0,PWL_MAKEDWORD(point.x,point.y)); + } + + FX_BOOL bExit = FALSE; + OnNotifySelChanged(FALSE,bExit, nFlag); + if (bExit) return FALSE; + } + } + + return TRUE; +} + +FX_BOOL CPWL_CBListBox::OnKeyDown(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag) +{ + if (!m_pList) return FALSE; + + switch (nChar) + { + default: + return FALSE; + case FWL_VKEY_Up: + case FWL_VKEY_Down: + case FWL_VKEY_Home: + case FWL_VKEY_Left: + case FWL_VKEY_End: + case FWL_VKEY_Right: + break; + } + + switch (nChar) + { + case FWL_VKEY_Up: + m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Down: + m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Home: + m_pList->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Left: + m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_End: + m_pList->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Right: + m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Delete: + break; + } + + OnNotifySelChanged(TRUE,bExit, nFlag); + + return TRUE; +} + +FX_BOOL CPWL_CBListBox::OnChar(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag) +{ + if (!m_pList) return FALSE; + + if (!m_pList->OnChar(nChar,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag))) return FALSE; + + if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetParentWindow()) + { + pComboBox->SetSelectText(); + } + + OnNotifySelChanged(TRUE,bExit,nFlag); + + return TRUE; +} + +/* ---------------------------- CPWL_CBButton ---------------------------- */ + +void CPWL_CBButton::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream) +{ + CPWL_Wnd::GetThisAppearanceStream(sAppStream); + + CPDF_Rect rectWnd = CPWL_Wnd::GetWindowRect(); + + if (IsVisible() && !rectWnd.IsEmpty()) + { + CFX_ByteTextBuf sButton; + + CPDF_Point ptCenter = this->GetCenterPoint(); + + CPDF_Point pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); + CPDF_Point pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); + CPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); + + if (IsFloatBigger(rectWnd.right - rectWnd.left,PWL_CBBUTTON_TRIANGLE_HALFLEN * 2) + && + IsFloatBigger(rectWnd.top - rectWnd.bottom,PWL_CBBUTTON_TRIANGLE_HALFLEN) + ) + { + sButton << "0 g\n"; + sButton << pt1.x << " " << pt1.y << " m\n"; + sButton << pt2.x << " " << pt2.y << " l\n"; + sButton << pt3.x << " " << pt3.y << " l\n"; + sButton << pt1.x << " " << pt1.y << " l f\n"; + + sAppStream << "q\n" << sButton << "Q\n"; + } + } +} + +void CPWL_CBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device); + + CPDF_Rect rectWnd = CPWL_Wnd::GetWindowRect(); + + if (IsVisible() && !rectWnd.IsEmpty()) + { + CPDF_Point ptCenter = this->GetCenterPoint(); + + CPDF_Point pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); + CPDF_Point pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); + CPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); + + if (IsFloatBigger(rectWnd.right - rectWnd.left,PWL_CBBUTTON_TRIANGLE_HALFLEN * 2) + && + IsFloatBigger(rectWnd.top - rectWnd.bottom,PWL_CBBUTTON_TRIANGLE_HALFLEN) + ) + { + CFX_PathData path; + + path.SetPointCount(4); + path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO); + path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO); + path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO); + path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO); + + pDevice->DrawPath(&path, pUser2Device, NULL, + CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR,GetTransparency()), + 0, FXFILL_ALTERNATE); + } + } +} + +FX_BOOL CPWL_CBButton::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonDown(point,nFlag); + + SetCapture(); + + if (CPWL_Wnd * pParent = GetParentWindow()) + { + pParent->OnNotify(this,PNM_LBUTTONDOWN,0,PWL_MAKEDWORD(point.x,point.y)); + } + + return TRUE; +} + +FX_BOOL CPWL_CBButton::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonUp(point, nFlag); + + ReleaseCapture(); + + return TRUE; +} + +/* ---------------------------- CPWL_ComboBox ---------------------------- */ + +CPWL_ComboBox::CPWL_ComboBox() : m_pEdit(NULL), + m_pButton(NULL), + m_pList(NULL), + m_bPopup(FALSE), + m_nPopupWhere(0), + m_nSelectItem(-1), + m_pFillerNotify(NULL) +{ +} + +CFX_ByteString CPWL_ComboBox::GetClassName() const +{ + return "CPWL_ComboBox"; +} + +void CPWL_ComboBox::OnCreate(PWL_CREATEPARAM & cp) +{ + cp.dwFlags &= ~PWS_HSCROLL; + cp.dwFlags &= ~PWS_VSCROLL; +} + +void CPWL_ComboBox::SetFocus() +{ + if (m_pEdit) + m_pEdit->SetFocus(); +} + +void CPWL_ComboBox::KillFocus() +{ + SetPopup(FALSE); + CPWL_Wnd::KillFocus(); +} + +CFX_WideString CPWL_ComboBox::GetText() const +{ + if (m_pEdit) + { + return m_pEdit->GetText(); + } + return CFX_WideString(); +} + +void CPWL_ComboBox::SetText(FX_LPCWSTR text) +{ + if (m_pEdit) + m_pEdit->SetText(text); +} + +void CPWL_ComboBox::AddString(FX_LPCWSTR string) +{ + if (m_pList) + m_pList->AddString(string); +} + +FX_INT32 CPWL_ComboBox::GetSelect() const +{ + return m_nSelectItem; +} + +void CPWL_ComboBox::SetSelect(FX_INT32 nItemIndex) +{ + if (m_pList) + m_pList->Select(nItemIndex); + + m_pEdit->SetText(m_pList->GetText()); + + m_nSelectItem = nItemIndex; +} + +void CPWL_ComboBox::SetEditSel(FX_INT32 nStartChar,FX_INT32 nEndChar) +{ + if (m_pEdit) + { + m_pEdit->SetSel(nStartChar,nEndChar); + } +} + +void CPWL_ComboBox::GetEditSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const +{ + nStartChar = -1; + nEndChar = -1; + + if (m_pEdit) + { + m_pEdit->GetSel(nStartChar,nEndChar); + } +} + +void CPWL_ComboBox::Clear() +{ + if (m_pEdit) + { + m_pEdit->Clear(); + } +} + +void CPWL_ComboBox::CreateChildWnd(const PWL_CREATEPARAM & cp) +{ + CreateEdit(cp); + CreateButton(cp); + CreateListBox(cp); +} + +void CPWL_ComboBox::CreateEdit(const PWL_CREATEPARAM & cp) +{ + if (!m_pEdit) + { + m_pEdit = new CPWL_CBEdit; + m_pEdit->AttachFFLData(m_pFormFiller); + + PWL_CREATEPARAM ecp = cp; + ecp.pParentWnd = this; + ecp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PES_CENTER | PES_AUTOSCROLL | PES_UNDO; + + if (HasFlag(PWS_AUTOFONTSIZE)) + ecp.dwFlags |= PWS_AUTOFONTSIZE; + + if (!HasFlag(PCBS_ALLOWCUSTOMTEXT)) + ecp.dwFlags |= PWS_READONLY; + + ecp.rcRectWnd = CPDF_Rect(0,0,0,0); + ecp.dwBorderWidth = 0; + ecp.nBorderStyle = PBS_SOLID; + + m_pEdit->Create(ecp); + } +} + +void CPWL_ComboBox::CreateButton(const PWL_CREATEPARAM & cp) +{ + if (!m_pButton) + { + m_pButton = new CPWL_CBButton; + + PWL_CREATEPARAM bcp = cp; + bcp.pParentWnd = this; + bcp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND; + bcp.sBackgroundColor = PWL_SCROLLBAR_BKCOLOR; + bcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR; + bcp.dwBorderWidth = 2; + bcp.nBorderStyle = PBS_BEVELED; + bcp.eCursorType = FXCT_ARROW; + + m_pButton->Create(bcp); + } +} + +void CPWL_ComboBox::CreateListBox(const PWL_CREATEPARAM & cp) +{ + if (!m_pList) + { + m_pList = new CPWL_CBListBox; + m_pList->AttachFFLData(m_pFormFiller); + PWL_CREATEPARAM lcp = cp; + lcp.pParentWnd = this; + lcp.dwFlags = PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PLBS_HOVERSEL | PWS_VSCROLL; + lcp.nBorderStyle = PBS_SOLID; + lcp.dwBorderWidth = 1; + lcp.eCursorType = FXCT_ARROW; + lcp.rcRectWnd = CPDF_Rect(0,0,0,0); + + if (cp.dwFlags & PWS_AUTOFONTSIZE) + lcp.fFontSize = PWLCB_DEFAULTFONTSIZE; + else + lcp.fFontSize = cp.fFontSize; + + if (cp.sBorderColor.nColorType == COLORTYPE_TRANSPARENT) + lcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR; + + if (cp.sBackgroundColor.nColorType == COLORTYPE_TRANSPARENT) + lcp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR; + + m_pList->Create(lcp); + } +} + +void CPWL_ComboBox::RePosChildWnd() +{ + CPDF_Rect rcClient = GetClientRect(); + + if (m_bPopup) + { + CPDF_Rect rclient = GetClientRect(); + CPDF_Rect rcButton = rclient; + CPDF_Rect rcEdit = rcClient; + CPDF_Rect rcList = CPWL_Wnd::GetWindowRect(); + + FX_FLOAT fOldWindowHeight = m_rcOldWindow.Height(); + FX_FLOAT fOldClientHeight = fOldWindowHeight - GetBorderWidth() * 2; + + switch (m_nPopupWhere) + { + case 0: + rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH; + + if (rcButton.left < rclient.left) + rcButton.left = rclient.left; + + rcButton.bottom = rcButton.top - fOldClientHeight; + + rcEdit.right = rcButton.left - 1.0f; + + if (rcEdit.left < rclient.left) + rcEdit.left = rclient.left; + + if (rcEdit.right < rcEdit.left) + rcEdit.right = rcEdit.left; + + rcEdit.bottom = rcEdit.top - fOldClientHeight; + + rcList.top -= fOldWindowHeight; + + break; + case 1: + rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH; + + if (rcButton.left < rclient.left) + rcButton.left = rclient.left; + + rcButton.top = rcButton.bottom + fOldClientHeight; + + rcEdit.right = rcButton.left - 1.0f; + + if (rcEdit.left < rclient.left) + rcEdit.left = rclient.left; + + if (rcEdit.right < rcEdit.left) + rcEdit.right = rcEdit.left; + + rcEdit.top = rcEdit.bottom + fOldClientHeight; + + rcList.bottom += fOldWindowHeight; + + break; + } + + if (m_pButton) + m_pButton->Move(rcButton,TRUE,FALSE); + + if (m_pEdit) + m_pEdit->Move(rcEdit,TRUE,FALSE); + + if (m_pList) + { + m_pList->SetVisible(TRUE); + m_pList->Move(rcList,TRUE,FALSE); + m_pList->ScrollToListItem(m_nSelectItem); + } + } + else + { + CPDF_Rect rcButton = rcClient; + + rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH; + + if (rcButton.left < rcClient.left) + rcButton.left = rcClient.left; + + if (m_pButton) + m_pButton->Move(rcButton,TRUE,FALSE); + + CPDF_Rect rcEdit = rcClient; + rcEdit.right = rcButton.left - 1.0f; + + if (rcEdit.left < rcClient.left) + rcEdit.left = rcClient.left; + + if (rcEdit.right < rcEdit.left) + rcEdit.right = rcEdit.left; + + if (m_pEdit) + m_pEdit->Move(rcEdit,TRUE,FALSE); + + if (m_pList) + m_pList->SetVisible(FALSE); + } +} + +void CPWL_ComboBox::SelectAll() +{ + if (m_pEdit && HasFlag(PCBS_ALLOWCUSTOMTEXT)) + m_pEdit->SelectAll(); +} + +CPDF_Rect CPWL_ComboBox::GetFocusRect() const +{ + return CPDF_Rect(); +} + +void CPWL_ComboBox::SetPopup(FX_BOOL bPopup) +{ + if (!m_pList) return; + if (bPopup == m_bPopup) return; + FX_FLOAT fListHeight = m_pList->GetContentRect().Height(); + if (!IsFloatBigger(fListHeight,0.0f)) return; + + if (bPopup) + { + if (m_pFillerNotify) + { + FX_INT32 nWhere = 0; + FX_FLOAT fPopupRet = 0.0f; + FX_FLOAT fPopupMin = 0.0f; + if (m_pList->GetCount() > 3) + fPopupMin = m_pList->GetFirstHeight() * 3 + m_pList->GetBorderWidth() * 2; + FX_FLOAT fPopupMax = fListHeight + m_pList->GetBorderWidth() * 2; + m_pFillerNotify->QueryWherePopup(GetAttachedData(), fPopupMin,fPopupMax,nWhere,fPopupRet); + + if (IsFloatBigger(fPopupRet,0.0f)) + { + m_bPopup = bPopup; + + CPDF_Rect rcWindow = CPWL_Wnd::GetWindowRect(); + m_rcOldWindow = rcWindow; + switch (nWhere) + { + default: + case 0: + rcWindow.bottom -= fPopupRet; + break; + case 1: + rcWindow.top += fPopupRet; + break; + } + + m_nPopupWhere = nWhere; + Move(rcWindow, TRUE, TRUE); + } + } + } + else + { + m_bPopup = bPopup; + Move(m_rcOldWindow, TRUE, TRUE); + } +} + +FX_BOOL CPWL_ComboBox::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag) +{ + if (!m_pList) return FALSE; + if (!m_pEdit) return FALSE; + + m_nSelectItem = -1; + + switch (nChar) + { + case FWL_VKEY_Up: + if (m_pList->GetCurSel() > 0) + { + FX_BOOL bExit = FALSE; + if (m_pList->OnKeyDown(nChar,bExit,nFlag)) + { + if (bExit) return FALSE; + SetSelectText(); + } + } + return TRUE; + case FWL_VKEY_Down: + if (m_pList->GetCurSel() < m_pList->GetCount() - 1) + { + FX_BOOL bExit = FALSE; + if (m_pList->OnKeyDown(nChar,bExit,nFlag)) + { + if (bExit) return FALSE; + SetSelectText(); + } + } + return TRUE; + } + + if (HasFlag(PCBS_ALLOWCUSTOMTEXT)) + return m_pEdit->OnKeyDown(nChar,nFlag); + else + return FALSE; +} + +FX_BOOL CPWL_ComboBox::OnChar(FX_WORD nChar, FX_DWORD nFlag) +{ + if (!m_pList) return FALSE; + if (!m_pEdit) return FALSE; + + m_nSelectItem = -1; + FX_BOOL bExit = FALSE; + + if (HasFlag(PCBS_ALLOWCUSTOMTEXT)) + { + return m_pEdit->OnChar(nChar,nFlag); + } + else + { + if (m_pList->OnChar(nChar,bExit,nFlag)) + { + return bExit; + } + else + return FALSE; + } +} + +void CPWL_ComboBox::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam) +{ + switch (msg) + { + case PNM_LBUTTONDOWN: + if (pWnd == m_pButton) + { + SetPopup(!m_bPopup); + return; + } + break; + case PNM_LBUTTONUP: + if (m_pEdit && m_pList) + { + if (pWnd == m_pList) + { + SetSelectText(); + SelectAll(); + m_pEdit->SetFocus(); + SetPopup(FALSE); + return; + } + } + } + + CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam); +} + +FX_BOOL CPWL_ComboBox::IsPopup() const +{ + return m_bPopup; +} + +void CPWL_ComboBox::SetSelectText() +{ + CFX_WideString swText = m_pList->GetText(); + m_pEdit->SelectAll(); + m_pEdit->ReplaceSel(m_pList->GetText()); + m_pEdit->SelectAll(); + + m_nSelectItem = m_pList->GetCurSel(); +} + +FX_BOOL CPWL_ComboBox::IsModified() const +{ + return m_pEdit->IsModified(); +} + +void CPWL_ComboBox::SetFillerNotify(IPWL_Filler_Notify* pNotify) +{ + m_pFillerNotify = pNotify; + + if (m_pEdit) + m_pEdit->SetFillerNotify(pNotify); + + if (m_pList) + m_pList->SetFillerNotify(pNotify); +} + diff --git a/fpdfsdk/src/pdfwindow/PWL_Edit.cpp b/fpdfsdk/src/pdfwindow/PWL_Edit.cpp index 87ddd87fb0..df59c2ccc8 100644 --- a/fpdfsdk/src/pdfwindow/PWL_Edit.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_Edit.cpp @@ -1,1316 +1,1316 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_EditCtrl.h"
-#include "../../include/pdfwindow/PWL_Edit.h"
-#include "../../include/pdfwindow/PWL_ScrollBar.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-#include "../../include/pdfwindow/PWL_Caret.h"
-#include "../../include/pdfwindow/PWL_FontMap.h"
-
-/* ---------------------------- CPWL_Edit ------------------------------ */
-
-CPWL_Edit::CPWL_Edit() : m_pFillerNotify(NULL),
- m_pSpellCheck(NULL),
- m_bFocus(FALSE)
-{
- m_pFormFiller = NULL;
-}
-
-CPWL_Edit::~CPWL_Edit()
-{
- ASSERT(m_bFocus == FALSE);
-}
-
-CFX_ByteString CPWL_Edit::GetClassName() const
-{
- return PWL_CLASSNAME_EDIT;
-}
-
-void CPWL_Edit::OnDestroy()
-{
-}
-
-void CPWL_Edit::SetText(FX_LPCWSTR csText)
-{
- CFX_WideString swText = csText;
-
- if (HasFlag(PES_RICH))
- {
- CFX_ByteString sValue = CFX_ByteString::FromUnicode(swText);
-
- if (CXML_Element * pXML = CXML_Element::Parse((FX_LPCSTR)sValue,sValue.GetLength()))
- {
- FX_INT32 nCount = pXML->CountChildren();
- FX_BOOL bFirst = TRUE;
-
- swText.Empty();
-
- for (FX_INT32 i=0; i<nCount; i++)
- {
- if (CXML_Element * pSubElement = pXML->GetElement(i))
- {
- CFX_ByteString tag=pSubElement->GetTagName();
- if (tag.EqualNoCase("p"))
- {
- int nChild = pSubElement->CountChildren();
- CFX_WideString swSection;
- for(FX_INT32 j=0; j<nChild; j++)
- {
- swSection += pSubElement->GetContent(j);
- }
-
- if (bFirst)bFirst = FALSE;
- else
- swText += FWL_VKEY_Return;
- swText += swSection;
- }
- }
- }
-
- delete pXML;
- }
- }
-
- m_pEdit->SetText(swText);
-}
-
-void CPWL_Edit::RePosChildWnd()
-{
- if (CPWL_ScrollBar * pVSB = this->GetVScrollBar())
- {
- //if (pVSB->IsVisible())
- {
- CPDF_Rect rcWindow = m_rcOldWindow;
- CPDF_Rect rcVScroll = CPDF_Rect(rcWindow.right,
- rcWindow.bottom,
- rcWindow.right + PWL_SCROLLBAR_WIDTH,
- rcWindow.top);
- pVSB->Move(rcVScroll, TRUE, FALSE);
- }
- }
-
- if (m_pEditCaret && !HasFlag(PES_TEXTOVERFLOW))
- m_pEditCaret->SetClipRect(CPWL_Utils::InflateRect(GetClientRect(),1.0f)); //+1 for caret beside border
-
- CPWL_EditCtrl::RePosChildWnd();
-}
-
-CPDF_Rect CPWL_Edit::GetClientRect() const
-{
- CPDF_Rect rcClient = CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
-
- if (CPWL_ScrollBar * pVSB = this->GetVScrollBar())
- {
- if (pVSB->IsVisible())
- {
- rcClient.right -= PWL_SCROLLBAR_WIDTH;
- }
- }
-
- return rcClient;
-}
-
-void CPWL_Edit::SetAlignFormatH(PWL_EDIT_ALIGNFORMAT_H nFormat, FX_BOOL bPaint/* = TRUE*/)
-{
- m_pEdit->SetAlignmentH((FX_INT32)nFormat, bPaint);
-}
-
-void CPWL_Edit::SetAlignFormatV(PWL_EDIT_ALIGNFORMAT_V nFormat, FX_BOOL bPaint/* = TRUE*/)
-{
- m_pEdit->SetAlignmentV((FX_INT32)nFormat, bPaint);
-}
-
-FX_BOOL CPWL_Edit::CanSelectAll() const
-{
- return GetSelectWordRange() != m_pEdit->GetWholeWordRange();
-}
-
-FX_BOOL CPWL_Edit::CanClear() const
-{
- return !IsReadOnly() && m_pEdit->IsSelected();
-}
-
-FX_BOOL CPWL_Edit::CanCopy() const
-{
- return !HasFlag(PES_PASSWORD) && !HasFlag(PES_NOREAD) && m_pEdit->IsSelected();
-}
-
-FX_BOOL CPWL_Edit::CanCut() const
-{
- return CanCopy() && !IsReadOnly();
-}
-
-FX_BOOL CPWL_Edit::CanPaste() const
-{
- if (IsReadOnly()) return FALSE;
-
- CFX_WideString swClipboard;
- if (IFX_SystemHandler* pSH = GetSystemHandler())
- swClipboard = pSH->GetClipboardText(GetAttachedHWnd());
-
- return !swClipboard.IsEmpty();
-}
-
-void CPWL_Edit::CopyText()
-{
- if (!CanCopy()) return;
-
- CFX_WideString str = m_pEdit->GetSelText();
-
- if (IFX_SystemHandler* pSH = GetSystemHandler())
- pSH->SetClipboardText(GetAttachedHWnd(), str);
-}
-
-void CPWL_Edit::PasteText()
-{
- if (!CanPaste()) return;
-
- CFX_WideString swClipboard;
- if (IFX_SystemHandler* pSH = GetSystemHandler())
- swClipboard = pSH->GetClipboardText(GetAttachedHWnd());
-
- if (m_pFillerNotify)
- {
- FX_BOOL bRC = TRUE;
- FX_BOOL bExit = FALSE;
- CFX_WideString strChangeEx;
- int nSelStart = 0;
- int nSelEnd = 0;
- GetSel(nSelStart, nSelEnd);
- m_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), 0 , swClipboard, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, 0);
- if (!bRC) return;
- if (bExit) return;
- }
-
- if (swClipboard.GetLength() > 0)
- {
- Clear();
- InsertText(swClipboard);
- }
-
- if (m_pFillerNotify)
- {
- FX_BOOL bExit = FALSE;
- m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,0);
- if (bExit) return;
- }
-}
-
-void CPWL_Edit::CutText()
-{
- if (!CanCut()) return;
-
- CFX_WideString str = m_pEdit->GetSelText();
-
- if (IFX_SystemHandler* pSH = GetSystemHandler())
- pSH->SetClipboardText(GetAttachedHWnd(), str);
-
- m_pEdit->Clear();
-}
-
-void CPWL_Edit::OnCreated()
-{
- CPWL_EditCtrl::OnCreated();
-
- if (CPWL_ScrollBar * pScroll = GetVScrollBar())
- {
- pScroll->RemoveFlag(PWS_AUTOTRANSPARENT);
- pScroll->SetTransparency(255);
- }
-
- SetParamByFlag();
-
- m_rcOldWindow = GetWindowRect();
-
- m_pEdit->SetOprNotify(this);
- m_pEdit->EnableOprNotify(TRUE);
-}
-
-void CPWL_Edit::SetParamByFlag()
-{
- if (HasFlag(PES_RIGHT))
- {
- m_pEdit->SetAlignmentH(2, FALSE);
- }
- else if (HasFlag(PES_MIDDLE))
- {
- m_pEdit->SetAlignmentH(1, FALSE);
- }
- else
- {
- m_pEdit->SetAlignmentH(0, FALSE);
- }
-
- if (HasFlag(PES_BOTTOM))
- {
- m_pEdit->SetAlignmentV(2, FALSE);
- }
- else if (HasFlag(PES_CENTER))
- {
- m_pEdit->SetAlignmentV(1, FALSE);
- }
- else
- {
- m_pEdit->SetAlignmentV(0, FALSE);
- }
-
- if (HasFlag(PES_PASSWORD))
- {
- m_pEdit->SetPasswordChar('*', FALSE);
- }
-
- m_pEdit->SetMultiLine(HasFlag(PES_MULTILINE), FALSE);
- m_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN), FALSE);
- m_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE), FALSE);
- m_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL), FALSE);
- m_pEdit->EnableUndo(HasFlag(PES_UNDO));
-
- if (HasFlag(PES_TEXTOVERFLOW))
- {
- SetClipRect(CPDF_Rect(0.0f,0.0f,0.0f,0.0f));
- m_pEdit->SetTextOverflow(TRUE, FALSE);
- }
- else
- {
- if (m_pEditCaret)
- {
- m_pEditCaret->SetClipRect(CPWL_Utils::InflateRect(GetClientRect(),1.0f)); //+1 for caret beside border
- }
- }
-
- if (HasFlag(PES_SPELLCHECK))
- {
- m_pSpellCheck = GetCreationParam().pSpellCheck;
- }
-}
-
-void CPWL_Edit::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
-{
- CPWL_Wnd::GetThisAppearanceStream(sAppStream);
-
- CPDF_Rect rcClient = GetClientRect();
- CFX_ByteTextBuf sLine;
-
- FX_INT32 nCharArray = m_pEdit->GetCharArray();
-
- if (nCharArray > 0)
- {
- switch (GetBorderStyle())
- {
- case PBS_SOLID:
- {
- sLine << "q\n" << GetBorderWidth() << " w\n"
- << CPWL_Utils::GetColorAppStream(GetBorderColor(),FALSE) << " 2 J 0 j\n";
-
- for (FX_INT32 i=1;i<nCharArray;i++)
- {
- sLine << rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << " "
- << rcClient.bottom << " m\n"
- << rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << " "
- << rcClient.top << " l S\n";
- }
-
- sLine << "Q\n";
- }
- break;
- case PBS_DASH:
- {
- sLine << "q\n" << GetBorderWidth() << " w\n"
- << CPWL_Utils::GetColorAppStream(GetBorderColor(),FALSE) << " 2 J 0 j\n"
- << "[" << GetBorderDash().nDash << " "
- << GetBorderDash().nGap << "] "
- << GetBorderDash().nPhase << " d\n";
-
- for (FX_INT32 i=1;i<nCharArray;i++)
- {
- sLine << rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << " "
- << rcClient.bottom << " m\n"
- << rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << " "
- << rcClient.top << " l S\n";
- }
-
- sLine << "Q\n";
- }
- break;
- }
- }
-
- sAppStream << sLine;
-
- CFX_ByteTextBuf sText;
-
- CPDF_Point ptOffset = CPDF_Point(0.0f,0.0f);
-
- CPVT_WordRange wrWhole = m_pEdit->GetWholeWordRange();
- CPVT_WordRange wrSelect = GetSelectWordRange();
- CPVT_WordRange wrVisible = (HasFlag(PES_TEXTOVERFLOW) ? wrWhole : m_pEdit->GetVisibleWordRange());
- CPVT_WordRange wrSelBefore(wrWhole.BeginPos,wrSelect.BeginPos);
- CPVT_WordRange wrSelAfter(wrSelect.EndPos,wrWhole.EndPos);
-
- CPVT_WordRange wrTemp = CPWL_Utils::OverlapWordRange(GetSelectWordRange(),wrVisible);
- CFX_ByteString sEditSel = CPWL_Utils::GetEditSelAppStream(m_pEdit, ptOffset,
- &wrTemp);
-
- if (sEditSel.GetLength() > 0)
- sText << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELBACKCOLOR) << sEditSel ;
-
- wrTemp = CPWL_Utils::OverlapWordRange(wrVisible,wrSelBefore);
- CFX_ByteString sEditBefore = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset,
- &wrTemp, !HasFlag(PES_CHARARRAY), m_pEdit->GetPasswordChar());
-
- if (sEditBefore.GetLength() > 0)
- sText << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEditBefore << "ET\n";
-
- wrTemp = CPWL_Utils::OverlapWordRange(wrVisible,wrSelect);
- CFX_ByteString sEditMid = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset,
- &wrTemp, !HasFlag(PES_CHARARRAY), m_pEdit->GetPasswordChar());
-
- if (sEditMid.GetLength() > 0)
- sText << "BT\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY,1)) << sEditMid << "ET\n";
-
- wrTemp = CPWL_Utils::OverlapWordRange(wrVisible,wrSelAfter);
- CFX_ByteString sEditAfter = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset,
- &wrTemp, !HasFlag(PES_CHARARRAY), m_pEdit->GetPasswordChar());
-
- if (sEditAfter.GetLength() > 0)
- sText << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEditAfter<< "ET\n";
-
- if (HasFlag(PES_SPELLCHECK))
- {
- CFX_ByteString sSpellCheck = CPWL_Utils::GetSpellCheckAppStream(m_pEdit, m_pSpellCheck, ptOffset, &wrVisible);
- if (sSpellCheck.GetLength() > 0)
- sText << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_RGB,1,0,0),FALSE) << sSpellCheck;
- }
-
- if (sText.GetLength() > 0)
- {
- CPDF_Rect rcClient = this->GetClientRect();
- sAppStream << "q\n/Tx BMC\n";
-
- if (!HasFlag(PES_TEXTOVERFLOW))
- sAppStream << rcClient.left << " " << rcClient.bottom << " "
- << rcClient.right - rcClient.left << " " << rcClient.top - rcClient.bottom << " re W n\n";
-
- sAppStream << sText;
-
- sAppStream << "EMC\nQ\n";
- }
-}
-
-void CPWL_Edit::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
-
- CPDF_Rect rcClient = GetClientRect();
- CFX_ByteTextBuf sLine;
-
- FX_INT32 nCharArray = m_pEdit->GetCharArray();
-
- if (nCharArray > 0)
- {
- switch (GetBorderStyle())
- {
- case PBS_SOLID:
- {
- CFX_GraphStateData gsd;
- gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth();
-
- CFX_PathData path;
- path.SetPointCount((nCharArray-1)*2);
-
- for (FX_INT32 i=0; i<nCharArray-1; i++)
- {
- path.SetPoint(i*2, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1),
- rcClient.bottom, FXPT_MOVETO);
- path.SetPoint(i*2+1, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1),
- rcClient.top, FXPT_LINETO);
- }
- if (path.GetPointCount() > 0)
- pDevice->DrawPath(&path, pUser2Device, &gsd,0,
- CPWL_Utils::PWLColorToFXColor(GetBorderColor(),255), FXFILL_ALTERNATE);
- }
- break;
- case PBS_DASH:
- {
- CFX_GraphStateData gsd;
- gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth();
-
- gsd.SetDashCount(2);
- gsd.m_DashArray[0] = (FX_FLOAT)GetBorderDash().nDash;
- gsd.m_DashArray[1] = (FX_FLOAT)GetBorderDash().nGap;
- gsd.m_DashPhase = (FX_FLOAT)GetBorderDash().nPhase;
-
- CFX_PathData path;
- path.SetPointCount((nCharArray-1)*2);
-
- for (FX_INT32 i=0; i<nCharArray-1; i++)
- {
- path.SetPoint(i*2, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1),
- rcClient.bottom, FXPT_MOVETO);
- path.SetPoint(i*2+1, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1),
- rcClient.top, FXPT_LINETO);
- }
- if (path.GetPointCount() > 0)
- pDevice->DrawPath(&path, pUser2Device, &gsd,0,
- CPWL_Utils::PWLColorToFXColor(GetBorderColor(),255), FXFILL_ALTERNATE);
- }
- break;
- }
- }
-
- CPDF_Rect rcClip;
- CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange();
- CPVT_WordRange* pRange = NULL;
-
- if (!HasFlag(PES_TEXTOVERFLOW))
- {
- rcClip = GetClientRect();
- pRange = &wrRange;
- }
-IFX_SystemHandler* pSysHandler = GetSystemHandler();
- IFX_Edit::DrawEdit(pDevice,pUser2Device,m_pEdit,
- CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()),
- CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(),this->GetTransparency()),
- rcClip,CPDF_Point(0.0f,0.0f),pRange, pSysHandler, m_pFormFiller);
-
- if (HasFlag(PES_SPELLCHECK))
- {
- CPWL_Utils::DrawEditSpellCheck(pDevice,pUser2Device,m_pEdit,rcClip,
- CPDF_Point(0.0f,0.0f),pRange, this->GetCreationParam().pSpellCheck);
- }
-}
-
-FX_BOOL CPWL_Edit::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonDown(point,nFlag);
-
- if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point))
- {
- if (m_bMouseDown)
- this->InvalidateRect();
-
- m_bMouseDown = TRUE;
- SetCapture();
-
- m_pEdit->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- }
-
- return TRUE;
-}
-
-FX_BOOL CPWL_Edit::OnLButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonDblClk(point, nFlag);
-
- if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point))
- {
- m_pEdit->SelectAll();
- }
-
- return TRUE;
-}
-
-#define WM_PWLEDIT_UNDO 0x01
-#define WM_PWLEDIT_REDO 0x02
-#define WM_PWLEDIT_CUT 0x03
-#define WM_PWLEDIT_COPY 0x04
-#define WM_PWLEDIT_PASTE 0x05
-#define WM_PWLEDIT_DELETE 0x06
-#define WM_PWLEDIT_SELECTALL 0x07
-#define WM_PWLEDIT_SUGGEST 0x08
-
-FX_BOOL CPWL_Edit::OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
-{
- if (m_bMouseDown) return FALSE;
-
- CPWL_Wnd::OnRButtonUp(point, nFlag);
-
- if (!HasFlag(PES_TEXTOVERFLOW) && !ClientHitTest(point)) return TRUE;
-
- IFX_SystemHandler* pSH = GetSystemHandler();
- if (!pSH) return FALSE;
-
- this->SetFocus();
-
- CPVT_WordRange wrLatin = GetLatinWordsRange(point);
- CFX_WideString swLatin = m_pEdit->GetRangeText(wrLatin);
-
- FX_HMENU hPopup = pSH->CreatePopupMenu();
- if (!hPopup) return FALSE;
-
- CFX_ByteStringArray sSuggestWords;
- CPDF_Point ptPopup = point;
-
- if (!IsReadOnly())
- {
- if (HasFlag(PES_SPELLCHECK) && !swLatin.IsEmpty())
- {
- if (m_pSpellCheck)
- {
- CFX_ByteString sLatin = CFX_ByteString::FromUnicode(swLatin);
-
- if (!m_pSpellCheck->CheckWord(sLatin))
- {
- m_pSpellCheck->SuggestWords(sLatin,sSuggestWords);
-
- FX_INT32 nSuggest = sSuggestWords.GetSize();
-
- for (FX_INT32 nWord=0; nWord<nSuggest; nWord++)
- {
- pSH->AppendMenuItem(hPopup, WM_PWLEDIT_SUGGEST+nWord, sSuggestWords[nWord].UTF8Decode());
- }
-
- if (nSuggest > 0)
- pSH->AppendMenuItem(hPopup, 0, L"");
-
- ptPopup = GetWordRightBottomPoint(wrLatin.EndPos);
- }
- }
- }
- }
-
- IPWL_Provider* pProvider = this->GetProvider();
-
- if (HasFlag(PES_UNDO))
- {
- pSH->AppendMenuItem(hPopup, WM_PWLEDIT_UNDO,
- pProvider ? pProvider->LoadPopupMenuString(0) : L"&Undo");
- pSH->AppendMenuItem(hPopup, WM_PWLEDIT_REDO,
- pProvider ? pProvider->LoadPopupMenuString(1) : L"&Redo");
- pSH->AppendMenuItem(hPopup, 0, L"");
-
- if (!m_pEdit->CanUndo())
- pSH->EnableMenuItem(hPopup, WM_PWLEDIT_UNDO, FALSE);
- if (!m_pEdit->CanRedo())
- pSH->EnableMenuItem(hPopup, WM_PWLEDIT_REDO, FALSE);
- }
-
- pSH->AppendMenuItem(hPopup, WM_PWLEDIT_CUT,
- pProvider ? pProvider->LoadPopupMenuString(2) : L"Cu&t");
- pSH->AppendMenuItem(hPopup, WM_PWLEDIT_COPY,
- pProvider ? pProvider->LoadPopupMenuString(3) : L"&Copy");
- pSH->AppendMenuItem(hPopup, WM_PWLEDIT_PASTE,
- pProvider ? pProvider->LoadPopupMenuString(4) : L"&Paste");
- pSH->AppendMenuItem(hPopup, WM_PWLEDIT_DELETE,
- pProvider ? pProvider->LoadPopupMenuString(5) : L"&Delete");
-
- CFX_WideString swText = pSH->GetClipboardText(this->GetAttachedHWnd());
- if (swText.IsEmpty())
- pSH->EnableMenuItem(hPopup, WM_PWLEDIT_PASTE, FALSE);
-
- if (!m_pEdit->IsSelected())
- {
- pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE);
- pSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE);
- pSH->EnableMenuItem(hPopup, WM_PWLEDIT_DELETE, FALSE);
- }
-
- if (IsReadOnly())
- {
- pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE);
- pSH->EnableMenuItem(hPopup, WM_PWLEDIT_DELETE, FALSE);
- pSH->EnableMenuItem(hPopup, WM_PWLEDIT_PASTE, FALSE);
- }
-
- if (HasFlag(PES_PASSWORD))
- {
- pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE);
- pSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE);
- }
-
- if (HasFlag(PES_NOREAD))
- {
- pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE);
- pSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE);
- }
-
- pSH->AppendMenuItem(hPopup, 0, L"");
- pSH->AppendMenuItem(hPopup, WM_PWLEDIT_SELECTALL,
- pProvider ? pProvider->LoadPopupMenuString(6) : L"&Select All");
-
- if (m_pEdit->GetTotalWords() == 0)
- {
- pSH->EnableMenuItem(hPopup, WM_PWLEDIT_SELECTALL, FALSE);
- }
-
- FX_INT32 x, y;
- PWLtoWnd(ptPopup, x, y);
- pSH->ClientToScreen(GetAttachedHWnd(), x, y);
- pSH->SetCursor(FXCT_ARROW);
- FX_INT32 nCmd = pSH->TrackPopupMenu(hPopup,
- x,
- y,
- GetAttachedHWnd());
-
-
- switch (nCmd)
- {
- case WM_PWLEDIT_UNDO:
- Undo();
- break;
- case WM_PWLEDIT_REDO:
- Redo();
- break;
- case WM_PWLEDIT_CUT:
- this->CutText();
- break;
- case WM_PWLEDIT_COPY:
- this->CopyText();
- break;
- case WM_PWLEDIT_PASTE:
- this->PasteText();
- break;
- case WM_PWLEDIT_DELETE:
- this->Clear();
- break;
- case WM_PWLEDIT_SELECTALL:
- this->SelectAll();
- break;
- case WM_PWLEDIT_SUGGEST + 0:
- SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
- ReplaceSel(sSuggestWords[0].UTF8Decode());
- break;
- case WM_PWLEDIT_SUGGEST + 1:
- SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
- ReplaceSel(sSuggestWords[1].UTF8Decode());
- break;
- case WM_PWLEDIT_SUGGEST + 2:
- SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
- ReplaceSel(sSuggestWords[2].UTF8Decode());
- break;
- case WM_PWLEDIT_SUGGEST + 3:
- SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
- ReplaceSel(sSuggestWords[3].UTF8Decode());
- break;
- case WM_PWLEDIT_SUGGEST + 4:
- SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
- ReplaceSel(sSuggestWords[4].UTF8Decode());
- break;
- default:
- break;
- }
-
- pSH->DestroyMenu(hPopup);
-
- return TRUE;
-}
-
-void CPWL_Edit::OnSetFocus()
-{
- SetEditCaret(TRUE);
-
- if (!IsReadOnly())
- {
- if (IPWL_FocusHandler* pFocusHandler = GetFocusHandler())
- pFocusHandler->OnSetFocus(this);
- }
-
- m_bFocus = TRUE;
-}
-
-void CPWL_Edit::OnKillFocus()
-{
- ShowVScrollBar(FALSE);
-
- m_pEdit->SelectNone();
- SetCaret(FALSE, CPDF_Point(0.0f,0.0f), CPDF_Point(0.0f,0.0f));
-
- SetCharSet(0);
-
- if (!IsReadOnly())
- {
- if (IPWL_FocusHandler* pFocusHandler = GetFocusHandler())
- pFocusHandler->OnKillFocus(this);
- }
-
- m_bFocus = FALSE;
-}
-
-void CPWL_Edit::SetHorzScale(FX_INT32 nHorzScale, FX_BOOL bPaint/* = TRUE*/)
-{
- m_pEdit->SetHorzScale(nHorzScale, bPaint);
-}
-
-void CPWL_Edit::SetCharSpace(FX_FLOAT fCharSpace, FX_BOOL bPaint/* = TRUE*/)
-{
- m_pEdit->SetCharSpace(fCharSpace, bPaint);
-}
-
-void CPWL_Edit::SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint/* = TRUE*/)
-{
- m_pEdit->SetLineLeading(fLineLeading, bPaint);
-}
-
-CFX_ByteString CPWL_Edit::GetSelectAppearanceStream(const CPDF_Point & ptOffset) const
-{
- CPVT_WordRange wr = GetSelectWordRange();
- return CPWL_Utils::GetEditSelAppStream(m_pEdit,ptOffset,&wr);
-}
-
-CPVT_WordRange CPWL_Edit::GetSelectWordRange() const
-{
- if (m_pEdit->IsSelected())
- {
- FX_INT32 nStart = -1;
- FX_INT32 nEnd = -1;
-
- m_pEdit->GetSel(nStart, nEnd);
-
- CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStart);
- CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEnd);
-
- return CPVT_WordRange(wpStart,wpEnd);
- }
-
- return CPVT_WordRange();
-}
-
-CFX_ByteString CPWL_Edit::GetTextAppearanceStream(const CPDF_Point & ptOffset) const
-{
- CFX_ByteTextBuf sRet;
- CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit,ptOffset);
-
- if (sEdit.GetLength() > 0)
- {
- sRet << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEdit << "ET\n";
- }
-
- return sRet.GetByteString();
-}
-
-CFX_ByteString CPWL_Edit::GetCaretAppearanceStream(const CPDF_Point & ptOffset) const
-{
- if (m_pEditCaret)
- return m_pEditCaret->GetCaretAppearanceStream(ptOffset);
-
- return CFX_ByteString();
-}
-
-CPDF_Point CPWL_Edit::GetWordRightBottomPoint(const CPVT_WordPlace& wpWord)
-{
- CPDF_Point pt(0.0f, 0.0f);
-
- if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
- {
- CPVT_WordPlace wpOld = pIterator->GetAt();
- pIterator->SetAt(wpWord);
- CPVT_Word word;
- if (pIterator->GetWord(word))
- {
- pt = CPDF_Point(word.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent);
- }
-
- pIterator->SetAt(wpOld);
- }
-
- return pt;
-}
-
-FX_BOOL CPWL_Edit::IsTextFull() const
-{
- return m_pEdit->IsTextFull();
-}
-
-FX_FLOAT CPWL_Edit::GetCharArrayAutoFontSize(CPDF_Font* pFont, const CPDF_Rect& rcPlate, FX_INT32 nCharArray)
-{
- if (pFont && !pFont->IsStandardFont())
- {
- FX_RECT rcBBox;
- pFont->GetFontBBox(rcBBox);
-
- CPDF_Rect rcCell = rcPlate;
- FX_FLOAT xdiv = rcCell.Width() / nCharArray * 1000.0f / rcBBox.Width();
- FX_FLOAT ydiv = - rcCell.Height() * 1000.0f / rcBBox.Height();
-
- return xdiv < ydiv ? xdiv : ydiv;
- }
-
- return 0.0f;
-}
-
-void CPWL_Edit::SetCharArray(FX_INT32 nCharArray)
-{
- if (HasFlag(PES_CHARARRAY) && nCharArray > 0)
- {
- m_pEdit->SetCharArray(nCharArray);
- m_pEdit->SetTextOverflow(TRUE);
-
- if (HasFlag(PWS_AUTOFONTSIZE))
- {
- if (IFX_Edit_FontMap* pFontMap = this->GetFontMap())
- {
- FX_FLOAT fFontSize = GetCharArrayAutoFontSize(pFontMap->GetPDFFont(0), GetClientRect(), nCharArray);
- if (fFontSize > 0.0f)
- {
- m_pEdit->SetAutoFontSize(FALSE);
- m_pEdit->SetFontSize(fFontSize);
- }
- }
- }
- }
-}
-
-void CPWL_Edit::SetLimitChar(FX_INT32 nLimitChar)
-{
- m_pEdit->SetLimitChar(nLimitChar);
-}
-
-void CPWL_Edit::ReplaceSel(FX_LPCWSTR csText)
-{
- m_pEdit->Clear();
- m_pEdit->InsertText(csText);
-}
-
-CPDF_Rect CPWL_Edit::GetFocusRect() const
-{
- return CPDF_Rect();
-}
-
-void CPWL_Edit::ShowVScrollBar(FX_BOOL bShow)
-{
- if (CPWL_ScrollBar * pScroll = GetVScrollBar())
- {
- if (bShow)
- {
- if (!pScroll->IsVisible())
- {
- pScroll->SetVisible(TRUE);
- CPDF_Rect rcWindow = GetWindowRect();
- m_rcOldWindow = rcWindow;
- rcWindow.right += PWL_SCROLLBAR_WIDTH;
- Move(rcWindow, TRUE, TRUE);
- }
- }
- else
- {
- if (pScroll->IsVisible())
- {
- pScroll->SetVisible(FALSE);
- Move(m_rcOldWindow, TRUE, TRUE);
- }
- }
- }
-}
-
-FX_BOOL CPWL_Edit::IsVScrollBarVisible() const
-{
- if (CPWL_ScrollBar * pScroll = GetVScrollBar())
- {
- return pScroll->IsVisible();
- }
-
- return FALSE;
-}
-
-void CPWL_Edit::EnableSpellCheck(FX_BOOL bEnabled)
-{
- if (bEnabled)
- AddFlag(PES_SPELLCHECK);
- else
- RemoveFlag(PES_SPELLCHECK);
-}
-
-FX_BOOL CPWL_Edit::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)
-{
- if (m_bMouseDown) return TRUE;
-
- if (nChar == FWL_VKEY_Delete)
- {
- if (m_pFillerNotify)
- {
- FX_BOOL bRC = TRUE;
- FX_BOOL bExit = FALSE;
- CFX_WideString strChange;
- CFX_WideString strChangeEx;
-
- int nSelStart = 0;
- int nSelEnd = 0;
- GetSel(nSelStart, nSelEnd);
-
- if (nSelStart == nSelEnd)
- nSelEnd = nSelStart + 1;
- m_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), FWL_VKEY_Delete, strChange, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, nFlag);
- if (!bRC) return FALSE;
- if (bExit) return FALSE;
- }
- }
-
- FX_BOOL bRet = CPWL_EditCtrl::OnKeyDown(nChar, nFlag);
-
- if (nChar == FWL_VKEY_Delete)
- {
- if (m_pFillerNotify)
- {
- FX_BOOL bExit = FALSE;
- m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,nFlag);
- if (bExit) return FALSE;
- }
- }
-
- //In case of implementation swallow the OnKeyDown event.
- if(IsProceedtoOnChar(nChar, nFlag))
- return TRUE;
-
- return bRet;
-}
-
-/**
-*In case of implementation swallow the OnKeyDown event.
-*If the event is swallowed, implementation may do other unexpected things, which is not the control means to do.
-*/
-FX_BOOL CPWL_Edit::IsProceedtoOnChar(FX_WORD nKeyCode, FX_DWORD nFlag)
-{
-
- FX_BOOL bCtrl = IsCTRLpressed(nFlag);
- FX_BOOL bAlt = IsALTpressed(nFlag);
- if(bCtrl && !bAlt)
- {
- //hot keys for edit control.
- switch(nKeyCode)
- {
- case 'C':
- case 'V':
- case 'X':
- case 'A':
- case 'Z':
- return TRUE;
- default:
- break;
- }
- }
- //control characters.
- switch(nKeyCode)
- {
- case FWL_VKEY_Escape:
- case FWL_VKEY_Back:
- case FWL_VKEY_Return:
- case FWL_VKEY_Space:
- return TRUE;
- default:
- break;
- }
- return FALSE;
-
-}
-
-FX_BOOL CPWL_Edit::OnChar(FX_WORD nChar, FX_DWORD nFlag)
-{
- if (m_bMouseDown) return TRUE;
-
- FX_BOOL bRC = TRUE;
- FX_BOOL bExit = FALSE;
-
- FX_BOOL bCtrl = IsCTRLpressed(nFlag);
- if (!bCtrl)
- {
- if (m_pFillerNotify)
- {
- CFX_WideString swChange;
- FX_INT32 nKeyCode;
-
- int nSelStart = 0;
- int nSelEnd = 0;
- GetSel(nSelStart, nSelEnd);
-
- switch (nChar)
- {
- case FWL_VKEY_Back:
- nKeyCode = nChar;
- if (nSelStart == nSelEnd)
- nSelStart = nSelEnd - 1;
- break;
- case FWL_VKEY_Return:
- nKeyCode = nChar;
- break;
- default:
- nKeyCode = 0;
- swChange += nChar;
- break;
- }
-
- CFX_WideString strChangeEx;
- m_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), nKeyCode, swChange, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, nFlag);
- }
- }
-
- if (!bRC) return TRUE;
- if (bExit) return FALSE;
-
- if (IFX_Edit_FontMap * pFontMap = GetFontMap())
- {
- FX_INT32 nOldCharSet = GetCharSet();
- FX_INT32 nNewCharSet = pFontMap->CharSetFromUnicode(nChar, DEFAULT_CHARSET);
- if(nOldCharSet != nNewCharSet)
- {
- SetCharSet(nNewCharSet);
- }
- }
- FX_BOOL bRet = CPWL_EditCtrl::OnChar(nChar,nFlag);
-
- if (!bCtrl)
- {
- if (m_pFillerNotify)
- {
- m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,nFlag);
- if (bExit) return FALSE;
- }
- }
-
- return bRet;
-}
-
-FX_BOOL CPWL_Edit::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)
-{
- if (HasFlag(PES_MULTILINE))
- {
- CPDF_Point ptScroll = GetScrollPos();
-
- if (zDelta > 0)
- {
- ptScroll.y += this->GetFontSize();
- }
- else
- {
- ptScroll.y -= this->GetFontSize();
- }
- this->SetScrollPos(ptScroll);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-void CPWL_Edit::OnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)
-{
- if (HasFlag(PES_SPELLCHECK))
- {
- m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));
- }
-
- if (m_pEditNotify)
- {
- m_pEditNotify->OnInsertReturn(place, oldplace);
- }
-}
-
-void CPWL_Edit::OnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)
-{
- if (HasFlag(PES_SPELLCHECK))
- {
- m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));
- }
-
- if (m_pEditNotify)
- {
- m_pEditNotify->OnBackSpace(place, oldplace);
- }
-}
-
-void CPWL_Edit::OnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)
-{
- if (HasFlag(PES_SPELLCHECK))
- {
- m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));
- }
-
- if (m_pEditNotify)
- {
- m_pEditNotify->OnDelete(place, oldplace);
- }
-}
-
-void CPWL_Edit::OnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)
-{
- if (HasFlag(PES_SPELLCHECK))
- {
- m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));
- }
-
- if (m_pEditNotify)
- {
- m_pEditNotify->OnClear(place, oldplace);
- }
-}
-
-void CPWL_Edit::OnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)
-{
- if (HasFlag(PES_SPELLCHECK))
- {
- m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));
- }
-
- if (m_pEditNotify)
- {
- m_pEditNotify->OnInsertWord(place, oldplace);
- }
-}
-
-void CPWL_Edit::OnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)
-{
-}
-
-void CPWL_Edit::OnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)
-{
- if (HasFlag(PES_SPELLCHECK))
- {
- m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));
- }
-
- if (m_pEditNotify)
- {
- m_pEditNotify->OnInsertText(place, oldplace);
- }
-}
-
-void CPWL_Edit::OnAddUndo(IFX_Edit_UndoItem* pUndoItem)
-{
- if (m_pEditNotify)
- {
- m_pEditNotify->OnAddUndo(this);
- }
-}
-
-CPVT_WordRange CPWL_Edit::CombineWordRange(const CPVT_WordRange& wr1, const CPVT_WordRange& wr2)
-{
- CPVT_WordRange wrRet;
-
- if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0)
- {
- wrRet.BeginPos = wr1.BeginPos;
- }
- else
- {
- wrRet.BeginPos = wr2.BeginPos;
- }
-
- if (wr1.EndPos.WordCmp(wr2.EndPos) < 0)
- {
- wrRet.EndPos = wr2.EndPos;
- }
- else
- {
- wrRet.EndPos = wr1.EndPos;
- }
-
- return wrRet;
-}
-
-CPVT_WordRange CPWL_Edit::GetLatinWordsRange(const CPDF_Point& point) const
-{
- return GetSameWordsRange(m_pEdit->SearchWordPlace(point), TRUE, FALSE);
-}
-
-CPVT_WordRange CPWL_Edit::GetLatinWordsRange(const CPVT_WordPlace & place) const
-{
- return GetSameWordsRange(place, TRUE, FALSE);
-}
-
-CPVT_WordRange CPWL_Edit::GetArabicWordsRange(const CPVT_WordPlace & place) const
-{
- return GetSameWordsRange(place, FALSE, TRUE);
-}
-
-#define PWL_ISARABICWORD(word) ((word >= 0x0600 && word <= 0x06FF) || (word >= 0xFB50 && word <= 0xFEFC))
-
-CPVT_WordRange CPWL_Edit::GetSameWordsRange(const CPVT_WordPlace & place, FX_BOOL bLatin, FX_BOOL bArabic) const
-{
- CPVT_WordRange range;
-
- if (IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator())
- {
- CPVT_Word wordinfo;
- CPVT_WordPlace wpStart(place),wpEnd(place);
- pIterator->SetAt(place);
-
- if (bLatin)
- {
- while (pIterator->NextWord())
- {
- if (pIterator->GetWord(wordinfo) && FX_EDIT_ISLATINWORD(wordinfo.Word))
- {
- wpEnd = pIterator->GetAt();
- continue;
- }
- else
- break;
- };
- }
- else if (bArabic)
- {
- while (pIterator->NextWord())
- {
- if (pIterator->GetWord(wordinfo) && PWL_ISARABICWORD(wordinfo.Word))
- {
- wpEnd = pIterator->GetAt();
- continue;
- }
- else
- break;
- };
- }
-
- pIterator->SetAt(place);
-
- if (bLatin)
- {
- do
- {
- if (pIterator->GetWord(wordinfo) && FX_EDIT_ISLATINWORD(wordinfo.Word))
- {
- continue;
- }
- else
- {
- wpStart = pIterator->GetAt();
- break;
- }
- }
- while (pIterator->PrevWord());
- }
- else if (bArabic)
- {
- do
- {
- if (pIterator->GetWord(wordinfo) && PWL_ISARABICWORD(wordinfo.Word))
- {
- continue;
- }
- else
- {
- wpStart = pIterator->GetAt();
- break;
- }
- }
- while (pIterator->PrevWord());
- }
-
- range.Set(wpStart,wpEnd);
- }
-
- return range;
-}
-
-void CPWL_Edit::AjustArabicWords(const CPVT_WordRange& wr)
-{
-}
-
-void CPWL_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects,
- const CPDF_Point& ptOffset, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray)
-{
- IFX_Edit::GeneratePageObjects(pPageObjects, m_pEdit, ptOffset, NULL, CPWL_Utils::PWLColorToFXColor(GetTextColor(),GetTransparency()), ObjArray);
-}
-
-void CPWL_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects,
- const CPDF_Point& ptOffset)
-{
- CFX_ArrayTemplate<CPDF_TextObject*> ObjArray;
- IFX_Edit::GeneratePageObjects(pPageObjects, m_pEdit, ptOffset, NULL, CPWL_Utils::PWLColorToFXColor(GetTextColor(),GetTransparency()), ObjArray);
-}
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_EditCtrl.h" +#include "../../include/pdfwindow/PWL_Edit.h" +#include "../../include/pdfwindow/PWL_ScrollBar.h" +#include "../../include/pdfwindow/PWL_Utils.h" +#include "../../include/pdfwindow/PWL_Caret.h" +#include "../../include/pdfwindow/PWL_FontMap.h" + +/* ---------------------------- CPWL_Edit ------------------------------ */ + +CPWL_Edit::CPWL_Edit() : m_pFillerNotify(NULL), + m_pSpellCheck(NULL), + m_bFocus(FALSE) +{ + m_pFormFiller = NULL; +} + +CPWL_Edit::~CPWL_Edit() +{ + ASSERT(m_bFocus == FALSE); +} + +CFX_ByteString CPWL_Edit::GetClassName() const +{ + return PWL_CLASSNAME_EDIT; +} + +void CPWL_Edit::OnDestroy() +{ +} + +void CPWL_Edit::SetText(FX_LPCWSTR csText) +{ + CFX_WideString swText = csText; + + if (HasFlag(PES_RICH)) + { + CFX_ByteString sValue = CFX_ByteString::FromUnicode(swText); + + if (CXML_Element * pXML = CXML_Element::Parse((FX_LPCSTR)sValue,sValue.GetLength())) + { + FX_INT32 nCount = pXML->CountChildren(); + FX_BOOL bFirst = TRUE; + + swText.Empty(); + + for (FX_INT32 i=0; i<nCount; i++) + { + if (CXML_Element * pSubElement = pXML->GetElement(i)) + { + CFX_ByteString tag=pSubElement->GetTagName(); + if (tag.EqualNoCase("p")) + { + int nChild = pSubElement->CountChildren(); + CFX_WideString swSection; + for(FX_INT32 j=0; j<nChild; j++) + { + swSection += pSubElement->GetContent(j); + } + + if (bFirst)bFirst = FALSE; + else + swText += FWL_VKEY_Return; + swText += swSection; + } + } + } + + delete pXML; + } + } + + m_pEdit->SetText(swText); +} + +void CPWL_Edit::RePosChildWnd() +{ + if (CPWL_ScrollBar * pVSB = this->GetVScrollBar()) + { + //if (pVSB->IsVisible()) + { + CPDF_Rect rcWindow = m_rcOldWindow; + CPDF_Rect rcVScroll = CPDF_Rect(rcWindow.right, + rcWindow.bottom, + rcWindow.right + PWL_SCROLLBAR_WIDTH, + rcWindow.top); + pVSB->Move(rcVScroll, TRUE, FALSE); + } + } + + if (m_pEditCaret && !HasFlag(PES_TEXTOVERFLOW)) + m_pEditCaret->SetClipRect(CPWL_Utils::InflateRect(GetClientRect(),1.0f)); //+1 for caret beside border + + CPWL_EditCtrl::RePosChildWnd(); +} + +CPDF_Rect CPWL_Edit::GetClientRect() const +{ + CPDF_Rect rcClient = CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth())); + + if (CPWL_ScrollBar * pVSB = this->GetVScrollBar()) + { + if (pVSB->IsVisible()) + { + rcClient.right -= PWL_SCROLLBAR_WIDTH; + } + } + + return rcClient; +} + +void CPWL_Edit::SetAlignFormatH(PWL_EDIT_ALIGNFORMAT_H nFormat, FX_BOOL bPaint/* = TRUE*/) +{ + m_pEdit->SetAlignmentH((FX_INT32)nFormat, bPaint); +} + +void CPWL_Edit::SetAlignFormatV(PWL_EDIT_ALIGNFORMAT_V nFormat, FX_BOOL bPaint/* = TRUE*/) +{ + m_pEdit->SetAlignmentV((FX_INT32)nFormat, bPaint); +} + +FX_BOOL CPWL_Edit::CanSelectAll() const +{ + return GetSelectWordRange() != m_pEdit->GetWholeWordRange(); +} + +FX_BOOL CPWL_Edit::CanClear() const +{ + return !IsReadOnly() && m_pEdit->IsSelected(); +} + +FX_BOOL CPWL_Edit::CanCopy() const +{ + return !HasFlag(PES_PASSWORD) && !HasFlag(PES_NOREAD) && m_pEdit->IsSelected(); +} + +FX_BOOL CPWL_Edit::CanCut() const +{ + return CanCopy() && !IsReadOnly(); +} + +FX_BOOL CPWL_Edit::CanPaste() const +{ + if (IsReadOnly()) return FALSE; + + CFX_WideString swClipboard; + if (IFX_SystemHandler* pSH = GetSystemHandler()) + swClipboard = pSH->GetClipboardText(GetAttachedHWnd()); + + return !swClipboard.IsEmpty(); +} + +void CPWL_Edit::CopyText() +{ + if (!CanCopy()) return; + + CFX_WideString str = m_pEdit->GetSelText(); + + if (IFX_SystemHandler* pSH = GetSystemHandler()) + pSH->SetClipboardText(GetAttachedHWnd(), str); +} + +void CPWL_Edit::PasteText() +{ + if (!CanPaste()) return; + + CFX_WideString swClipboard; + if (IFX_SystemHandler* pSH = GetSystemHandler()) + swClipboard = pSH->GetClipboardText(GetAttachedHWnd()); + + if (m_pFillerNotify) + { + FX_BOOL bRC = TRUE; + FX_BOOL bExit = FALSE; + CFX_WideString strChangeEx; + int nSelStart = 0; + int nSelEnd = 0; + GetSel(nSelStart, nSelEnd); + m_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), 0 , swClipboard, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, 0); + if (!bRC) return; + if (bExit) return; + } + + if (swClipboard.GetLength() > 0) + { + Clear(); + InsertText(swClipboard); + } + + if (m_pFillerNotify) + { + FX_BOOL bExit = FALSE; + m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,0); + if (bExit) return; + } +} + +void CPWL_Edit::CutText() +{ + if (!CanCut()) return; + + CFX_WideString str = m_pEdit->GetSelText(); + + if (IFX_SystemHandler* pSH = GetSystemHandler()) + pSH->SetClipboardText(GetAttachedHWnd(), str); + + m_pEdit->Clear(); +} + +void CPWL_Edit::OnCreated() +{ + CPWL_EditCtrl::OnCreated(); + + if (CPWL_ScrollBar * pScroll = GetVScrollBar()) + { + pScroll->RemoveFlag(PWS_AUTOTRANSPARENT); + pScroll->SetTransparency(255); + } + + SetParamByFlag(); + + m_rcOldWindow = GetWindowRect(); + + m_pEdit->SetOprNotify(this); + m_pEdit->EnableOprNotify(TRUE); +} + +void CPWL_Edit::SetParamByFlag() +{ + if (HasFlag(PES_RIGHT)) + { + m_pEdit->SetAlignmentH(2, FALSE); + } + else if (HasFlag(PES_MIDDLE)) + { + m_pEdit->SetAlignmentH(1, FALSE); + } + else + { + m_pEdit->SetAlignmentH(0, FALSE); + } + + if (HasFlag(PES_BOTTOM)) + { + m_pEdit->SetAlignmentV(2, FALSE); + } + else if (HasFlag(PES_CENTER)) + { + m_pEdit->SetAlignmentV(1, FALSE); + } + else + { + m_pEdit->SetAlignmentV(0, FALSE); + } + + if (HasFlag(PES_PASSWORD)) + { + m_pEdit->SetPasswordChar('*', FALSE); + } + + m_pEdit->SetMultiLine(HasFlag(PES_MULTILINE), FALSE); + m_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN), FALSE); + m_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE), FALSE); + m_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL), FALSE); + m_pEdit->EnableUndo(HasFlag(PES_UNDO)); + + if (HasFlag(PES_TEXTOVERFLOW)) + { + SetClipRect(CPDF_Rect(0.0f,0.0f,0.0f,0.0f)); + m_pEdit->SetTextOverflow(TRUE, FALSE); + } + else + { + if (m_pEditCaret) + { + m_pEditCaret->SetClipRect(CPWL_Utils::InflateRect(GetClientRect(),1.0f)); //+1 for caret beside border + } + } + + if (HasFlag(PES_SPELLCHECK)) + { + m_pSpellCheck = GetCreationParam().pSpellCheck; + } +} + +void CPWL_Edit::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream) +{ + CPWL_Wnd::GetThisAppearanceStream(sAppStream); + + CPDF_Rect rcClient = GetClientRect(); + CFX_ByteTextBuf sLine; + + FX_INT32 nCharArray = m_pEdit->GetCharArray(); + + if (nCharArray > 0) + { + switch (GetBorderStyle()) + { + case PBS_SOLID: + { + sLine << "q\n" << GetBorderWidth() << " w\n" + << CPWL_Utils::GetColorAppStream(GetBorderColor(),FALSE) << " 2 J 0 j\n"; + + for (FX_INT32 i=1;i<nCharArray;i++) + { + sLine << rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << " " + << rcClient.bottom << " m\n" + << rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << " " + << rcClient.top << " l S\n"; + } + + sLine << "Q\n"; + } + break; + case PBS_DASH: + { + sLine << "q\n" << GetBorderWidth() << " w\n" + << CPWL_Utils::GetColorAppStream(GetBorderColor(),FALSE) << " 2 J 0 j\n" + << "[" << GetBorderDash().nDash << " " + << GetBorderDash().nGap << "] " + << GetBorderDash().nPhase << " d\n"; + + for (FX_INT32 i=1;i<nCharArray;i++) + { + sLine << rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << " " + << rcClient.bottom << " m\n" + << rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << " " + << rcClient.top << " l S\n"; + } + + sLine << "Q\n"; + } + break; + } + } + + sAppStream << sLine; + + CFX_ByteTextBuf sText; + + CPDF_Point ptOffset = CPDF_Point(0.0f,0.0f); + + CPVT_WordRange wrWhole = m_pEdit->GetWholeWordRange(); + CPVT_WordRange wrSelect = GetSelectWordRange(); + CPVT_WordRange wrVisible = (HasFlag(PES_TEXTOVERFLOW) ? wrWhole : m_pEdit->GetVisibleWordRange()); + CPVT_WordRange wrSelBefore(wrWhole.BeginPos,wrSelect.BeginPos); + CPVT_WordRange wrSelAfter(wrSelect.EndPos,wrWhole.EndPos); + + CPVT_WordRange wrTemp = CPWL_Utils::OverlapWordRange(GetSelectWordRange(),wrVisible); + CFX_ByteString sEditSel = CPWL_Utils::GetEditSelAppStream(m_pEdit, ptOffset, + &wrTemp); + + if (sEditSel.GetLength() > 0) + sText << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELBACKCOLOR) << sEditSel ; + + wrTemp = CPWL_Utils::OverlapWordRange(wrVisible,wrSelBefore); + CFX_ByteString sEditBefore = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset, + &wrTemp, !HasFlag(PES_CHARARRAY), m_pEdit->GetPasswordChar()); + + if (sEditBefore.GetLength() > 0) + sText << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEditBefore << "ET\n"; + + wrTemp = CPWL_Utils::OverlapWordRange(wrVisible,wrSelect); + CFX_ByteString sEditMid = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset, + &wrTemp, !HasFlag(PES_CHARARRAY), m_pEdit->GetPasswordChar()); + + if (sEditMid.GetLength() > 0) + sText << "BT\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY,1)) << sEditMid << "ET\n"; + + wrTemp = CPWL_Utils::OverlapWordRange(wrVisible,wrSelAfter); + CFX_ByteString sEditAfter = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset, + &wrTemp, !HasFlag(PES_CHARARRAY), m_pEdit->GetPasswordChar()); + + if (sEditAfter.GetLength() > 0) + sText << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEditAfter<< "ET\n"; + + if (HasFlag(PES_SPELLCHECK)) + { + CFX_ByteString sSpellCheck = CPWL_Utils::GetSpellCheckAppStream(m_pEdit, m_pSpellCheck, ptOffset, &wrVisible); + if (sSpellCheck.GetLength() > 0) + sText << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_RGB,1,0,0),FALSE) << sSpellCheck; + } + + if (sText.GetLength() > 0) + { + CPDF_Rect rcClient = this->GetClientRect(); + sAppStream << "q\n/Tx BMC\n"; + + if (!HasFlag(PES_TEXTOVERFLOW)) + sAppStream << rcClient.left << " " << rcClient.bottom << " " + << rcClient.right - rcClient.left << " " << rcClient.top - rcClient.bottom << " re W n\n"; + + sAppStream << sText; + + sAppStream << "EMC\nQ\n"; + } +} + +void CPWL_Edit::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device); + + CPDF_Rect rcClient = GetClientRect(); + CFX_ByteTextBuf sLine; + + FX_INT32 nCharArray = m_pEdit->GetCharArray(); + + if (nCharArray > 0) + { + switch (GetBorderStyle()) + { + case PBS_SOLID: + { + CFX_GraphStateData gsd; + gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth(); + + CFX_PathData path; + path.SetPointCount((nCharArray-1)*2); + + for (FX_INT32 i=0; i<nCharArray-1; i++) + { + path.SetPoint(i*2, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1), + rcClient.bottom, FXPT_MOVETO); + path.SetPoint(i*2+1, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1), + rcClient.top, FXPT_LINETO); + } + if (path.GetPointCount() > 0) + pDevice->DrawPath(&path, pUser2Device, &gsd,0, + CPWL_Utils::PWLColorToFXColor(GetBorderColor(),255), FXFILL_ALTERNATE); + } + break; + case PBS_DASH: + { + CFX_GraphStateData gsd; + gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth(); + + gsd.SetDashCount(2); + gsd.m_DashArray[0] = (FX_FLOAT)GetBorderDash().nDash; + gsd.m_DashArray[1] = (FX_FLOAT)GetBorderDash().nGap; + gsd.m_DashPhase = (FX_FLOAT)GetBorderDash().nPhase; + + CFX_PathData path; + path.SetPointCount((nCharArray-1)*2); + + for (FX_INT32 i=0; i<nCharArray-1; i++) + { + path.SetPoint(i*2, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1), + rcClient.bottom, FXPT_MOVETO); + path.SetPoint(i*2+1, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1), + rcClient.top, FXPT_LINETO); + } + if (path.GetPointCount() > 0) + pDevice->DrawPath(&path, pUser2Device, &gsd,0, + CPWL_Utils::PWLColorToFXColor(GetBorderColor(),255), FXFILL_ALTERNATE); + } + break; + } + } + + CPDF_Rect rcClip; + CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange(); + CPVT_WordRange* pRange = NULL; + + if (!HasFlag(PES_TEXTOVERFLOW)) + { + rcClip = GetClientRect(); + pRange = &wrRange; + } +IFX_SystemHandler* pSysHandler = GetSystemHandler(); + IFX_Edit::DrawEdit(pDevice,pUser2Device,m_pEdit, + CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()), + CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(),this->GetTransparency()), + rcClip,CPDF_Point(0.0f,0.0f),pRange, pSysHandler, m_pFormFiller); + + if (HasFlag(PES_SPELLCHECK)) + { + CPWL_Utils::DrawEditSpellCheck(pDevice,pUser2Device,m_pEdit,rcClip, + CPDF_Point(0.0f,0.0f),pRange, this->GetCreationParam().pSpellCheck); + } +} + +FX_BOOL CPWL_Edit::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonDown(point,nFlag); + + if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point)) + { + if (m_bMouseDown) + this->InvalidateRect(); + + m_bMouseDown = TRUE; + SetCapture(); + + m_pEdit->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + } + + return TRUE; +} + +FX_BOOL CPWL_Edit::OnLButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonDblClk(point, nFlag); + + if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point)) + { + m_pEdit->SelectAll(); + } + + return TRUE; +} + +#define WM_PWLEDIT_UNDO 0x01 +#define WM_PWLEDIT_REDO 0x02 +#define WM_PWLEDIT_CUT 0x03 +#define WM_PWLEDIT_COPY 0x04 +#define WM_PWLEDIT_PASTE 0x05 +#define WM_PWLEDIT_DELETE 0x06 +#define WM_PWLEDIT_SELECTALL 0x07 +#define WM_PWLEDIT_SUGGEST 0x08 + +FX_BOOL CPWL_Edit::OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag) +{ + if (m_bMouseDown) return FALSE; + + CPWL_Wnd::OnRButtonUp(point, nFlag); + + if (!HasFlag(PES_TEXTOVERFLOW) && !ClientHitTest(point)) return TRUE; + + IFX_SystemHandler* pSH = GetSystemHandler(); + if (!pSH) return FALSE; + + this->SetFocus(); + + CPVT_WordRange wrLatin = GetLatinWordsRange(point); + CFX_WideString swLatin = m_pEdit->GetRangeText(wrLatin); + + FX_HMENU hPopup = pSH->CreatePopupMenu(); + if (!hPopup) return FALSE; + + CFX_ByteStringArray sSuggestWords; + CPDF_Point ptPopup = point; + + if (!IsReadOnly()) + { + if (HasFlag(PES_SPELLCHECK) && !swLatin.IsEmpty()) + { + if (m_pSpellCheck) + { + CFX_ByteString sLatin = CFX_ByteString::FromUnicode(swLatin); + + if (!m_pSpellCheck->CheckWord(sLatin)) + { + m_pSpellCheck->SuggestWords(sLatin,sSuggestWords); + + FX_INT32 nSuggest = sSuggestWords.GetSize(); + + for (FX_INT32 nWord=0; nWord<nSuggest; nWord++) + { + pSH->AppendMenuItem(hPopup, WM_PWLEDIT_SUGGEST+nWord, sSuggestWords[nWord].UTF8Decode()); + } + + if (nSuggest > 0) + pSH->AppendMenuItem(hPopup, 0, L""); + + ptPopup = GetWordRightBottomPoint(wrLatin.EndPos); + } + } + } + } + + IPWL_Provider* pProvider = this->GetProvider(); + + if (HasFlag(PES_UNDO)) + { + pSH->AppendMenuItem(hPopup, WM_PWLEDIT_UNDO, + pProvider ? pProvider->LoadPopupMenuString(0) : L"&Undo"); + pSH->AppendMenuItem(hPopup, WM_PWLEDIT_REDO, + pProvider ? pProvider->LoadPopupMenuString(1) : L"&Redo"); + pSH->AppendMenuItem(hPopup, 0, L""); + + if (!m_pEdit->CanUndo()) + pSH->EnableMenuItem(hPopup, WM_PWLEDIT_UNDO, FALSE); + if (!m_pEdit->CanRedo()) + pSH->EnableMenuItem(hPopup, WM_PWLEDIT_REDO, FALSE); + } + + pSH->AppendMenuItem(hPopup, WM_PWLEDIT_CUT, + pProvider ? pProvider->LoadPopupMenuString(2) : L"Cu&t"); + pSH->AppendMenuItem(hPopup, WM_PWLEDIT_COPY, + pProvider ? pProvider->LoadPopupMenuString(3) : L"&Copy"); + pSH->AppendMenuItem(hPopup, WM_PWLEDIT_PASTE, + pProvider ? pProvider->LoadPopupMenuString(4) : L"&Paste"); + pSH->AppendMenuItem(hPopup, WM_PWLEDIT_DELETE, + pProvider ? pProvider->LoadPopupMenuString(5) : L"&Delete"); + + CFX_WideString swText = pSH->GetClipboardText(this->GetAttachedHWnd()); + if (swText.IsEmpty()) + pSH->EnableMenuItem(hPopup, WM_PWLEDIT_PASTE, FALSE); + + if (!m_pEdit->IsSelected()) + { + pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE); + pSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE); + pSH->EnableMenuItem(hPopup, WM_PWLEDIT_DELETE, FALSE); + } + + if (IsReadOnly()) + { + pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE); + pSH->EnableMenuItem(hPopup, WM_PWLEDIT_DELETE, FALSE); + pSH->EnableMenuItem(hPopup, WM_PWLEDIT_PASTE, FALSE); + } + + if (HasFlag(PES_PASSWORD)) + { + pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE); + pSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE); + } + + if (HasFlag(PES_NOREAD)) + { + pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE); + pSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE); + } + + pSH->AppendMenuItem(hPopup, 0, L""); + pSH->AppendMenuItem(hPopup, WM_PWLEDIT_SELECTALL, + pProvider ? pProvider->LoadPopupMenuString(6) : L"&Select All"); + + if (m_pEdit->GetTotalWords() == 0) + { + pSH->EnableMenuItem(hPopup, WM_PWLEDIT_SELECTALL, FALSE); + } + + FX_INT32 x, y; + PWLtoWnd(ptPopup, x, y); + pSH->ClientToScreen(GetAttachedHWnd(), x, y); + pSH->SetCursor(FXCT_ARROW); + FX_INT32 nCmd = pSH->TrackPopupMenu(hPopup, + x, + y, + GetAttachedHWnd()); + + + switch (nCmd) + { + case WM_PWLEDIT_UNDO: + Undo(); + break; + case WM_PWLEDIT_REDO: + Redo(); + break; + case WM_PWLEDIT_CUT: + this->CutText(); + break; + case WM_PWLEDIT_COPY: + this->CopyText(); + break; + case WM_PWLEDIT_PASTE: + this->PasteText(); + break; + case WM_PWLEDIT_DELETE: + this->Clear(); + break; + case WM_PWLEDIT_SELECTALL: + this->SelectAll(); + break; + case WM_PWLEDIT_SUGGEST + 0: + SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos)); + ReplaceSel(sSuggestWords[0].UTF8Decode()); + break; + case WM_PWLEDIT_SUGGEST + 1: + SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos)); + ReplaceSel(sSuggestWords[1].UTF8Decode()); + break; + case WM_PWLEDIT_SUGGEST + 2: + SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos)); + ReplaceSel(sSuggestWords[2].UTF8Decode()); + break; + case WM_PWLEDIT_SUGGEST + 3: + SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos)); + ReplaceSel(sSuggestWords[3].UTF8Decode()); + break; + case WM_PWLEDIT_SUGGEST + 4: + SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos)); + ReplaceSel(sSuggestWords[4].UTF8Decode()); + break; + default: + break; + } + + pSH->DestroyMenu(hPopup); + + return TRUE; +} + +void CPWL_Edit::OnSetFocus() +{ + SetEditCaret(TRUE); + + if (!IsReadOnly()) + { + if (IPWL_FocusHandler* pFocusHandler = GetFocusHandler()) + pFocusHandler->OnSetFocus(this); + } + + m_bFocus = TRUE; +} + +void CPWL_Edit::OnKillFocus() +{ + ShowVScrollBar(FALSE); + + m_pEdit->SelectNone(); + SetCaret(FALSE, CPDF_Point(0.0f,0.0f), CPDF_Point(0.0f,0.0f)); + + SetCharSet(0); + + if (!IsReadOnly()) + { + if (IPWL_FocusHandler* pFocusHandler = GetFocusHandler()) + pFocusHandler->OnKillFocus(this); + } + + m_bFocus = FALSE; +} + +void CPWL_Edit::SetHorzScale(FX_INT32 nHorzScale, FX_BOOL bPaint/* = TRUE*/) +{ + m_pEdit->SetHorzScale(nHorzScale, bPaint); +} + +void CPWL_Edit::SetCharSpace(FX_FLOAT fCharSpace, FX_BOOL bPaint/* = TRUE*/) +{ + m_pEdit->SetCharSpace(fCharSpace, bPaint); +} + +void CPWL_Edit::SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint/* = TRUE*/) +{ + m_pEdit->SetLineLeading(fLineLeading, bPaint); +} + +CFX_ByteString CPWL_Edit::GetSelectAppearanceStream(const CPDF_Point & ptOffset) const +{ + CPVT_WordRange wr = GetSelectWordRange(); + return CPWL_Utils::GetEditSelAppStream(m_pEdit,ptOffset,&wr); +} + +CPVT_WordRange CPWL_Edit::GetSelectWordRange() const +{ + if (m_pEdit->IsSelected()) + { + FX_INT32 nStart = -1; + FX_INT32 nEnd = -1; + + m_pEdit->GetSel(nStart, nEnd); + + CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStart); + CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEnd); + + return CPVT_WordRange(wpStart,wpEnd); + } + + return CPVT_WordRange(); +} + +CFX_ByteString CPWL_Edit::GetTextAppearanceStream(const CPDF_Point & ptOffset) const +{ + CFX_ByteTextBuf sRet; + CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit,ptOffset); + + if (sEdit.GetLength() > 0) + { + sRet << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEdit << "ET\n"; + } + + return sRet.GetByteString(); +} + +CFX_ByteString CPWL_Edit::GetCaretAppearanceStream(const CPDF_Point & ptOffset) const +{ + if (m_pEditCaret) + return m_pEditCaret->GetCaretAppearanceStream(ptOffset); + + return CFX_ByteString(); +} + +CPDF_Point CPWL_Edit::GetWordRightBottomPoint(const CPVT_WordPlace& wpWord) +{ + CPDF_Point pt(0.0f, 0.0f); + + if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator()) + { + CPVT_WordPlace wpOld = pIterator->GetAt(); + pIterator->SetAt(wpWord); + CPVT_Word word; + if (pIterator->GetWord(word)) + { + pt = CPDF_Point(word.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent); + } + + pIterator->SetAt(wpOld); + } + + return pt; +} + +FX_BOOL CPWL_Edit::IsTextFull() const +{ + return m_pEdit->IsTextFull(); +} + +FX_FLOAT CPWL_Edit::GetCharArrayAutoFontSize(CPDF_Font* pFont, const CPDF_Rect& rcPlate, FX_INT32 nCharArray) +{ + if (pFont && !pFont->IsStandardFont()) + { + FX_RECT rcBBox; + pFont->GetFontBBox(rcBBox); + + CPDF_Rect rcCell = rcPlate; + FX_FLOAT xdiv = rcCell.Width() / nCharArray * 1000.0f / rcBBox.Width(); + FX_FLOAT ydiv = - rcCell.Height() * 1000.0f / rcBBox.Height(); + + return xdiv < ydiv ? xdiv : ydiv; + } + + return 0.0f; +} + +void CPWL_Edit::SetCharArray(FX_INT32 nCharArray) +{ + if (HasFlag(PES_CHARARRAY) && nCharArray > 0) + { + m_pEdit->SetCharArray(nCharArray); + m_pEdit->SetTextOverflow(TRUE); + + if (HasFlag(PWS_AUTOFONTSIZE)) + { + if (IFX_Edit_FontMap* pFontMap = this->GetFontMap()) + { + FX_FLOAT fFontSize = GetCharArrayAutoFontSize(pFontMap->GetPDFFont(0), GetClientRect(), nCharArray); + if (fFontSize > 0.0f) + { + m_pEdit->SetAutoFontSize(FALSE); + m_pEdit->SetFontSize(fFontSize); + } + } + } + } +} + +void CPWL_Edit::SetLimitChar(FX_INT32 nLimitChar) +{ + m_pEdit->SetLimitChar(nLimitChar); +} + +void CPWL_Edit::ReplaceSel(FX_LPCWSTR csText) +{ + m_pEdit->Clear(); + m_pEdit->InsertText(csText); +} + +CPDF_Rect CPWL_Edit::GetFocusRect() const +{ + return CPDF_Rect(); +} + +void CPWL_Edit::ShowVScrollBar(FX_BOOL bShow) +{ + if (CPWL_ScrollBar * pScroll = GetVScrollBar()) + { + if (bShow) + { + if (!pScroll->IsVisible()) + { + pScroll->SetVisible(TRUE); + CPDF_Rect rcWindow = GetWindowRect(); + m_rcOldWindow = rcWindow; + rcWindow.right += PWL_SCROLLBAR_WIDTH; + Move(rcWindow, TRUE, TRUE); + } + } + else + { + if (pScroll->IsVisible()) + { + pScroll->SetVisible(FALSE); + Move(m_rcOldWindow, TRUE, TRUE); + } + } + } +} + +FX_BOOL CPWL_Edit::IsVScrollBarVisible() const +{ + if (CPWL_ScrollBar * pScroll = GetVScrollBar()) + { + return pScroll->IsVisible(); + } + + return FALSE; +} + +void CPWL_Edit::EnableSpellCheck(FX_BOOL bEnabled) +{ + if (bEnabled) + AddFlag(PES_SPELLCHECK); + else + RemoveFlag(PES_SPELLCHECK); +} + +FX_BOOL CPWL_Edit::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag) +{ + if (m_bMouseDown) return TRUE; + + if (nChar == FWL_VKEY_Delete) + { + if (m_pFillerNotify) + { + FX_BOOL bRC = TRUE; + FX_BOOL bExit = FALSE; + CFX_WideString strChange; + CFX_WideString strChangeEx; + + int nSelStart = 0; + int nSelEnd = 0; + GetSel(nSelStart, nSelEnd); + + if (nSelStart == nSelEnd) + nSelEnd = nSelStart + 1; + m_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), FWL_VKEY_Delete, strChange, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, nFlag); + if (!bRC) return FALSE; + if (bExit) return FALSE; + } + } + + FX_BOOL bRet = CPWL_EditCtrl::OnKeyDown(nChar, nFlag); + + if (nChar == FWL_VKEY_Delete) + { + if (m_pFillerNotify) + { + FX_BOOL bExit = FALSE; + m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,nFlag); + if (bExit) return FALSE; + } + } + + //In case of implementation swallow the OnKeyDown event. + if(IsProceedtoOnChar(nChar, nFlag)) + return TRUE; + + return bRet; +} + +/** +*In case of implementation swallow the OnKeyDown event. +*If the event is swallowed, implementation may do other unexpected things, which is not the control means to do. +*/ +FX_BOOL CPWL_Edit::IsProceedtoOnChar(FX_WORD nKeyCode, FX_DWORD nFlag) +{ + + FX_BOOL bCtrl = IsCTRLpressed(nFlag); + FX_BOOL bAlt = IsALTpressed(nFlag); + if(bCtrl && !bAlt) + { + //hot keys for edit control. + switch(nKeyCode) + { + case 'C': + case 'V': + case 'X': + case 'A': + case 'Z': + return TRUE; + default: + break; + } + } + //control characters. + switch(nKeyCode) + { + case FWL_VKEY_Escape: + case FWL_VKEY_Back: + case FWL_VKEY_Return: + case FWL_VKEY_Space: + return TRUE; + default: + break; + } + return FALSE; + +} + +FX_BOOL CPWL_Edit::OnChar(FX_WORD nChar, FX_DWORD nFlag) +{ + if (m_bMouseDown) return TRUE; + + FX_BOOL bRC = TRUE; + FX_BOOL bExit = FALSE; + + FX_BOOL bCtrl = IsCTRLpressed(nFlag); + if (!bCtrl) + { + if (m_pFillerNotify) + { + CFX_WideString swChange; + FX_INT32 nKeyCode; + + int nSelStart = 0; + int nSelEnd = 0; + GetSel(nSelStart, nSelEnd); + + switch (nChar) + { + case FWL_VKEY_Back: + nKeyCode = nChar; + if (nSelStart == nSelEnd) + nSelStart = nSelEnd - 1; + break; + case FWL_VKEY_Return: + nKeyCode = nChar; + break; + default: + nKeyCode = 0; + swChange += nChar; + break; + } + + CFX_WideString strChangeEx; + m_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), nKeyCode, swChange, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, nFlag); + } + } + + if (!bRC) return TRUE; + if (bExit) return FALSE; + + if (IFX_Edit_FontMap * pFontMap = GetFontMap()) + { + FX_INT32 nOldCharSet = GetCharSet(); + FX_INT32 nNewCharSet = pFontMap->CharSetFromUnicode(nChar, DEFAULT_CHARSET); + if(nOldCharSet != nNewCharSet) + { + SetCharSet(nNewCharSet); + } + } + FX_BOOL bRet = CPWL_EditCtrl::OnChar(nChar,nFlag); + + if (!bCtrl) + { + if (m_pFillerNotify) + { + m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,nFlag); + if (bExit) return FALSE; + } + } + + return bRet; +} + +FX_BOOL CPWL_Edit::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag) +{ + if (HasFlag(PES_MULTILINE)) + { + CPDF_Point ptScroll = GetScrollPos(); + + if (zDelta > 0) + { + ptScroll.y += this->GetFontSize(); + } + else + { + ptScroll.y -= this->GetFontSize(); + } + this->SetScrollPos(ptScroll); + + return TRUE; + } + + return FALSE; +} + +void CPWL_Edit::OnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) +{ + if (HasFlag(PES_SPELLCHECK)) + { + m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place))); + } + + if (m_pEditNotify) + { + m_pEditNotify->OnInsertReturn(place, oldplace); + } +} + +void CPWL_Edit::OnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) +{ + if (HasFlag(PES_SPELLCHECK)) + { + m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place))); + } + + if (m_pEditNotify) + { + m_pEditNotify->OnBackSpace(place, oldplace); + } +} + +void CPWL_Edit::OnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) +{ + if (HasFlag(PES_SPELLCHECK)) + { + m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place))); + } + + if (m_pEditNotify) + { + m_pEditNotify->OnDelete(place, oldplace); + } +} + +void CPWL_Edit::OnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) +{ + if (HasFlag(PES_SPELLCHECK)) + { + m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place))); + } + + if (m_pEditNotify) + { + m_pEditNotify->OnClear(place, oldplace); + } +} + +void CPWL_Edit::OnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) +{ + if (HasFlag(PES_SPELLCHECK)) + { + m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place))); + } + + if (m_pEditNotify) + { + m_pEditNotify->OnInsertWord(place, oldplace); + } +} + +void CPWL_Edit::OnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) +{ +} + +void CPWL_Edit::OnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) +{ + if (HasFlag(PES_SPELLCHECK)) + { + m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place))); + } + + if (m_pEditNotify) + { + m_pEditNotify->OnInsertText(place, oldplace); + } +} + +void CPWL_Edit::OnAddUndo(IFX_Edit_UndoItem* pUndoItem) +{ + if (m_pEditNotify) + { + m_pEditNotify->OnAddUndo(this); + } +} + +CPVT_WordRange CPWL_Edit::CombineWordRange(const CPVT_WordRange& wr1, const CPVT_WordRange& wr2) +{ + CPVT_WordRange wrRet; + + if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0) + { + wrRet.BeginPos = wr1.BeginPos; + } + else + { + wrRet.BeginPos = wr2.BeginPos; + } + + if (wr1.EndPos.WordCmp(wr2.EndPos) < 0) + { + wrRet.EndPos = wr2.EndPos; + } + else + { + wrRet.EndPos = wr1.EndPos; + } + + return wrRet; +} + +CPVT_WordRange CPWL_Edit::GetLatinWordsRange(const CPDF_Point& point) const +{ + return GetSameWordsRange(m_pEdit->SearchWordPlace(point), TRUE, FALSE); +} + +CPVT_WordRange CPWL_Edit::GetLatinWordsRange(const CPVT_WordPlace & place) const +{ + return GetSameWordsRange(place, TRUE, FALSE); +} + +CPVT_WordRange CPWL_Edit::GetArabicWordsRange(const CPVT_WordPlace & place) const +{ + return GetSameWordsRange(place, FALSE, TRUE); +} + +#define PWL_ISARABICWORD(word) ((word >= 0x0600 && word <= 0x06FF) || (word >= 0xFB50 && word <= 0xFEFC)) + +CPVT_WordRange CPWL_Edit::GetSameWordsRange(const CPVT_WordPlace & place, FX_BOOL bLatin, FX_BOOL bArabic) const +{ + CPVT_WordRange range; + + if (IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator()) + { + CPVT_Word wordinfo; + CPVT_WordPlace wpStart(place),wpEnd(place); + pIterator->SetAt(place); + + if (bLatin) + { + while (pIterator->NextWord()) + { + if (pIterator->GetWord(wordinfo) && FX_EDIT_ISLATINWORD(wordinfo.Word)) + { + wpEnd = pIterator->GetAt(); + continue; + } + else + break; + }; + } + else if (bArabic) + { + while (pIterator->NextWord()) + { + if (pIterator->GetWord(wordinfo) && PWL_ISARABICWORD(wordinfo.Word)) + { + wpEnd = pIterator->GetAt(); + continue; + } + else + break; + }; + } + + pIterator->SetAt(place); + + if (bLatin) + { + do + { + if (pIterator->GetWord(wordinfo) && FX_EDIT_ISLATINWORD(wordinfo.Word)) + { + continue; + } + else + { + wpStart = pIterator->GetAt(); + break; + } + } + while (pIterator->PrevWord()); + } + else if (bArabic) + { + do + { + if (pIterator->GetWord(wordinfo) && PWL_ISARABICWORD(wordinfo.Word)) + { + continue; + } + else + { + wpStart = pIterator->GetAt(); + break; + } + } + while (pIterator->PrevWord()); + } + + range.Set(wpStart,wpEnd); + } + + return range; +} + +void CPWL_Edit::AjustArabicWords(const CPVT_WordRange& wr) +{ +} + +void CPWL_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects, + const CPDF_Point& ptOffset, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray) +{ + IFX_Edit::GeneratePageObjects(pPageObjects, m_pEdit, ptOffset, NULL, CPWL_Utils::PWLColorToFXColor(GetTextColor(),GetTransparency()), ObjArray); +} + +void CPWL_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects, + const CPDF_Point& ptOffset) +{ + CFX_ArrayTemplate<CPDF_TextObject*> ObjArray; + IFX_Edit::GeneratePageObjects(pPageObjects, m_pEdit, ptOffset, NULL, CPWL_Utils::PWLColorToFXColor(GetTextColor(),GetTransparency()), ObjArray); +} + diff --git a/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp b/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp index 25628223ec..90a198a771 100644 --- a/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp @@ -1,728 +1,728 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_EditCtrl.h"
-#include "../../include/pdfwindow/PWL_ScrollBar.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-#include "../../include/pdfwindow/PWL_Caret.h"
-#include "../../include/pdfwindow/PWL_FontMap.h"
-
-#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
-#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb))
-
-/* ---------------------------- CPWL_EditCtrl ------------------------------ */
-
-CPWL_EditCtrl::CPWL_EditCtrl() :
- m_pEdit(NULL),
- m_pEditCaret(NULL),
- m_bMouseDown(FALSE),
- m_pEditNotify(NULL),
- m_nCharSet(DEFAULT_CHARSET),
- m_nCodePage(0)
-{
- m_pEdit = IFX_Edit::NewEdit();
- ASSERT(m_pEdit != NULL);
-}
-
-CPWL_EditCtrl::~CPWL_EditCtrl()
-{
- IFX_Edit::DelEdit(m_pEdit);
-}
-
-void CPWL_EditCtrl::OnCreate(PWL_CREATEPARAM & cp)
-{
- cp.eCursorType = FXCT_VBEAM;
-}
-
-void CPWL_EditCtrl::OnCreated()
-{
- SetFontSize(this->GetCreationParam().fFontSize);
-
- m_pEdit->SetFontMap(this->GetFontMap());
- m_pEdit->SetNotify(this);
- m_pEdit->Initialize();
-}
-
-FX_BOOL CPWL_EditCtrl::IsWndHorV()
-{
- CPDF_Matrix mt = GetWindowMatrix();
- CPDF_Point point1(0,1);
- CPDF_Point point2(1,1);
-
- mt.Transform(point1.x, point1.y);
- mt.Transform(point2.x, point2.y);
-
- return point2.y == point1.y;
-}
-
-void CPWL_EditCtrl::SetCursor()
-{
- if (IsValid())
- {
- if (IFX_SystemHandler* pSH = GetSystemHandler())
- {
- if (IsWndHorV())
- pSH->SetCursor(FXCT_VBEAM);
- else
- pSH->SetCursor(FXCT_HBEAM);
- }
- }
-}
-
-void CPWL_EditCtrl::RePosChildWnd()
-{
- m_pEdit->SetPlateRect(GetClientRect());
-}
-
-void CPWL_EditCtrl::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
-{
- CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
-
- switch (msg)
- {
- case PNM_SETSCROLLINFO:
- switch (wParam)
- {
- case SBT_VSCROLL:
- if (CPWL_Wnd * pChild = GetVScrollBar())
- {
- pChild->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam);
- }
- break;
- }
- break;
- case PNM_SETSCROLLPOS:
- switch (wParam)
- {
- case SBT_VSCROLL:
- if (CPWL_Wnd * pChild = GetVScrollBar())
- {
- pChild->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);
- }
- break;
- }
- break;
- case PNM_SCROLLWINDOW:
- {
- FX_FLOAT fPos = *(FX_FLOAT*)lParam;
- switch (wParam)
- {
- case SBT_VSCROLL:
- m_pEdit->SetScrollPos(CPDF_Point(m_pEdit->GetScrollPos().x,fPos));
- break;
- }
- }
- break;
- case PNM_SETCARETINFO:
- {
- if (PWL_CARET_INFO * pCaretInfo = (PWL_CARET_INFO *)wParam)
- {
- this->SetCaret(pCaretInfo->bVisible,
- pCaretInfo->ptHead,
- pCaretInfo->ptFoot);
- }
- }
- break;
- }
-}
-
-void CPWL_EditCtrl::CreateChildWnd(const PWL_CREATEPARAM & cp)
-{
- if (!IsReadOnly())
- CreateEditCaret(cp);
-}
-
-void CPWL_EditCtrl::CreateEditCaret(const PWL_CREATEPARAM & cp)
-{
- if (!m_pEditCaret)
- {
- m_pEditCaret = new CPWL_Caret;
- m_pEditCaret->SetInvalidRect(GetClientRect());
-
- PWL_CREATEPARAM ecp = cp;
- ecp.pParentWnd = this;
- ecp.dwFlags = PWS_CHILD | PWS_NOREFRESHCLIP;
- ecp.dwBorderWidth = 0;
- ecp.nBorderStyle = PBS_SOLID;
- ecp.rcRectWnd = CPDF_Rect(0,0,0,0);
-
- m_pEditCaret->Create(ecp);
- }
-}
-
-void CPWL_EditCtrl::SetFontSize(FX_FLOAT fFontSize)
-{
- m_pEdit->SetFontSize(fFontSize);
-}
-
-FX_FLOAT CPWL_EditCtrl::GetFontSize() const
-{
- return m_pEdit->GetFontSize();
-}
-
-FX_BOOL CPWL_EditCtrl::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)
-{
- if (m_bMouseDown) return TRUE;
-
- FX_BOOL bRet = CPWL_Wnd::OnKeyDown(nChar,nFlag);
-
- //FILTER
- switch (nChar)
- {
- default:
- return FALSE;
- case FWL_VKEY_Delete:
- case FWL_VKEY_Up:
- case FWL_VKEY_Down:
- case FWL_VKEY_Left:
- case FWL_VKEY_Right:
- case FWL_VKEY_Home:
- case FWL_VKEY_End:
- case FWL_VKEY_Insert:
- case 'C':
- case 'V':
- case 'X':
- case 'A':
- case 'Z':
- case 'c':
- case 'v':
- case 'x':
- case 'a':
- case 'z':
- break;
- }
-
- if (nChar == FWL_VKEY_Delete)
- {
- if (m_pEdit->IsSelected())
- nChar = FWL_VKEY_Unknown;
- }
-
- switch (nChar)
- {
- case FWL_VKEY_Delete:
- Delete();
- return TRUE;
- case FWL_VKEY_Insert:
- if (IsSHIFTpressed(nFlag))
- PasteText();
- return TRUE;
- case FWL_VKEY_Up:
- m_pEdit->OnVK_UP(IsSHIFTpressed(nFlag),FALSE);
- return TRUE;
- case FWL_VKEY_Down:
- m_pEdit->OnVK_DOWN(IsSHIFTpressed(nFlag),FALSE);
- return TRUE;
- case FWL_VKEY_Left:
- m_pEdit->OnVK_LEFT(IsSHIFTpressed(nFlag),FALSE);
- return TRUE;
- case FWL_VKEY_Right:
- m_pEdit->OnVK_RIGHT(IsSHIFTpressed(nFlag),FALSE);
- return TRUE;
- case FWL_VKEY_Home:
- m_pEdit->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- return TRUE;
- case FWL_VKEY_End:
- m_pEdit->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- return TRUE;
- case FWL_VKEY_Unknown:
- if (!IsSHIFTpressed(nFlag))
- Clear();
- else
- CutText();
- return TRUE;
- default:
- break;
- }
-
- return bRet;
-}
-
-FX_BOOL CPWL_EditCtrl::OnChar(FX_WORD nChar, FX_DWORD nFlag)
-{
- if (m_bMouseDown) return TRUE;
-
- CPWL_Wnd::OnChar(nChar,nFlag);
-
- //FILTER
- switch (nChar)
- {
- case 0x0A:
- case 0x1B:
- return FALSE;
- default:
- break;
- }
-
- FX_BOOL bCtrl = IsCTRLpressed(nFlag);
- FX_BOOL bAlt = IsALTpressed(nFlag);
- FX_BOOL bShift = IsSHIFTpressed(nFlag);
-
- FX_WORD word = nChar;
-
- if (bCtrl && !bAlt)
- {
- switch (nChar)
- {
- case 'C' - 'A' + 1:
- this->CopyText();
- return TRUE;
- case 'V' - 'A' + 1:
- this->PasteText();
- return TRUE;
- case 'X' - 'A' + 1:
- this->CutText();
- return TRUE;
- case 'A' - 'A' + 1:
- this->SelectAll();
- return TRUE;
- case 'Z' - 'A' + 1:
- if (bShift)
- Redo();
- else
- Undo();
- return TRUE;
- default:
- if (nChar < 32)
- return FALSE;
- }
- }
-
- if (IsReadOnly()) return TRUE;
-
- if (m_pEdit->IsSelected() && word == FWL_VKEY_Back)
- word = FWL_VKEY_Unknown;
-
- Clear();
-
- switch (word)
- {
- case FWL_VKEY_Back:
- Backspace();
- break;
- case FWL_VKEY_Return:
- InsertReturn();
- break;
- case FWL_VKEY_Unknown:
- break;
- default:
- if (IsINSERTpressed(nFlag))
- Delete();
- InsertWord(word, this->GetCharSet());
- break;
- }
-
- return TRUE;
-}
-
-FX_BOOL CPWL_EditCtrl::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonDown(point,nFlag);
-
- if (ClientHitTest(point))
- {
- if (m_bMouseDown)
- this->InvalidateRect();
-
- m_bMouseDown = TRUE;
- SetCapture();
-
- m_pEdit->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- }
-
- return TRUE;
-}
-
-FX_BOOL CPWL_EditCtrl::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonUp(point,nFlag);
-
- if (m_bMouseDown)
- {
- //can receive keybord message
- if (ClientHitTest(point) && !this->IsFocused())
- SetFocus();
-
- ReleaseCapture();
- m_bMouseDown = FALSE;
- }
-
- return TRUE;
-}
-
-FX_BOOL CPWL_EditCtrl::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnMouseMove(point,nFlag);
-
- if (m_bMouseDown)
- m_pEdit->OnMouseMove(point,FALSE,FALSE);
-
- return TRUE;
-}
-
-CPDF_Rect CPWL_EditCtrl::GetContentRect() const
-{
- return m_pEdit->GetContentRect();
-}
-
-void CPWL_EditCtrl::SetEditCaret(FX_BOOL bVisible)
-{
- CPDF_Point ptHead(0,0),ptFoot(0,0);
-
- if (bVisible)
- {
- GetCaretInfo(ptHead,ptFoot);
- }
-
- CPVT_WordPlace wpTemp = m_pEdit->GetCaretWordPlace();
- this->IOnSetCaret(bVisible,ptHead,ptFoot,wpTemp);
-}
-
-void CPWL_EditCtrl::GetCaretInfo(CPDF_Point & ptHead, CPDF_Point & ptFoot) const
-{
- if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
- {
- pIterator->SetAt(m_pEdit->GetCaret());
- CPVT_Word word;
- CPVT_Line line;
- if (pIterator->GetWord(word))
- {
- ptHead.x = word.ptWord.x + word.fWidth;
- ptHead.y = word.ptWord.y + word.fAscent;
- ptFoot.x = word.ptWord.x + word.fWidth;
- ptFoot.y = word.ptWord.y + word.fDescent;
- }
- else if (pIterator->GetLine(line))
- {
- ptHead.x = line.ptLine.x;
- ptHead.y = line.ptLine.y + line.fLineAscent;
- ptFoot.x = line.ptLine.x;
- ptFoot.y = line.ptLine.y + line.fLineDescent;
- }
- }
-}
-
-void CPWL_EditCtrl::GetCaretPos(FX_INT32& x, FX_INT32& y) const
-{
- CPDF_Point ptHead(0,0), ptFoot(0,0);
-
- GetCaretInfo(ptHead,ptFoot);
-
- PWLtoWnd(ptHead, x, y);
-}
-
-void CPWL_EditCtrl::SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot)
-{
- if (m_pEditCaret)
- {
- if (!IsFocused() || m_pEdit->IsSelected())
- bVisible = FALSE;
-
- m_pEditCaret->SetCaret(bVisible, ptHead, ptFoot);
- }
-}
-
-FX_BOOL CPWL_EditCtrl::IsModified() const
-{
- return m_pEdit->IsModified();
-}
-
-CFX_WideString CPWL_EditCtrl::GetText() const
-{
- return m_pEdit->GetText();
-}
-
-void CPWL_EditCtrl::SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar)
-{
- m_pEdit->SetSel(nStartChar, nEndChar);
-}
-
-void CPWL_EditCtrl::GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar ) const
-{
- m_pEdit->GetSel(nStartChar, nEndChar);
-}
-
-void CPWL_EditCtrl::Clear()
-{
- if (!IsReadOnly())
- m_pEdit->Clear();
-}
-
-void CPWL_EditCtrl::SelectAll()
-{
- m_pEdit->SelectAll();
-}
-
-void CPWL_EditCtrl::Paint()
-{
- if (m_pEdit)
- m_pEdit->Paint();
-}
-
-void CPWL_EditCtrl::EnableRefresh(FX_BOOL bRefresh)
-{
- if (m_pEdit)
- m_pEdit->EnableRefresh(bRefresh);
-}
-
-FX_INT32 CPWL_EditCtrl::GetCaret() const
-{
- if (m_pEdit)
- return m_pEdit->GetCaret();
-
- return -1;
-}
-
-void CPWL_EditCtrl::SetCaret(FX_INT32 nPos)
-{
- if (m_pEdit)
- m_pEdit->SetCaret(nPos);
-}
-
-FX_INT32 CPWL_EditCtrl::GetTotalWords() const
-{
- if (m_pEdit)
- return m_pEdit->GetTotalWords();
-
- return 0;
-}
-
-void CPWL_EditCtrl::SetScrollPos(const CPDF_Point& point)
-{
- if (m_pEdit)
- m_pEdit->SetScrollPos(point);
-}
-
-CPDF_Point CPWL_EditCtrl::GetScrollPos() const
-{
- if (m_pEdit)
- return m_pEdit->GetScrollPos();
-
- return CPDF_Point(0.0f, 0.0f);
-}
-
-CPDF_Font * CPWL_EditCtrl::GetCaretFont() const
-{
- FX_INT32 nFontIndex = 0;
-
- if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
- {
- pIterator->SetAt(m_pEdit->GetCaret());
- CPVT_Word word;
- CPVT_Section section;
- if (pIterator->GetWord(word))
- {
- nFontIndex = word.nFontIndex;
- }
- else if (HasFlag(PES_RICH))
- {
- if (pIterator->GetSection(section))
- {
- nFontIndex = section.WordProps.nFontIndex;
- }
- }
- }
-
- if (IFX_Edit_FontMap * pFontMap = GetFontMap())
- return pFontMap->GetPDFFont(nFontIndex);
- else
- return NULL;
-}
-
-FX_FLOAT CPWL_EditCtrl::GetCaretFontSize() const
-{
- FX_FLOAT fFontSize = GetFontSize();
-
- if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
- {
- pIterator->SetAt(m_pEdit->GetCaret());
- CPVT_Word word;
- CPVT_Section section;
- if (pIterator->GetWord(word))
- {
- fFontSize = word.fFontSize;
- }
- else if (HasFlag(PES_RICH))
- {
- if (pIterator->GetSection(section))
- {
- fFontSize = section.WordProps.fFontSize;
- }
- }
- }
-
- return fFontSize;
-}
-
-void CPWL_EditCtrl::SetText(FX_LPCWSTR csText)
-{
- m_pEdit->SetText(csText);
-}
-
-void CPWL_EditCtrl::CopyText()
-{
-}
-
-void CPWL_EditCtrl::PasteText()
-{
-}
-
-void CPWL_EditCtrl::CutText()
-{
-}
-
-void CPWL_EditCtrl::ShowVScrollBar(FX_BOOL bShow)
-{
-}
-
-void CPWL_EditCtrl::InsertText(FX_LPCWSTR csText)
-{
- if (!IsReadOnly())
- m_pEdit->InsertText(csText);
-}
-
-void CPWL_EditCtrl::InsertWord(FX_WORD word, FX_INT32 nCharset)
-{
- if (!IsReadOnly())
- m_pEdit->InsertWord(word, nCharset);
-}
-
-void CPWL_EditCtrl::InsertReturn()
-{
- if (!IsReadOnly())
- m_pEdit->InsertReturn();
-}
-
-void CPWL_EditCtrl::Delete()
-{
- if (!IsReadOnly())
- m_pEdit->Delete();
-}
-
-void CPWL_EditCtrl::Backspace()
-{
- if (!IsReadOnly())
- m_pEdit->Backspace();
-}
-
-FX_BOOL CPWL_EditCtrl::CanUndo() const
-{
- return !IsReadOnly() && m_pEdit->CanUndo();
-}
-
-FX_BOOL CPWL_EditCtrl::CanRedo() const
-{
- return !IsReadOnly() && m_pEdit->CanRedo();
-}
-
-void CPWL_EditCtrl::Redo()
-{
- if (CanRedo())
- m_pEdit->Redo();
-}
-
-void CPWL_EditCtrl::Undo()
-{
- if (CanUndo())
- m_pEdit->Undo();
-}
-
-void CPWL_EditCtrl::IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
- FX_FLOAT fContentMin, FX_FLOAT fContentMax,
- FX_FLOAT fSmallStep, FX_FLOAT fBigStep)
-{
- PWL_SCROLL_INFO Info;
-
- Info.fPlateWidth = fPlateMax - fPlateMin;
- Info.fContentMin = fContentMin;
- Info.fContentMax = fContentMax;
- Info.fSmallStep = fSmallStep;
- Info.fBigStep = fBigStep;
-
- this->OnNotify(this,PNM_SETSCROLLINFO,SBT_VSCROLL,(FX_INTPTR)&Info);
-
-// PWL_TRACE("set scroll info:%f\n",fContentMax - fContentMin);
-
- if (IsFloatBigger(Info.fPlateWidth,Info.fContentMax-Info.fContentMin)
- || IsFloatEqual(Info.fPlateWidth,Info.fContentMax-Info.fContentMin))
- {
- this->ShowVScrollBar(FALSE);
- }
- else
- {
- this->ShowVScrollBar(TRUE);
- }
-}
-
-void CPWL_EditCtrl::IOnSetScrollPosY(FX_FLOAT fy)
-{
-// PWL_TRACE("set scroll position:%f\n",fy);
- this->OnNotify(this,PNM_SETSCROLLPOS,SBT_VSCROLL,(FX_INTPTR)&fy);
-}
-
-void CPWL_EditCtrl::IOnSetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot, const CPVT_WordPlace& place)
-{
- PWL_CARET_INFO cInfo;
- cInfo.bVisible = bVisible;
- cInfo.ptHead = ptHead;
- cInfo.ptFoot = ptFoot;
-
- this->OnNotify(this,PNM_SETCARETINFO,(FX_INTPTR)&cInfo,(FX_INTPTR)NULL);
-}
-
-void CPWL_EditCtrl::IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps)
-{
-}
-
-void CPWL_EditCtrl::IOnContentChange(const CPDF_Rect& rcContent)
-{
- if (this->IsValid())
- {
- if (m_pEditNotify)
- {
- m_pEditNotify->OnContentChange(rcContent);
- }
- }
-}
-
-void CPWL_EditCtrl::IOnInvalidateRect(CPDF_Rect * pRect)
-{
- this->InvalidateRect(pRect);
-}
-
-FX_INT32 CPWL_EditCtrl::GetCharSet() const
-{
- if (m_nCharSet < 0)
- return DEFAULT_CHARSET;
- else
- return m_nCharSet;
-}
-
-void CPWL_EditCtrl::GetTextRange(const CPDF_Rect& rect, FX_INT32 & nStartChar, FX_INT32 & nEndChar) const
-{
- nStartChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.left, rect.top)));
- nEndChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.right, rect.bottom)));
-}
-
-CFX_WideString CPWL_EditCtrl::GetText(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const
-{
- CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStartChar);
- CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEndChar);
- return m_pEdit->GetRangeText(CPVT_WordRange(wpStart, wpEnd));
-}
-
-void CPWL_EditCtrl::SetReadyToInput()
-{
- if (m_bMouseDown)
- {
- ReleaseCapture();
- m_bMouseDown = FALSE;
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_EditCtrl.h" +#include "../../include/pdfwindow/PWL_ScrollBar.h" +#include "../../include/pdfwindow/PWL_Utils.h" +#include "../../include/pdfwindow/PWL_Caret.h" +#include "../../include/pdfwindow/PWL_FontMap.h" + +#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) +#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) +#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) +#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb)) + +/* ---------------------------- CPWL_EditCtrl ------------------------------ */ + +CPWL_EditCtrl::CPWL_EditCtrl() : + m_pEdit(NULL), + m_pEditCaret(NULL), + m_bMouseDown(FALSE), + m_pEditNotify(NULL), + m_nCharSet(DEFAULT_CHARSET), + m_nCodePage(0) +{ + m_pEdit = IFX_Edit::NewEdit(); + ASSERT(m_pEdit != NULL); +} + +CPWL_EditCtrl::~CPWL_EditCtrl() +{ + IFX_Edit::DelEdit(m_pEdit); +} + +void CPWL_EditCtrl::OnCreate(PWL_CREATEPARAM & cp) +{ + cp.eCursorType = FXCT_VBEAM; +} + +void CPWL_EditCtrl::OnCreated() +{ + SetFontSize(this->GetCreationParam().fFontSize); + + m_pEdit->SetFontMap(this->GetFontMap()); + m_pEdit->SetNotify(this); + m_pEdit->Initialize(); +} + +FX_BOOL CPWL_EditCtrl::IsWndHorV() +{ + CPDF_Matrix mt = GetWindowMatrix(); + CPDF_Point point1(0,1); + CPDF_Point point2(1,1); + + mt.Transform(point1.x, point1.y); + mt.Transform(point2.x, point2.y); + + return point2.y == point1.y; +} + +void CPWL_EditCtrl::SetCursor() +{ + if (IsValid()) + { + if (IFX_SystemHandler* pSH = GetSystemHandler()) + { + if (IsWndHorV()) + pSH->SetCursor(FXCT_VBEAM); + else + pSH->SetCursor(FXCT_HBEAM); + } + } +} + +void CPWL_EditCtrl::RePosChildWnd() +{ + m_pEdit->SetPlateRect(GetClientRect()); +} + +void CPWL_EditCtrl::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam) +{ + CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam); + + switch (msg) + { + case PNM_SETSCROLLINFO: + switch (wParam) + { + case SBT_VSCROLL: + if (CPWL_Wnd * pChild = GetVScrollBar()) + { + pChild->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam); + } + break; + } + break; + case PNM_SETSCROLLPOS: + switch (wParam) + { + case SBT_VSCROLL: + if (CPWL_Wnd * pChild = GetVScrollBar()) + { + pChild->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam); + } + break; + } + break; + case PNM_SCROLLWINDOW: + { + FX_FLOAT fPos = *(FX_FLOAT*)lParam; + switch (wParam) + { + case SBT_VSCROLL: + m_pEdit->SetScrollPos(CPDF_Point(m_pEdit->GetScrollPos().x,fPos)); + break; + } + } + break; + case PNM_SETCARETINFO: + { + if (PWL_CARET_INFO * pCaretInfo = (PWL_CARET_INFO *)wParam) + { + this->SetCaret(pCaretInfo->bVisible, + pCaretInfo->ptHead, + pCaretInfo->ptFoot); + } + } + break; + } +} + +void CPWL_EditCtrl::CreateChildWnd(const PWL_CREATEPARAM & cp) +{ + if (!IsReadOnly()) + CreateEditCaret(cp); +} + +void CPWL_EditCtrl::CreateEditCaret(const PWL_CREATEPARAM & cp) +{ + if (!m_pEditCaret) + { + m_pEditCaret = new CPWL_Caret; + m_pEditCaret->SetInvalidRect(GetClientRect()); + + PWL_CREATEPARAM ecp = cp; + ecp.pParentWnd = this; + ecp.dwFlags = PWS_CHILD | PWS_NOREFRESHCLIP; + ecp.dwBorderWidth = 0; + ecp.nBorderStyle = PBS_SOLID; + ecp.rcRectWnd = CPDF_Rect(0,0,0,0); + + m_pEditCaret->Create(ecp); + } +} + +void CPWL_EditCtrl::SetFontSize(FX_FLOAT fFontSize) +{ + m_pEdit->SetFontSize(fFontSize); +} + +FX_FLOAT CPWL_EditCtrl::GetFontSize() const +{ + return m_pEdit->GetFontSize(); +} + +FX_BOOL CPWL_EditCtrl::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag) +{ + if (m_bMouseDown) return TRUE; + + FX_BOOL bRet = CPWL_Wnd::OnKeyDown(nChar,nFlag); + + //FILTER + switch (nChar) + { + default: + return FALSE; + case FWL_VKEY_Delete: + case FWL_VKEY_Up: + case FWL_VKEY_Down: + case FWL_VKEY_Left: + case FWL_VKEY_Right: + case FWL_VKEY_Home: + case FWL_VKEY_End: + case FWL_VKEY_Insert: + case 'C': + case 'V': + case 'X': + case 'A': + case 'Z': + case 'c': + case 'v': + case 'x': + case 'a': + case 'z': + break; + } + + if (nChar == FWL_VKEY_Delete) + { + if (m_pEdit->IsSelected()) + nChar = FWL_VKEY_Unknown; + } + + switch (nChar) + { + case FWL_VKEY_Delete: + Delete(); + return TRUE; + case FWL_VKEY_Insert: + if (IsSHIFTpressed(nFlag)) + PasteText(); + return TRUE; + case FWL_VKEY_Up: + m_pEdit->OnVK_UP(IsSHIFTpressed(nFlag),FALSE); + return TRUE; + case FWL_VKEY_Down: + m_pEdit->OnVK_DOWN(IsSHIFTpressed(nFlag),FALSE); + return TRUE; + case FWL_VKEY_Left: + m_pEdit->OnVK_LEFT(IsSHIFTpressed(nFlag),FALSE); + return TRUE; + case FWL_VKEY_Right: + m_pEdit->OnVK_RIGHT(IsSHIFTpressed(nFlag),FALSE); + return TRUE; + case FWL_VKEY_Home: + m_pEdit->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + return TRUE; + case FWL_VKEY_End: + m_pEdit->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + return TRUE; + case FWL_VKEY_Unknown: + if (!IsSHIFTpressed(nFlag)) + Clear(); + else + CutText(); + return TRUE; + default: + break; + } + + return bRet; +} + +FX_BOOL CPWL_EditCtrl::OnChar(FX_WORD nChar, FX_DWORD nFlag) +{ + if (m_bMouseDown) return TRUE; + + CPWL_Wnd::OnChar(nChar,nFlag); + + //FILTER + switch (nChar) + { + case 0x0A: + case 0x1B: + return FALSE; + default: + break; + } + + FX_BOOL bCtrl = IsCTRLpressed(nFlag); + FX_BOOL bAlt = IsALTpressed(nFlag); + FX_BOOL bShift = IsSHIFTpressed(nFlag); + + FX_WORD word = nChar; + + if (bCtrl && !bAlt) + { + switch (nChar) + { + case 'C' - 'A' + 1: + this->CopyText(); + return TRUE; + case 'V' - 'A' + 1: + this->PasteText(); + return TRUE; + case 'X' - 'A' + 1: + this->CutText(); + return TRUE; + case 'A' - 'A' + 1: + this->SelectAll(); + return TRUE; + case 'Z' - 'A' + 1: + if (bShift) + Redo(); + else + Undo(); + return TRUE; + default: + if (nChar < 32) + return FALSE; + } + } + + if (IsReadOnly()) return TRUE; + + if (m_pEdit->IsSelected() && word == FWL_VKEY_Back) + word = FWL_VKEY_Unknown; + + Clear(); + + switch (word) + { + case FWL_VKEY_Back: + Backspace(); + break; + case FWL_VKEY_Return: + InsertReturn(); + break; + case FWL_VKEY_Unknown: + break; + default: + if (IsINSERTpressed(nFlag)) + Delete(); + InsertWord(word, this->GetCharSet()); + break; + } + + return TRUE; +} + +FX_BOOL CPWL_EditCtrl::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonDown(point,nFlag); + + if (ClientHitTest(point)) + { + if (m_bMouseDown) + this->InvalidateRect(); + + m_bMouseDown = TRUE; + SetCapture(); + + m_pEdit->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + } + + return TRUE; +} + +FX_BOOL CPWL_EditCtrl::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonUp(point,nFlag); + + if (m_bMouseDown) + { + //can receive keybord message + if (ClientHitTest(point) && !this->IsFocused()) + SetFocus(); + + ReleaseCapture(); + m_bMouseDown = FALSE; + } + + return TRUE; +} + +FX_BOOL CPWL_EditCtrl::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnMouseMove(point,nFlag); + + if (m_bMouseDown) + m_pEdit->OnMouseMove(point,FALSE,FALSE); + + return TRUE; +} + +CPDF_Rect CPWL_EditCtrl::GetContentRect() const +{ + return m_pEdit->GetContentRect(); +} + +void CPWL_EditCtrl::SetEditCaret(FX_BOOL bVisible) +{ + CPDF_Point ptHead(0,0),ptFoot(0,0); + + if (bVisible) + { + GetCaretInfo(ptHead,ptFoot); + } + + CPVT_WordPlace wpTemp = m_pEdit->GetCaretWordPlace(); + this->IOnSetCaret(bVisible,ptHead,ptFoot,wpTemp); +} + +void CPWL_EditCtrl::GetCaretInfo(CPDF_Point & ptHead, CPDF_Point & ptFoot) const +{ + if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator()) + { + pIterator->SetAt(m_pEdit->GetCaret()); + CPVT_Word word; + CPVT_Line line; + if (pIterator->GetWord(word)) + { + ptHead.x = word.ptWord.x + word.fWidth; + ptHead.y = word.ptWord.y + word.fAscent; + ptFoot.x = word.ptWord.x + word.fWidth; + ptFoot.y = word.ptWord.y + word.fDescent; + } + else if (pIterator->GetLine(line)) + { + ptHead.x = line.ptLine.x; + ptHead.y = line.ptLine.y + line.fLineAscent; + ptFoot.x = line.ptLine.x; + ptFoot.y = line.ptLine.y + line.fLineDescent; + } + } +} + +void CPWL_EditCtrl::GetCaretPos(FX_INT32& x, FX_INT32& y) const +{ + CPDF_Point ptHead(0,0), ptFoot(0,0); + + GetCaretInfo(ptHead,ptFoot); + + PWLtoWnd(ptHead, x, y); +} + +void CPWL_EditCtrl::SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot) +{ + if (m_pEditCaret) + { + if (!IsFocused() || m_pEdit->IsSelected()) + bVisible = FALSE; + + m_pEditCaret->SetCaret(bVisible, ptHead, ptFoot); + } +} + +FX_BOOL CPWL_EditCtrl::IsModified() const +{ + return m_pEdit->IsModified(); +} + +CFX_WideString CPWL_EditCtrl::GetText() const +{ + return m_pEdit->GetText(); +} + +void CPWL_EditCtrl::SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar) +{ + m_pEdit->SetSel(nStartChar, nEndChar); +} + +void CPWL_EditCtrl::GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar ) const +{ + m_pEdit->GetSel(nStartChar, nEndChar); +} + +void CPWL_EditCtrl::Clear() +{ + if (!IsReadOnly()) + m_pEdit->Clear(); +} + +void CPWL_EditCtrl::SelectAll() +{ + m_pEdit->SelectAll(); +} + +void CPWL_EditCtrl::Paint() +{ + if (m_pEdit) + m_pEdit->Paint(); +} + +void CPWL_EditCtrl::EnableRefresh(FX_BOOL bRefresh) +{ + if (m_pEdit) + m_pEdit->EnableRefresh(bRefresh); +} + +FX_INT32 CPWL_EditCtrl::GetCaret() const +{ + if (m_pEdit) + return m_pEdit->GetCaret(); + + return -1; +} + +void CPWL_EditCtrl::SetCaret(FX_INT32 nPos) +{ + if (m_pEdit) + m_pEdit->SetCaret(nPos); +} + +FX_INT32 CPWL_EditCtrl::GetTotalWords() const +{ + if (m_pEdit) + return m_pEdit->GetTotalWords(); + + return 0; +} + +void CPWL_EditCtrl::SetScrollPos(const CPDF_Point& point) +{ + if (m_pEdit) + m_pEdit->SetScrollPos(point); +} + +CPDF_Point CPWL_EditCtrl::GetScrollPos() const +{ + if (m_pEdit) + return m_pEdit->GetScrollPos(); + + return CPDF_Point(0.0f, 0.0f); +} + +CPDF_Font * CPWL_EditCtrl::GetCaretFont() const +{ + FX_INT32 nFontIndex = 0; + + if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator()) + { + pIterator->SetAt(m_pEdit->GetCaret()); + CPVT_Word word; + CPVT_Section section; + if (pIterator->GetWord(word)) + { + nFontIndex = word.nFontIndex; + } + else if (HasFlag(PES_RICH)) + { + if (pIterator->GetSection(section)) + { + nFontIndex = section.WordProps.nFontIndex; + } + } + } + + if (IFX_Edit_FontMap * pFontMap = GetFontMap()) + return pFontMap->GetPDFFont(nFontIndex); + else + return NULL; +} + +FX_FLOAT CPWL_EditCtrl::GetCaretFontSize() const +{ + FX_FLOAT fFontSize = GetFontSize(); + + if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator()) + { + pIterator->SetAt(m_pEdit->GetCaret()); + CPVT_Word word; + CPVT_Section section; + if (pIterator->GetWord(word)) + { + fFontSize = word.fFontSize; + } + else if (HasFlag(PES_RICH)) + { + if (pIterator->GetSection(section)) + { + fFontSize = section.WordProps.fFontSize; + } + } + } + + return fFontSize; +} + +void CPWL_EditCtrl::SetText(FX_LPCWSTR csText) +{ + m_pEdit->SetText(csText); +} + +void CPWL_EditCtrl::CopyText() +{ +} + +void CPWL_EditCtrl::PasteText() +{ +} + +void CPWL_EditCtrl::CutText() +{ +} + +void CPWL_EditCtrl::ShowVScrollBar(FX_BOOL bShow) +{ +} + +void CPWL_EditCtrl::InsertText(FX_LPCWSTR csText) +{ + if (!IsReadOnly()) + m_pEdit->InsertText(csText); +} + +void CPWL_EditCtrl::InsertWord(FX_WORD word, FX_INT32 nCharset) +{ + if (!IsReadOnly()) + m_pEdit->InsertWord(word, nCharset); +} + +void CPWL_EditCtrl::InsertReturn() +{ + if (!IsReadOnly()) + m_pEdit->InsertReturn(); +} + +void CPWL_EditCtrl::Delete() +{ + if (!IsReadOnly()) + m_pEdit->Delete(); +} + +void CPWL_EditCtrl::Backspace() +{ + if (!IsReadOnly()) + m_pEdit->Backspace(); +} + +FX_BOOL CPWL_EditCtrl::CanUndo() const +{ + return !IsReadOnly() && m_pEdit->CanUndo(); +} + +FX_BOOL CPWL_EditCtrl::CanRedo() const +{ + return !IsReadOnly() && m_pEdit->CanRedo(); +} + +void CPWL_EditCtrl::Redo() +{ + if (CanRedo()) + m_pEdit->Redo(); +} + +void CPWL_EditCtrl::Undo() +{ + if (CanUndo()) + m_pEdit->Undo(); +} + +void CPWL_EditCtrl::IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, + FX_FLOAT fContentMin, FX_FLOAT fContentMax, + FX_FLOAT fSmallStep, FX_FLOAT fBigStep) +{ + PWL_SCROLL_INFO Info; + + Info.fPlateWidth = fPlateMax - fPlateMin; + Info.fContentMin = fContentMin; + Info.fContentMax = fContentMax; + Info.fSmallStep = fSmallStep; + Info.fBigStep = fBigStep; + + this->OnNotify(this,PNM_SETSCROLLINFO,SBT_VSCROLL,(FX_INTPTR)&Info); + +// PWL_TRACE("set scroll info:%f\n",fContentMax - fContentMin); + + if (IsFloatBigger(Info.fPlateWidth,Info.fContentMax-Info.fContentMin) + || IsFloatEqual(Info.fPlateWidth,Info.fContentMax-Info.fContentMin)) + { + this->ShowVScrollBar(FALSE); + } + else + { + this->ShowVScrollBar(TRUE); + } +} + +void CPWL_EditCtrl::IOnSetScrollPosY(FX_FLOAT fy) +{ +// PWL_TRACE("set scroll position:%f\n",fy); + this->OnNotify(this,PNM_SETSCROLLPOS,SBT_VSCROLL,(FX_INTPTR)&fy); +} + +void CPWL_EditCtrl::IOnSetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot, const CPVT_WordPlace& place) +{ + PWL_CARET_INFO cInfo; + cInfo.bVisible = bVisible; + cInfo.ptHead = ptHead; + cInfo.ptFoot = ptFoot; + + this->OnNotify(this,PNM_SETCARETINFO,(FX_INTPTR)&cInfo,(FX_INTPTR)NULL); +} + +void CPWL_EditCtrl::IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps) +{ +} + +void CPWL_EditCtrl::IOnContentChange(const CPDF_Rect& rcContent) +{ + if (this->IsValid()) + { + if (m_pEditNotify) + { + m_pEditNotify->OnContentChange(rcContent); + } + } +} + +void CPWL_EditCtrl::IOnInvalidateRect(CPDF_Rect * pRect) +{ + this->InvalidateRect(pRect); +} + +FX_INT32 CPWL_EditCtrl::GetCharSet() const +{ + if (m_nCharSet < 0) + return DEFAULT_CHARSET; + else + return m_nCharSet; +} + +void CPWL_EditCtrl::GetTextRange(const CPDF_Rect& rect, FX_INT32 & nStartChar, FX_INT32 & nEndChar) const +{ + nStartChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.left, rect.top))); + nEndChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.right, rect.bottom))); +} + +CFX_WideString CPWL_EditCtrl::GetText(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const +{ + CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStartChar); + CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEndChar); + return m_pEdit->GetRangeText(CPVT_WordRange(wpStart, wpEnd)); +} + +void CPWL_EditCtrl::SetReadyToInput() +{ + if (m_bMouseDown) + { + ReleaseCapture(); + m_bMouseDown = FALSE; + } +} diff --git a/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp b/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp index 1e2259fe50..c656f0c15e 100644 --- a/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp @@ -1,601 +1,601 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_FontMap.h"
-
-#define DEFAULT_FONT_NAME "Helvetica"
-
-/* ------------------------------ CPWL_FontMap ------------------------------ */
-
-CPWL_FontMap::CPWL_FontMap(IFX_SystemHandler* pSystemHandler) :
- m_pPDFDoc(NULL),
- m_pSystemHandler(pSystemHandler)
-{
- ASSERT(m_pSystemHandler != NULL);
-}
-
-CPWL_FontMap::~CPWL_FontMap()
-{
- if (m_pPDFDoc)
- {
- delete m_pPDFDoc;
- m_pPDFDoc = NULL;
- }
-
- Empty();
-}
-
-void CPWL_FontMap::SetSystemHandler(IFX_SystemHandler* pSystemHandler)
-{
- m_pSystemHandler = pSystemHandler;
-}
-
-CPDF_Document* CPWL_FontMap::GetDocument()
-{
- if (!m_pPDFDoc)
- {
- if (CPDF_ModuleMgr::Get())
- {
- m_pPDFDoc = FX_NEW CPDF_Document;
- m_pPDFDoc->CreateNewDoc();
- }
- }
-
- return m_pPDFDoc;
-}
-
-CPDF_Font* CPWL_FontMap::GetPDFFont(FX_INT32 nFontIndex)
-{
- if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
- {
- if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
- {
- return pData->pFont;
- }
- }
-
- return NULL;
-}
-
-CFX_ByteString CPWL_FontMap::GetPDFFontAlias(FX_INT32 nFontIndex)
-{
- if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
- {
- if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
- {
- return pData->sFontName;
- }
- }
-
- return "";
-}
-
-FX_BOOL CPWL_FontMap::KnowWord(FX_INT32 nFontIndex, FX_WORD word)
-{
- if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
- {
- if (m_aData.GetAt(nFontIndex))
- {
- return CharCodeFromUnicode(nFontIndex, word) >= 0;
- }
- }
-
- return FALSE;
-}
-
-FX_INT32 CPWL_FontMap::GetWordFontIndex(FX_WORD word, FX_INT32 nCharset, FX_INT32 nFontIndex)
-{
- if (nFontIndex > 0)
- {
- if (KnowWord(nFontIndex, word))
- return nFontIndex;
- }
- else
- {
- if (const CPWL_FontMap_Data* pData = GetFontMapData(0))
- {
- if (nCharset == DEFAULT_CHARSET ||
- pData->nCharset == SYMBOL_CHARSET ||
- nCharset == pData->nCharset)
- {
- if (KnowWord(0, word))
- {
- return 0;
- }
- }
- }
- }
-
- FX_INT32 nNewFontIndex = -1;
-
- nNewFontIndex = this->GetFontIndex(GetNativeFontName(nCharset), nCharset, TRUE);
- if (nNewFontIndex >= 0)
- {
- if (KnowWord(nNewFontIndex, word))
- return nNewFontIndex;
- }
-
- nNewFontIndex = this->GetFontIndex("Arial Unicode MS", DEFAULT_CHARSET, FALSE);
- if (nNewFontIndex >= 0)
- {
- if (KnowWord(nNewFontIndex, word))
- return nNewFontIndex;
- }
-
- return -1;
-}
-
-FX_INT32 CPWL_FontMap::CharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word)
-{
- if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
- {
- if (pData->pFont)
- {
- if (pData->pFont->IsUnicodeCompatible())
- {
- int nCharCode = pData->pFont->CharCodeFromUnicode(word);
- pData->pFont->GlyphFromCharCode(nCharCode);
- return nCharCode;
- }
- else
- {
- if (word < 0xFF)
- return word;
- }
- }
- }
-
- return -1;
-}
-
-CFX_ByteString CPWL_FontMap::GetNativeFontName(FX_INT32 nCharset)
-{
- //searching native font is slow, so we must save time
- for (FX_INT32 i=0,sz=m_aNativeFont.GetSize(); i<sz; i++)
- {
- if (CPWL_FontMap_Native* pData = m_aNativeFont.GetAt(i))
- {
- if (pData->nCharset == nCharset)
- return pData->sFontName;
- }
- }
-
- CFX_ByteString sNew = GetNativeFont(nCharset);
-
- if (!sNew.IsEmpty())
- {
- CPWL_FontMap_Native* pNewData = new CPWL_FontMap_Native;
- pNewData->nCharset = nCharset;
- pNewData->sFontName = sNew;
-
- m_aNativeFont.Add(pNewData);
- }
-
- return sNew;
-}
-
-void CPWL_FontMap::Empty()
-{
- {
- for (FX_INT32 i=0, sz=m_aData.GetSize(); i<sz; i++)
- delete m_aData.GetAt(i);
-
- m_aData.RemoveAll();
- }
- {
- for (FX_INT32 i=0, sz=m_aNativeFont.GetSize(); i<sz; i++)
- delete m_aNativeFont.GetAt(i);
-
- m_aNativeFont.RemoveAll();
- }
-}
-
-void CPWL_FontMap::Initial(FX_LPCSTR fontname)
-{
- CFX_ByteString sFontName = fontname;
-
- if (sFontName.IsEmpty())
- sFontName = DEFAULT_FONT_NAME;
-
- GetFontIndex(sFontName, ANSI_CHARSET, FALSE);
-
- //GetFontIndex(this->GetNativeFontName(nCharset), nCharset);
-}
-
-
-/*
-List of currently supported standard fonts:
-Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique
-Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique
-Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic
-Symbol, ZapfDingbats
-*/
-
-const char* g_sDEStandardFontName[] = {"Courier", "Courier-Bold", "Courier-BoldOblique", "Courier-Oblique",
- "Helvetica", "Helvetica-Bold", "Helvetica-BoldOblique", "Helvetica-Oblique",
- "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic",
- "Symbol", "ZapfDingbats"};
-
-FX_BOOL CPWL_FontMap::IsStandardFont(const CFX_ByteString& sFontName)
-{
- for (FX_INT32 i=0; i<14; i++)
- {
- if (sFontName == g_sDEStandardFontName[i])
- return TRUE;
- }
-
- return FALSE;
-}
-
-FX_INT32 CPWL_FontMap::FindFont(const CFX_ByteString& sFontName, FX_INT32 nCharset)
-{
- for (FX_INT32 i=0,sz=m_aData.GetSize(); i<sz; i++)
- {
- if (CPWL_FontMap_Data* pData = m_aData.GetAt(i))
- {
- if (nCharset == DEFAULT_CHARSET || nCharset == pData->nCharset)
- {
- if (sFontName.IsEmpty() || pData->sFontName == sFontName)
- return i;
- }
- }
- }
-
- return -1;
-}
-
-FX_INT32 CPWL_FontMap::GetFontIndex(const CFX_ByteString& sFontName, FX_INT32 nCharset, FX_BOOL bFind)
-{
- FX_INT32 nFontIndex = FindFont(EncodeFontAlias(sFontName, nCharset), nCharset);
- if (nFontIndex >= 0) return nFontIndex;
-
-// nFontIndex = FindFont("", nCharset);
-// if (nFontIndex >= 0) return nFontIndex;
-
- CFX_ByteString sAlias;
- CPDF_Font* pFont = NULL;
-
- if (bFind)
- pFont = FindFontSameCharset(sAlias, nCharset);
-
- if (!pFont)
- {
- CFX_ByteString sTemp = sFontName;
- pFont = AddFontToDocument(GetDocument(), sTemp, nCharset);
-
- /*
- if (FindFont(sAlias))
- {
- sAlias = EncodeFontAlias(sTemp, nCharset);
- }
- else
- */
- {
- sAlias = EncodeFontAlias(sTemp, nCharset);
- }
- }
-
- AddedFont(pFont, sAlias);
-
- return AddFontData(pFont, sAlias, nCharset);
-}
-
-FX_INT32 CPWL_FontMap::GetPWLFontIndex(FX_WORD word, FX_INT32 nCharset)
-{
- FX_INT32 nFind = -1;
-
- for (FX_INT32 i=0,sz=m_aData.GetSize(); i<sz; i++)
- {
- if (CPWL_FontMap_Data* pData = m_aData.GetAt(i))
- {
- if (pData->nCharset == nCharset)
- {
- nFind = i;
- break;
- }
- }
- }
-
- CPDF_Font* pNewFont = GetPDFFont(nFind);
-
- if (!pNewFont) return -1;
-
- /*
- if (CPDF_Font* pFont = GetPDFFont(nFind))
- {
- PWLFont.AddWordToFontDict(pFontDict, word);
- }
- */
-
-#ifdef FOXIT_CHROME_BUILD
- CFX_ByteString sAlias = EncodeFontAlias("Arial_Chrome", nCharset);
-#else
- CFX_ByteString sAlias = EncodeFontAlias("Arial_Foxit", nCharset);
-#endif
- AddedFont(pNewFont, sAlias);
-
- return AddFontData(pNewFont, sAlias, nCharset);
-}
-
-CPDF_Font* CPWL_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset)
-{
- return NULL;
-}
-
-FX_INT32 CPWL_FontMap::AddFontData(CPDF_Font* pFont, const CFX_ByteString& sFontAlias, FX_INT32 nCharset)
-{
- CPWL_FontMap_Data* pNewData = new CPWL_FontMap_Data;
- pNewData->pFont = pFont;
- pNewData->sFontName = sFontAlias;
- pNewData->nCharset = nCharset;
-
- m_aData.Add(pNewData);
-
- return m_aData.GetSize() -1;
-}
-
-void CPWL_FontMap::AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias)
-{
-}
-
-CFX_ByteString CPWL_FontMap::GetFontName(FX_INT32 nFontIndex)
-{
- if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
- {
- if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
- {
- return pData->sFontName;
- }
- }
-
- return "";
-}
-
-CFX_ByteString CPWL_FontMap::GetNativeFont(FX_INT32 nCharset)
-{
- CFX_ByteString sFontName;
-
- if (nCharset == DEFAULT_CHARSET)
- nCharset = GetNativeCharset();
-
- sFontName = GetDefaultFontByCharset(nCharset);
-
- if (m_pSystemHandler)
- {
- if (m_pSystemHandler->FindNativeTrueTypeFont(nCharset, sFontName))
- return sFontName;
-
- sFontName = m_pSystemHandler->GetNativeTrueTypeFont(nCharset);
- }
-
- return sFontName;
-}
-
-CPDF_Font* CPWL_FontMap::AddFontToDocument(CPDF_Document* pDoc, CFX_ByteString& sFontName, FX_BYTE nCharset)
-{
- if (IsStandardFont(sFontName))
- return AddStandardFont(pDoc, sFontName);
- else
- return AddSystemFont(pDoc, sFontName, nCharset);
-}
-
-CPDF_Font* CPWL_FontMap::AddStandardFont(CPDF_Document* pDoc, CFX_ByteString& sFontName)
-{
- if (!pDoc) return NULL;
-
- CPDF_Font* pFont = NULL;
-
- if (sFontName == "ZapfDingbats")
- pFont = pDoc->AddStandardFont(sFontName, NULL);
- else
- {
- CPDF_FontEncoding fe(PDFFONT_ENCODING_WINANSI);
- pFont = pDoc->AddStandardFont(sFontName, &fe);
- }
-
- return pFont;
-}
-
-CPDF_Font* CPWL_FontMap::AddSystemFont(CPDF_Document* pDoc, CFX_ByteString& sFontName, FX_BYTE nCharset)
-{
- if (!pDoc) return NULL;
-
- if (sFontName.IsEmpty()) sFontName = GetNativeFont(nCharset);
- if (nCharset == DEFAULT_CHARSET) nCharset = GetNativeCharset();
-
- if (m_pSystemHandler)
- return m_pSystemHandler->AddNativeTrueTypeFontToPDF(pDoc, sFontName, nCharset);
-
- return NULL;
-}
-
-CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName, FX_INT32 nCharset)
-{
- CFX_ByteString sPostfix;
- sPostfix.Format("_%02X", nCharset);
- return EncodeFontAlias(sFontName) + sPostfix;
-}
-
-CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName)
-{
- CFX_ByteString sRet = sFontName;
- sRet.Remove(' ');
- return sRet;
-}
-
-FX_INT32 CPWL_FontMap::GetFontMapCount() const
-{
- return m_aData.GetSize();
-}
-
-const CPWL_FontMap_Data* CPWL_FontMap::GetFontMapData(FX_INT32 nIndex) const
-{
- if (nIndex >=0 && nIndex < m_aData.GetSize())
- {
- return m_aData.GetAt(nIndex);
- }
-
- return NULL;
-}
-
-FX_INT32 CPWL_FontMap::GetNativeCharset()
-{
- FX_BYTE nCharset = ANSI_CHARSET;
- FX_INT32 iCodePage = FXSYS_GetACP();
- switch (iCodePage)
- {
- case 932://Japan
- nCharset = SHIFTJIS_CHARSET;
- break;
- case 936://Chinese (PRC, Singapore)
- nCharset = GB2312_CHARSET;
- break;
- case 950://Chinese (Taiwan; Hong Kong SAR, PRC)
- nCharset = GB2312_CHARSET;
- break;
- case 1252://Windows 3.1 Latin 1 (US, Western Europe)
- nCharset = ANSI_CHARSET;
- break;
- case 874://Thai
- nCharset = THAI_CHARSET;
- break;
- case 949://Korean
- nCharset = HANGUL_CHARSET;
- break;
- case 1200://Unicode (BMP of ISO 10646)
- nCharset = ANSI_CHARSET;
- break;
- case 1250://Windows 3.1 Eastern European
- nCharset = EASTEUROPE_CHARSET;
- break;
- case 1251://Windows 3.1 Cyrillic
- nCharset = RUSSIAN_CHARSET;
- break;
- case 1253://Windows 3.1 Greek
- nCharset = GREEK_CHARSET;
- break;
- case 1254://Windows 3.1 Turkish
- nCharset = TURKISH_CHARSET;
- break;
- case 1255://Hebrew
- nCharset = HEBREW_CHARSET;
- break;
- case 1256://Arabic
- nCharset = ARABIC_CHARSET;
- break;
- case 1257://Baltic
- nCharset = BALTIC_CHARSET;
- break;
- case 1258://Vietnamese
- nCharset = VIETNAMESE_CHARSET;
- break;
- case 1361://Korean(Johab)
- nCharset = JOHAB_CHARSET;
- break;
- }
- return nCharset;
-}
-
-const CPWL_FontMap::CharsetFontMap CPWL_FontMap::defaultTTFMap[] = {
- { ANSI_CHARSET, "Helvetica" },
- { GB2312_CHARSET, "SimSun" },
- { CHINESEBIG5_CHARSET, "MingLiU" },
- { SHIFTJIS_CHARSET, "MS Gothic" },
- { HANGUL_CHARSET, "Batang" },
- { RUSSIAN_CHARSET, "Arial" },
- { EASTEUROPE_CHARSET, "Tahoma" },
- { ARABIC_CHARSET, "Arial" },
- { -1, NULL }
-};
-
-CFX_ByteString CPWL_FontMap::GetDefaultFontByCharset(FX_INT32 nCharset)
-{
- int i = 0;
- while (defaultTTFMap[i].charset != -1) {
- if (nCharset == defaultTTFMap[i].charset)
- return defaultTTFMap[i].fontname;
- ++i;
- }
- return "";
-}
-
-FX_INT32 CPWL_FontMap::CharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset)
-{
- if(m_pSystemHandler && (-1 != m_pSystemHandler->GetCharSet()))
- return m_pSystemHandler->GetCharSet();
- //to avoid CJK Font to show ASCII
- if (word < 0x7F) return ANSI_CHARSET;
- //follow the old charset
- if (nOldCharset != DEFAULT_CHARSET) return nOldCharset;
-
- //find new charset
- if ((word >= 0x4E00 && word <= 0x9FA5) ||
- (word >= 0xE7C7 && word <= 0xE7F3) ||
- (word >= 0x3000 && word <= 0x303F) || //£©"¡¶" "¡·" "¡£" "¡¢"
- (word >= 0x2000 && word <= 0x206F))
- {
- return GB2312_CHARSET;
- }
-
- if (((word >= 0x3040) && (word <= 0x309F)) ||
- ((word >= 0x30A0) && (word <= 0x30FF)) ||
- ((word >= 0x31F0) && (word <= 0x31FF)) ||
- ((word >= 0xFF00) && (word <= 0xFFEF)) )
- {
- return SHIFTJIS_CHARSET;
- }
-
- if (((word >= 0xAC00) && (word <= 0xD7AF)) ||
- ((word >= 0x1100) && (word <= 0x11FF)) ||
- ((word >= 0x3130) && (word <= 0x318F)))
- {
- return HANGUL_CHARSET;
- }
-
- if (word >= 0x0E00 && word <= 0x0E7F)
- return THAI_CHARSET;
-
- if ((word >= 0x0370 && word <= 0x03FF) ||
- (word >= 0x1F00 && word <= 0x1FFF))
- return GREEK_CHARSET;
-
- if ((word >= 0x0600 && word <= 0x06FF) ||
- (word >= 0xFB50 && word <= 0xFEFC))
- return ARABIC_CHARSET;
-
- if (word >= 0x0590 && word <= 0x05FF)
- return HEBREW_CHARSET;
-
- if (word >= 0x0400 && word <= 0x04FF)
- return RUSSIAN_CHARSET;
-
- if (word >= 0x0100 && word <= 0x024F)
- return EASTEUROPE_CHARSET;
-
- if (word >= 0x1E00 && word <= 0x1EFF)
- return VIETNAMESE_CHARSET;
-
- return ANSI_CHARSET;
-}
-
-/* ------------------------ CPWL_DocFontMap ------------------------ */
-
-CPWL_DocFontMap::CPWL_DocFontMap(IFX_SystemHandler* pSystemHandler, CPDF_Document* pAttachedDoc)
- : CPWL_FontMap(pSystemHandler),
- m_pAttachedDoc(pAttachedDoc)
-{
-}
-
-CPWL_DocFontMap::~CPWL_DocFontMap()
-{
-}
-
-CPDF_Document* CPWL_DocFontMap::GetDocument()
-{
- return m_pAttachedDoc;
-}
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_FontMap.h" + +#define DEFAULT_FONT_NAME "Helvetica" + +/* ------------------------------ CPWL_FontMap ------------------------------ */ + +CPWL_FontMap::CPWL_FontMap(IFX_SystemHandler* pSystemHandler) : + m_pPDFDoc(NULL), + m_pSystemHandler(pSystemHandler) +{ + ASSERT(m_pSystemHandler != NULL); +} + +CPWL_FontMap::~CPWL_FontMap() +{ + if (m_pPDFDoc) + { + delete m_pPDFDoc; + m_pPDFDoc = NULL; + } + + Empty(); +} + +void CPWL_FontMap::SetSystemHandler(IFX_SystemHandler* pSystemHandler) +{ + m_pSystemHandler = pSystemHandler; +} + +CPDF_Document* CPWL_FontMap::GetDocument() +{ + if (!m_pPDFDoc) + { + if (CPDF_ModuleMgr::Get()) + { + m_pPDFDoc = FX_NEW CPDF_Document; + m_pPDFDoc->CreateNewDoc(); + } + } + + return m_pPDFDoc; +} + +CPDF_Font* CPWL_FontMap::GetPDFFont(FX_INT32 nFontIndex) +{ + if (nFontIndex >=0 && nFontIndex < m_aData.GetSize()) + { + if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) + { + return pData->pFont; + } + } + + return NULL; +} + +CFX_ByteString CPWL_FontMap::GetPDFFontAlias(FX_INT32 nFontIndex) +{ + if (nFontIndex >=0 && nFontIndex < m_aData.GetSize()) + { + if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) + { + return pData->sFontName; + } + } + + return ""; +} + +FX_BOOL CPWL_FontMap::KnowWord(FX_INT32 nFontIndex, FX_WORD word) +{ + if (nFontIndex >=0 && nFontIndex < m_aData.GetSize()) + { + if (m_aData.GetAt(nFontIndex)) + { + return CharCodeFromUnicode(nFontIndex, word) >= 0; + } + } + + return FALSE; +} + +FX_INT32 CPWL_FontMap::GetWordFontIndex(FX_WORD word, FX_INT32 nCharset, FX_INT32 nFontIndex) +{ + if (nFontIndex > 0) + { + if (KnowWord(nFontIndex, word)) + return nFontIndex; + } + else + { + if (const CPWL_FontMap_Data* pData = GetFontMapData(0)) + { + if (nCharset == DEFAULT_CHARSET || + pData->nCharset == SYMBOL_CHARSET || + nCharset == pData->nCharset) + { + if (KnowWord(0, word)) + { + return 0; + } + } + } + } + + FX_INT32 nNewFontIndex = -1; + + nNewFontIndex = this->GetFontIndex(GetNativeFontName(nCharset), nCharset, TRUE); + if (nNewFontIndex >= 0) + { + if (KnowWord(nNewFontIndex, word)) + return nNewFontIndex; + } + + nNewFontIndex = this->GetFontIndex("Arial Unicode MS", DEFAULT_CHARSET, FALSE); + if (nNewFontIndex >= 0) + { + if (KnowWord(nNewFontIndex, word)) + return nNewFontIndex; + } + + return -1; +} + +FX_INT32 CPWL_FontMap::CharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word) +{ + if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) + { + if (pData->pFont) + { + if (pData->pFont->IsUnicodeCompatible()) + { + int nCharCode = pData->pFont->CharCodeFromUnicode(word); + pData->pFont->GlyphFromCharCode(nCharCode); + return nCharCode; + } + else + { + if (word < 0xFF) + return word; + } + } + } + + return -1; +} + +CFX_ByteString CPWL_FontMap::GetNativeFontName(FX_INT32 nCharset) +{ + //searching native font is slow, so we must save time + for (FX_INT32 i=0,sz=m_aNativeFont.GetSize(); i<sz; i++) + { + if (CPWL_FontMap_Native* pData = m_aNativeFont.GetAt(i)) + { + if (pData->nCharset == nCharset) + return pData->sFontName; + } + } + + CFX_ByteString sNew = GetNativeFont(nCharset); + + if (!sNew.IsEmpty()) + { + CPWL_FontMap_Native* pNewData = new CPWL_FontMap_Native; + pNewData->nCharset = nCharset; + pNewData->sFontName = sNew; + + m_aNativeFont.Add(pNewData); + } + + return sNew; +} + +void CPWL_FontMap::Empty() +{ + { + for (FX_INT32 i=0, sz=m_aData.GetSize(); i<sz; i++) + delete m_aData.GetAt(i); + + m_aData.RemoveAll(); + } + { + for (FX_INT32 i=0, sz=m_aNativeFont.GetSize(); i<sz; i++) + delete m_aNativeFont.GetAt(i); + + m_aNativeFont.RemoveAll(); + } +} + +void CPWL_FontMap::Initial(FX_LPCSTR fontname) +{ + CFX_ByteString sFontName = fontname; + + if (sFontName.IsEmpty()) + sFontName = DEFAULT_FONT_NAME; + + GetFontIndex(sFontName, ANSI_CHARSET, FALSE); + + //GetFontIndex(this->GetNativeFontName(nCharset), nCharset); +} + + +/* +List of currently supported standard fonts: +Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique +Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique +Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic +Symbol, ZapfDingbats +*/ + +const char* g_sDEStandardFontName[] = {"Courier", "Courier-Bold", "Courier-BoldOblique", "Courier-Oblique", + "Helvetica", "Helvetica-Bold", "Helvetica-BoldOblique", "Helvetica-Oblique", + "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic", + "Symbol", "ZapfDingbats"}; + +FX_BOOL CPWL_FontMap::IsStandardFont(const CFX_ByteString& sFontName) +{ + for (FX_INT32 i=0; i<14; i++) + { + if (sFontName == g_sDEStandardFontName[i]) + return TRUE; + } + + return FALSE; +} + +FX_INT32 CPWL_FontMap::FindFont(const CFX_ByteString& sFontName, FX_INT32 nCharset) +{ + for (FX_INT32 i=0,sz=m_aData.GetSize(); i<sz; i++) + { + if (CPWL_FontMap_Data* pData = m_aData.GetAt(i)) + { + if (nCharset == DEFAULT_CHARSET || nCharset == pData->nCharset) + { + if (sFontName.IsEmpty() || pData->sFontName == sFontName) + return i; + } + } + } + + return -1; +} + +FX_INT32 CPWL_FontMap::GetFontIndex(const CFX_ByteString& sFontName, FX_INT32 nCharset, FX_BOOL bFind) +{ + FX_INT32 nFontIndex = FindFont(EncodeFontAlias(sFontName, nCharset), nCharset); + if (nFontIndex >= 0) return nFontIndex; + +// nFontIndex = FindFont("", nCharset); +// if (nFontIndex >= 0) return nFontIndex; + + CFX_ByteString sAlias; + CPDF_Font* pFont = NULL; + + if (bFind) + pFont = FindFontSameCharset(sAlias, nCharset); + + if (!pFont) + { + CFX_ByteString sTemp = sFontName; + pFont = AddFontToDocument(GetDocument(), sTemp, nCharset); + + /* + if (FindFont(sAlias)) + { + sAlias = EncodeFontAlias(sTemp, nCharset); + } + else + */ + { + sAlias = EncodeFontAlias(sTemp, nCharset); + } + } + + AddedFont(pFont, sAlias); + + return AddFontData(pFont, sAlias, nCharset); +} + +FX_INT32 CPWL_FontMap::GetPWLFontIndex(FX_WORD word, FX_INT32 nCharset) +{ + FX_INT32 nFind = -1; + + for (FX_INT32 i=0,sz=m_aData.GetSize(); i<sz; i++) + { + if (CPWL_FontMap_Data* pData = m_aData.GetAt(i)) + { + if (pData->nCharset == nCharset) + { + nFind = i; + break; + } + } + } + + CPDF_Font* pNewFont = GetPDFFont(nFind); + + if (!pNewFont) return -1; + + /* + if (CPDF_Font* pFont = GetPDFFont(nFind)) + { + PWLFont.AddWordToFontDict(pFontDict, word); + } + */ + +#ifdef FOXIT_CHROME_BUILD + CFX_ByteString sAlias = EncodeFontAlias("Arial_Chrome", nCharset); +#else + CFX_ByteString sAlias = EncodeFontAlias("Arial_Foxit", nCharset); +#endif + AddedFont(pNewFont, sAlias); + + return AddFontData(pNewFont, sAlias, nCharset); +} + +CPDF_Font* CPWL_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset) +{ + return NULL; +} + +FX_INT32 CPWL_FontMap::AddFontData(CPDF_Font* pFont, const CFX_ByteString& sFontAlias, FX_INT32 nCharset) +{ + CPWL_FontMap_Data* pNewData = new CPWL_FontMap_Data; + pNewData->pFont = pFont; + pNewData->sFontName = sFontAlias; + pNewData->nCharset = nCharset; + + m_aData.Add(pNewData); + + return m_aData.GetSize() -1; +} + +void CPWL_FontMap::AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias) +{ +} + +CFX_ByteString CPWL_FontMap::GetFontName(FX_INT32 nFontIndex) +{ + if (nFontIndex >=0 && nFontIndex < m_aData.GetSize()) + { + if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) + { + return pData->sFontName; + } + } + + return ""; +} + +CFX_ByteString CPWL_FontMap::GetNativeFont(FX_INT32 nCharset) +{ + CFX_ByteString sFontName; + + if (nCharset == DEFAULT_CHARSET) + nCharset = GetNativeCharset(); + + sFontName = GetDefaultFontByCharset(nCharset); + + if (m_pSystemHandler) + { + if (m_pSystemHandler->FindNativeTrueTypeFont(nCharset, sFontName)) + return sFontName; + + sFontName = m_pSystemHandler->GetNativeTrueTypeFont(nCharset); + } + + return sFontName; +} + +CPDF_Font* CPWL_FontMap::AddFontToDocument(CPDF_Document* pDoc, CFX_ByteString& sFontName, FX_BYTE nCharset) +{ + if (IsStandardFont(sFontName)) + return AddStandardFont(pDoc, sFontName); + else + return AddSystemFont(pDoc, sFontName, nCharset); +} + +CPDF_Font* CPWL_FontMap::AddStandardFont(CPDF_Document* pDoc, CFX_ByteString& sFontName) +{ + if (!pDoc) return NULL; + + CPDF_Font* pFont = NULL; + + if (sFontName == "ZapfDingbats") + pFont = pDoc->AddStandardFont(sFontName, NULL); + else + { + CPDF_FontEncoding fe(PDFFONT_ENCODING_WINANSI); + pFont = pDoc->AddStandardFont(sFontName, &fe); + } + + return pFont; +} + +CPDF_Font* CPWL_FontMap::AddSystemFont(CPDF_Document* pDoc, CFX_ByteString& sFontName, FX_BYTE nCharset) +{ + if (!pDoc) return NULL; + + if (sFontName.IsEmpty()) sFontName = GetNativeFont(nCharset); + if (nCharset == DEFAULT_CHARSET) nCharset = GetNativeCharset(); + + if (m_pSystemHandler) + return m_pSystemHandler->AddNativeTrueTypeFontToPDF(pDoc, sFontName, nCharset); + + return NULL; +} + +CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName, FX_INT32 nCharset) +{ + CFX_ByteString sPostfix; + sPostfix.Format("_%02X", nCharset); + return EncodeFontAlias(sFontName) + sPostfix; +} + +CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName) +{ + CFX_ByteString sRet = sFontName; + sRet.Remove(' '); + return sRet; +} + +FX_INT32 CPWL_FontMap::GetFontMapCount() const +{ + return m_aData.GetSize(); +} + +const CPWL_FontMap_Data* CPWL_FontMap::GetFontMapData(FX_INT32 nIndex) const +{ + if (nIndex >=0 && nIndex < m_aData.GetSize()) + { + return m_aData.GetAt(nIndex); + } + + return NULL; +} + +FX_INT32 CPWL_FontMap::GetNativeCharset() +{ + FX_BYTE nCharset = ANSI_CHARSET; + FX_INT32 iCodePage = FXSYS_GetACP(); + switch (iCodePage) + { + case 932://Japan + nCharset = SHIFTJIS_CHARSET; + break; + case 936://Chinese (PRC, Singapore) + nCharset = GB2312_CHARSET; + break; + case 950://Chinese (Taiwan; Hong Kong SAR, PRC) + nCharset = GB2312_CHARSET; + break; + case 1252://Windows 3.1 Latin 1 (US, Western Europe) + nCharset = ANSI_CHARSET; + break; + case 874://Thai + nCharset = THAI_CHARSET; + break; + case 949://Korean + nCharset = HANGUL_CHARSET; + break; + case 1200://Unicode (BMP of ISO 10646) + nCharset = ANSI_CHARSET; + break; + case 1250://Windows 3.1 Eastern European + nCharset = EASTEUROPE_CHARSET; + break; + case 1251://Windows 3.1 Cyrillic + nCharset = RUSSIAN_CHARSET; + break; + case 1253://Windows 3.1 Greek + nCharset = GREEK_CHARSET; + break; + case 1254://Windows 3.1 Turkish + nCharset = TURKISH_CHARSET; + break; + case 1255://Hebrew + nCharset = HEBREW_CHARSET; + break; + case 1256://Arabic + nCharset = ARABIC_CHARSET; + break; + case 1257://Baltic + nCharset = BALTIC_CHARSET; + break; + case 1258://Vietnamese + nCharset = VIETNAMESE_CHARSET; + break; + case 1361://Korean(Johab) + nCharset = JOHAB_CHARSET; + break; + } + return nCharset; +} + +const CPWL_FontMap::CharsetFontMap CPWL_FontMap::defaultTTFMap[] = { + { ANSI_CHARSET, "Helvetica" }, + { GB2312_CHARSET, "SimSun" }, + { CHINESEBIG5_CHARSET, "MingLiU" }, + { SHIFTJIS_CHARSET, "MS Gothic" }, + { HANGUL_CHARSET, "Batang" }, + { RUSSIAN_CHARSET, "Arial" }, + { EASTEUROPE_CHARSET, "Tahoma" }, + { ARABIC_CHARSET, "Arial" }, + { -1, NULL } +}; + +CFX_ByteString CPWL_FontMap::GetDefaultFontByCharset(FX_INT32 nCharset) +{ + int i = 0; + while (defaultTTFMap[i].charset != -1) { + if (nCharset == defaultTTFMap[i].charset) + return defaultTTFMap[i].fontname; + ++i; + } + return ""; +} + +FX_INT32 CPWL_FontMap::CharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset) +{ + if(m_pSystemHandler && (-1 != m_pSystemHandler->GetCharSet())) + return m_pSystemHandler->GetCharSet(); + //to avoid CJK Font to show ASCII + if (word < 0x7F) return ANSI_CHARSET; + //follow the old charset + if (nOldCharset != DEFAULT_CHARSET) return nOldCharset; + + //find new charset + if ((word >= 0x4E00 && word <= 0x9FA5) || + (word >= 0xE7C7 && word <= 0xE7F3) || + (word >= 0x3000 && word <= 0x303F) || //£©"¡¶" "¡·" "¡£" "¡¢" + (word >= 0x2000 && word <= 0x206F)) + { + return GB2312_CHARSET; + } + + if (((word >= 0x3040) && (word <= 0x309F)) || + ((word >= 0x30A0) && (word <= 0x30FF)) || + ((word >= 0x31F0) && (word <= 0x31FF)) || + ((word >= 0xFF00) && (word <= 0xFFEF)) ) + { + return SHIFTJIS_CHARSET; + } + + if (((word >= 0xAC00) && (word <= 0xD7AF)) || + ((word >= 0x1100) && (word <= 0x11FF)) || + ((word >= 0x3130) && (word <= 0x318F))) + { + return HANGUL_CHARSET; + } + + if (word >= 0x0E00 && word <= 0x0E7F) + return THAI_CHARSET; + + if ((word >= 0x0370 && word <= 0x03FF) || + (word >= 0x1F00 && word <= 0x1FFF)) + return GREEK_CHARSET; + + if ((word >= 0x0600 && word <= 0x06FF) || + (word >= 0xFB50 && word <= 0xFEFC)) + return ARABIC_CHARSET; + + if (word >= 0x0590 && word <= 0x05FF) + return HEBREW_CHARSET; + + if (word >= 0x0400 && word <= 0x04FF) + return RUSSIAN_CHARSET; + + if (word >= 0x0100 && word <= 0x024F) + return EASTEUROPE_CHARSET; + + if (word >= 0x1E00 && word <= 0x1EFF) + return VIETNAMESE_CHARSET; + + return ANSI_CHARSET; +} + +/* ------------------------ CPWL_DocFontMap ------------------------ */ + +CPWL_DocFontMap::CPWL_DocFontMap(IFX_SystemHandler* pSystemHandler, CPDF_Document* pAttachedDoc) + : CPWL_FontMap(pSystemHandler), + m_pAttachedDoc(pAttachedDoc) +{ +} + +CPWL_DocFontMap::~CPWL_DocFontMap() +{ +} + +CPDF_Document* CPWL_DocFontMap::GetDocument() +{ + return m_pAttachedDoc; +} diff --git a/fpdfsdk/src/pdfwindow/PWL_Icon.cpp b/fpdfsdk/src/pdfwindow/PWL_Icon.cpp index a859a52de7..b85b845553 100644 --- a/fpdfsdk/src/pdfwindow/PWL_Icon.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_Icon.cpp @@ -1,272 +1,272 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_Icon.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-
-/* ------------------------------- CPWL_Image ---------------------------------- */
-
-CPWL_Image::CPWL_Image() : m_pPDFStream(NULL)
-{
-}
-
-CPWL_Image::~CPWL_Image()
-{
-}
-
-CFX_ByteString CPWL_Image::GetImageAppStream()
-{
- CFX_ByteTextBuf sAppStream;
-
- CFX_ByteString sAlias = this->GetImageAlias();
- CPDF_Rect rcPlate = GetClientRect();
- CPDF_Matrix mt;
- mt.SetReverse(GetImageMatrix());
-
- FX_FLOAT fHScale = 1.0f;
- FX_FLOAT fVScale = 1.0f;
- GetScale(fHScale,fVScale);
-
- FX_FLOAT fx = 0.0f;
- FX_FLOAT fy = 0.0f;
- GetImageOffset(fx,fy);
-
- if (m_pPDFStream && sAlias.GetLength()>0)
- {
- sAppStream << "q\n";
- sAppStream << rcPlate.left << " " << rcPlate.bottom << " "
- << rcPlate.right - rcPlate.left << " " << rcPlate.top - rcPlate.bottom << " re W n\n";
-
- sAppStream << fHScale << " 0 0 " << fVScale << " " << rcPlate.left + fx << " " << rcPlate.bottom + fy << " cm\n";
- sAppStream << mt.GetA() << " " << mt.GetB() << " " << mt.GetC() << " " << mt.GetD() << " " << mt.GetE() << " " << mt.GetF() << " cm\n";
-
- sAppStream << "0 g 0 G 1 w /" << sAlias << " Do\n" << "Q\n";
- }
-
- return sAppStream.GetByteString();
-}
-
-void CPWL_Image::SetPDFStream(CPDF_Stream * pStream)
-{
- m_pPDFStream = pStream;
-}
-
-CPDF_Stream * CPWL_Image::GetPDFStream()
-{
- return this->m_pPDFStream;
-}
-
-void CPWL_Image::GetImageSize(FX_FLOAT & fWidth,FX_FLOAT & fHeight)
-{
- fWidth = 0.0f;
- fHeight = 0.0f;
-
- if (m_pPDFStream)
- {
- if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict())
- {
- CPDF_Rect rect = pDict->GetRect("BBox");
-
- fWidth = rect.right - rect.left;
- fHeight = rect.top - rect.bottom;
- }
- }
-}
-
-CPDF_Matrix CPWL_Image::GetImageMatrix()
-{
- if (m_pPDFStream)
- {
- if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict())
- {
- return pDict->GetMatrix("Matrix");
- }
- }
-
- return CPDF_Matrix();
-}
-
-CFX_ByteString CPWL_Image::GetImageAlias()
-{
- if (m_sImageAlias.IsEmpty())
- {
- if (m_pPDFStream)
- {
- if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict())
- {
- return pDict->GetString("Name");
- }
- }
- }
- else
- return m_sImageAlias;
-
- return CFX_ByteString();
-}
-
-void CPWL_Image::SetImageAlias(FX_LPCSTR sImageAlias)
-{
- m_sImageAlias = sImageAlias;
-}
-
-void CPWL_Image::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale)
-{
- fHScale = 1.0f;
- fVScale = 1.0f;
-}
-
-
-void CPWL_Image::GetImageOffset(FX_FLOAT & x,FX_FLOAT & y)
-{
- x = 0.0f;
- y = 0.0f;
-}
-
-/* ------------------------------- CPWL_Icon ---------------------------------- */
-
-CPWL_Icon::CPWL_Icon() : m_pIconFit(NULL)
-{
-}
-
-CPWL_Icon::~CPWL_Icon()
-{
-}
-
-FX_INT32 CPWL_Icon::GetScaleMethod()
-{
- if (m_pIconFit)
- return m_pIconFit->GetScaleMethod();
-
- return 0;
-}
-
-FX_BOOL CPWL_Icon::IsProportionalScale()
-{
- if (m_pIconFit)
- return m_pIconFit->IsProportionalScale();
-
- return FALSE;
-}
-
-void CPWL_Icon::GetIconPosition(FX_FLOAT & fLeft, FX_FLOAT & fBottom)
-{
- if (m_pIconFit)
- {
- //m_pIconFit->GetIconPosition(fLeft,fBottom);
- fLeft = 0.0f;
- fBottom = 0.0f;
- CPDF_Array* pA = m_pIconFit->m_pDict->GetArray("A");
- if (pA != NULL)
- {
- FX_DWORD dwCount = pA->GetCount();
- if (dwCount > 0) fLeft = pA->GetNumber(0);
- if (dwCount > 1) fBottom = pA->GetNumber(1);
- }
- }
- else
- {
- fLeft = 0.0f;
- fBottom = 0.0f;
- }
-}
-
-FX_BOOL CPWL_Icon::GetFittingBounds()
-{
- if (m_pIconFit)
- return m_pIconFit->GetFittingBounds();
-
- return FALSE;
-}
-
-void CPWL_Icon::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale)
-{
- fHScale = 1.0f;
- fVScale = 1.0f;
-
- if (m_pPDFStream)
- {
- FX_FLOAT fImageWidth,fImageHeight;
- FX_FLOAT fPlateWidth,fPlateHeight;
-
- CPDF_Rect rcPlate = this->GetClientRect();
- fPlateWidth = rcPlate.right - rcPlate.left;
- fPlateHeight = rcPlate.top - rcPlate.bottom;
-
- GetImageSize(fImageWidth,fImageHeight);
-
- FX_INT32 nScaleMethod = this->GetScaleMethod();
-
- /*
- enum ScaleMethod
- {
- Always = 0, //A, Always scale
- Bigger, //B, Scale only when the icon is bigger than the annotation rectangle
- Smaller, //S, Scale only when the icon is smaller then the annotation rectangle
- Never //N, Never scale
- };
- */
-
- switch (nScaleMethod)
- {
- default:
- case 0:
- fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f);
- fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f);
- break;
- case 1:
- if (fPlateWidth < fImageWidth)
- fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f);
- if (fPlateHeight < fImageHeight)
- fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f);
- break;
- case 2:
- if (fPlateWidth > fImageWidth)
- fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f);
- if (fPlateHeight > fImageHeight)
- fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f);
- break;
- case 3:
- break;
- }
-
- FX_FLOAT fMinScale;
- if (IsProportionalScale())
- {
- fMinScale = PWL_MIN(fHScale,fVScale);
- fHScale = fMinScale;
- fVScale = fMinScale;
- }
- }
-}
-
-void CPWL_Icon::GetImageOffset(FX_FLOAT & x,FX_FLOAT & y)
-{
- FX_FLOAT fLeft,fBottom;
-
- this->GetIconPosition(fLeft,fBottom);
- x = 0.0f;
- y = 0.0f;
-
- FX_FLOAT fImageWidth,fImageHeight;
- GetImageSize(fImageWidth,fImageHeight);
-
- FX_FLOAT fHScale,fVScale;
- GetScale(fHScale,fVScale);
-
- FX_FLOAT fImageFactWidth = fImageWidth * fHScale;
- FX_FLOAT fImageFactHeight = fImageHeight * fVScale;
-
- FX_FLOAT fPlateWidth,fPlateHeight;
- CPDF_Rect rcPlate = this->GetClientRect();
- fPlateWidth = rcPlate.right - rcPlate.left;
- fPlateHeight = rcPlate.top - rcPlate.bottom;
-
- x = (fPlateWidth - fImageFactWidth) * fLeft;
- y = (fPlateHeight - fImageFactHeight) * fBottom;
-}
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_Icon.h" +#include "../../include/pdfwindow/PWL_Utils.h" + +/* ------------------------------- CPWL_Image ---------------------------------- */ + +CPWL_Image::CPWL_Image() : m_pPDFStream(NULL) +{ +} + +CPWL_Image::~CPWL_Image() +{ +} + +CFX_ByteString CPWL_Image::GetImageAppStream() +{ + CFX_ByteTextBuf sAppStream; + + CFX_ByteString sAlias = this->GetImageAlias(); + CPDF_Rect rcPlate = GetClientRect(); + CPDF_Matrix mt; + mt.SetReverse(GetImageMatrix()); + + FX_FLOAT fHScale = 1.0f; + FX_FLOAT fVScale = 1.0f; + GetScale(fHScale,fVScale); + + FX_FLOAT fx = 0.0f; + FX_FLOAT fy = 0.0f; + GetImageOffset(fx,fy); + + if (m_pPDFStream && sAlias.GetLength()>0) + { + sAppStream << "q\n"; + sAppStream << rcPlate.left << " " << rcPlate.bottom << " " + << rcPlate.right - rcPlate.left << " " << rcPlate.top - rcPlate.bottom << " re W n\n"; + + sAppStream << fHScale << " 0 0 " << fVScale << " " << rcPlate.left + fx << " " << rcPlate.bottom + fy << " cm\n"; + sAppStream << mt.GetA() << " " << mt.GetB() << " " << mt.GetC() << " " << mt.GetD() << " " << mt.GetE() << " " << mt.GetF() << " cm\n"; + + sAppStream << "0 g 0 G 1 w /" << sAlias << " Do\n" << "Q\n"; + } + + return sAppStream.GetByteString(); +} + +void CPWL_Image::SetPDFStream(CPDF_Stream * pStream) +{ + m_pPDFStream = pStream; +} + +CPDF_Stream * CPWL_Image::GetPDFStream() +{ + return this->m_pPDFStream; +} + +void CPWL_Image::GetImageSize(FX_FLOAT & fWidth,FX_FLOAT & fHeight) +{ + fWidth = 0.0f; + fHeight = 0.0f; + + if (m_pPDFStream) + { + if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict()) + { + CPDF_Rect rect = pDict->GetRect("BBox"); + + fWidth = rect.right - rect.left; + fHeight = rect.top - rect.bottom; + } + } +} + +CPDF_Matrix CPWL_Image::GetImageMatrix() +{ + if (m_pPDFStream) + { + if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict()) + { + return pDict->GetMatrix("Matrix"); + } + } + + return CPDF_Matrix(); +} + +CFX_ByteString CPWL_Image::GetImageAlias() +{ + if (m_sImageAlias.IsEmpty()) + { + if (m_pPDFStream) + { + if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict()) + { + return pDict->GetString("Name"); + } + } + } + else + return m_sImageAlias; + + return CFX_ByteString(); +} + +void CPWL_Image::SetImageAlias(FX_LPCSTR sImageAlias) +{ + m_sImageAlias = sImageAlias; +} + +void CPWL_Image::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale) +{ + fHScale = 1.0f; + fVScale = 1.0f; +} + + +void CPWL_Image::GetImageOffset(FX_FLOAT & x,FX_FLOAT & y) +{ + x = 0.0f; + y = 0.0f; +} + +/* ------------------------------- CPWL_Icon ---------------------------------- */ + +CPWL_Icon::CPWL_Icon() : m_pIconFit(NULL) +{ +} + +CPWL_Icon::~CPWL_Icon() +{ +} + +FX_INT32 CPWL_Icon::GetScaleMethod() +{ + if (m_pIconFit) + return m_pIconFit->GetScaleMethod(); + + return 0; +} + +FX_BOOL CPWL_Icon::IsProportionalScale() +{ + if (m_pIconFit) + return m_pIconFit->IsProportionalScale(); + + return FALSE; +} + +void CPWL_Icon::GetIconPosition(FX_FLOAT & fLeft, FX_FLOAT & fBottom) +{ + if (m_pIconFit) + { + //m_pIconFit->GetIconPosition(fLeft,fBottom); + fLeft = 0.0f; + fBottom = 0.0f; + CPDF_Array* pA = m_pIconFit->m_pDict->GetArray("A"); + if (pA != NULL) + { + FX_DWORD dwCount = pA->GetCount(); + if (dwCount > 0) fLeft = pA->GetNumber(0); + if (dwCount > 1) fBottom = pA->GetNumber(1); + } + } + else + { + fLeft = 0.0f; + fBottom = 0.0f; + } +} + +FX_BOOL CPWL_Icon::GetFittingBounds() +{ + if (m_pIconFit) + return m_pIconFit->GetFittingBounds(); + + return FALSE; +} + +void CPWL_Icon::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale) +{ + fHScale = 1.0f; + fVScale = 1.0f; + + if (m_pPDFStream) + { + FX_FLOAT fImageWidth,fImageHeight; + FX_FLOAT fPlateWidth,fPlateHeight; + + CPDF_Rect rcPlate = this->GetClientRect(); + fPlateWidth = rcPlate.right - rcPlate.left; + fPlateHeight = rcPlate.top - rcPlate.bottom; + + GetImageSize(fImageWidth,fImageHeight); + + FX_INT32 nScaleMethod = this->GetScaleMethod(); + + /* + enum ScaleMethod + { + Always = 0, //A, Always scale + Bigger, //B, Scale only when the icon is bigger than the annotation rectangle + Smaller, //S, Scale only when the icon is smaller then the annotation rectangle + Never //N, Never scale + }; + */ + + switch (nScaleMethod) + { + default: + case 0: + fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f); + fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f); + break; + case 1: + if (fPlateWidth < fImageWidth) + fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f); + if (fPlateHeight < fImageHeight) + fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f); + break; + case 2: + if (fPlateWidth > fImageWidth) + fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f); + if (fPlateHeight > fImageHeight) + fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f); + break; + case 3: + break; + } + + FX_FLOAT fMinScale; + if (IsProportionalScale()) + { + fMinScale = PWL_MIN(fHScale,fVScale); + fHScale = fMinScale; + fVScale = fMinScale; + } + } +} + +void CPWL_Icon::GetImageOffset(FX_FLOAT & x,FX_FLOAT & y) +{ + FX_FLOAT fLeft,fBottom; + + this->GetIconPosition(fLeft,fBottom); + x = 0.0f; + y = 0.0f; + + FX_FLOAT fImageWidth,fImageHeight; + GetImageSize(fImageWidth,fImageHeight); + + FX_FLOAT fHScale,fVScale; + GetScale(fHScale,fVScale); + + FX_FLOAT fImageFactWidth = fImageWidth * fHScale; + FX_FLOAT fImageFactHeight = fImageHeight * fVScale; + + FX_FLOAT fPlateWidth,fPlateHeight; + CPDF_Rect rcPlate = this->GetClientRect(); + fPlateWidth = rcPlate.right - rcPlate.left; + fPlateHeight = rcPlate.top - rcPlate.bottom; + + x = (fPlateWidth - fImageFactWidth) * fLeft; + y = (fPlateHeight - fImageFactHeight) * fBottom; +} + diff --git a/fpdfsdk/src/pdfwindow/PWL_IconList.cpp b/fpdfsdk/src/pdfwindow/PWL_IconList.cpp index 09b66786db..72317908bb 100644 --- a/fpdfsdk/src/pdfwindow/PWL_IconList.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_IconList.cpp @@ -1,592 +1,592 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_ListCtrl.h"
-#include "../../include/pdfwindow/PWL_IconList.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-#include "../../include/pdfwindow/PWL_ScrollBar.h"
-#include "../../include/pdfwindow/PWL_Label.h"
-
-#define PWL_IconList_ITEM_ICON_LEFTMARGIN 10.0f
-#define PWL_IconList_ITEM_WIDTH 20.0f
-#define PWL_IconList_ITEM_HEIGHT 20.0f
-#define PWL_IconList_ITEM_SPACE 4.0f
-
-/* ------------------ CPWL_IconList_Item ------------------- */
-
-CPWL_IconList_Item::CPWL_IconList_Item() :
- m_nIconIndex(-1),
- m_pData(NULL),
- m_bSelected(FALSE),
- m_pText(NULL)
-{
-}
-
-CPWL_IconList_Item::~CPWL_IconList_Item()
-{
-}
-
-CFX_ByteString CPWL_IconList_Item::GetClassName() const
-{
- return "CPWL_IconList_Item";
-}
-
-FX_FLOAT CPWL_IconList_Item::GetItemHeight(FX_FLOAT fLimitWidth)
-{
- return PWL_IconList_ITEM_HEIGHT;
-}
-
-void CPWL_IconList_Item::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- CPDF_Rect rcClient = GetClientRect();
-
- if (m_bSelected)
- {
- if (this->IsEnabled())
- {
- CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcClient,
- CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_SELBACKCOLOR,this->GetTransparency()));
- }
- else
- {
- CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcClient,
- CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_LIGHTGRAYCOLOR,this->GetTransparency()));
- }
- }
-
- CPDF_Rect rcIcon = rcClient;
- rcIcon.left += PWL_IconList_ITEM_ICON_LEFTMARGIN;
- rcIcon.right = rcIcon.left + PWL_IconList_ITEM_WIDTH;
-
- CPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, m_nIconIndex, rcIcon,
- m_crIcon, m_pText->GetTextColor(), this->GetTransparency());
-}
-
-void CPWL_IconList_Item::SetSelect(FX_BOOL bSelected)
-{
- m_bSelected = bSelected;
-
- if (bSelected)
- m_pText->SetTextColor(PWL_DEFAULT_WHITECOLOR);
- else
- m_pText->SetTextColor(PWL_DEFAULT_BLACKCOLOR);
-
-}
-
-FX_BOOL CPWL_IconList_Item::IsSelected() const
-{
- return m_bSelected;
-}
-
-void CPWL_IconList_Item::CreateChildWnd(const PWL_CREATEPARAM & cp)
-{
- m_pText = new CPWL_Label;
-
- PWL_CREATEPARAM lcp = cp;
- lcp.pParentWnd = this;
- lcp.dwFlags = PWS_CHILD | PWS_VISIBLE | PES_LEFT | PES_CENTER;
- lcp.sTextColor = PWL_DEFAULT_BLACKCOLOR;
- lcp.fFontSize = 12;
- m_pText->Create(lcp);
-}
-
-void CPWL_IconList_Item::SetData(void* pData)
-{
- m_pData = pData;
-}
-
-void CPWL_IconList_Item::SetIcon(FX_INT32 nIconIndex)
-{
- m_nIconIndex = nIconIndex;
-}
-
-void CPWL_IconList_Item::SetText(const CFX_WideString& str)
-{
- m_pText->SetText(str);
-}
-
-CFX_WideString CPWL_IconList_Item::GetText() const
-{
- return m_pText->GetText();
-}
-
-void CPWL_IconList_Item::RePosChildWnd()
-{
- CPDF_Rect rcClient = GetClientRect();
-
- rcClient.left += (PWL_IconList_ITEM_ICON_LEFTMARGIN + PWL_IconList_ITEM_WIDTH + PWL_IconList_ITEM_ICON_LEFTMARGIN);
-
- m_pText->Move(rcClient, TRUE, FALSE);
-}
-
-void CPWL_IconList_Item::SetIconFillColor(const CPWL_Color& color)
-{
- m_crIcon = color;
-}
-
-void CPWL_IconList_Item::OnEnabled()
-{
- if (m_bSelected)
- m_pText->SetTextColor(PWL_DEFAULT_WHITECOLOR);
- else
- m_pText->SetTextColor(PWL_DEFAULT_BLACKCOLOR);
-
- this->InvalidateRect();
-}
-
-void CPWL_IconList_Item::OnDisabled()
-{
- m_pText->SetTextColor(PWL_DEFAULT_HEAVYGRAYCOLOR);
-
- this->InvalidateRect();
-}
-
-/* ----------------- CPWL_IconList_Content ----------------- */
-
-CPWL_IconList_Content::CPWL_IconList_Content(FX_INT32 nListCount) :
- m_nSelectIndex(-1),
- m_pNotify(NULL),
- m_bEnableNotify(TRUE),
- m_bMouseDown(FALSE),
- m_nListCount(nListCount)
-{
-}
-
-CPWL_IconList_Content::~CPWL_IconList_Content()
-{
-}
-
-void CPWL_IconList_Content::CreateChildWnd(const PWL_CREATEPARAM & cp)
-{
- for (FX_INT32 i=0; i<m_nListCount; i++)
- {
- CPWL_IconList_Item* pNewItem = new CPWL_IconList_Item();
-
- PWL_CREATEPARAM icp = cp;
- icp.pParentWnd = this;
- icp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_NOREFRESHCLIP;
- pNewItem->Create(icp);
- }
-
- this->SetItemSpace(PWL_IconList_ITEM_SPACE);
- this->ResetContent(0);
-
- if (CPWL_Wnd * pParent = this->GetParentWindow())
- {
- CPDF_Rect rcScroll = this->GetScrollArea();
- this->GetScrollPos();
-
- PWL_SCROLL_INFO sInfo;
- sInfo.fContentMin = rcScroll.bottom;
- sInfo.fContentMax = rcScroll.top;
- sInfo.fPlateWidth = GetClientRect().Height();
- sInfo.fSmallStep = 13.0f;
- sInfo.fBigStep = sInfo.fPlateWidth;
-
- pParent->OnNotify(this, PNM_SETSCROLLINFO, SBT_VSCROLL, (FX_INTPTR)&sInfo);
- }
-}
-
-FX_BOOL CPWL_IconList_Content::OnLButtonDown(const CPDF_Point & point)
-{
- SetFocus();
-
- SetCapture();
- m_bMouseDown = TRUE;
-
- FX_INT32 nItemIndex = FindItemIndex(point);
- SetSelect(nItemIndex);
- ScrollToItem(nItemIndex);
-
- return TRUE;
-}
-
-FX_BOOL CPWL_IconList_Content::OnLButtonUp(const CPDF_Point & point)
-{
- m_bMouseDown = FALSE;
- ReleaseCapture();
-
- return TRUE;
-}
-
-FX_BOOL CPWL_IconList_Content::OnMouseMove(const CPDF_Point & point)
-{
- if (m_bMouseDown)
- {
- FX_INT32 nItemIndex = FindItemIndex(point);
- SetSelect(nItemIndex);
- ScrollToItem(nItemIndex);
- }
-
- return TRUE;
-}
-
-FX_BOOL CPWL_IconList_Content::OnKeyDown(FX_WORD nChar)
-{
- switch (nChar)
- {
- case FWL_VKEY_Up:
- if (m_nSelectIndex > 0)
- {
- FX_INT32 nItemIndex = m_nSelectIndex - 1;
- SetSelect(nItemIndex);
- ScrollToItem(nItemIndex);
- }
- return TRUE;
- case FWL_VKEY_Down:
- if (m_nSelectIndex < m_nListCount-1)
- {
- FX_INT32 nItemIndex = m_nSelectIndex + 1;
- SetSelect(nItemIndex);
- ScrollToItem(nItemIndex);
- }
- return TRUE;
- }
-
- return FALSE;
-}
-
-FX_INT32 CPWL_IconList_Content::FindItemIndex(const CPDF_Point& point)
-{
- FX_INT32 nIndex = 0;
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
- {
- CPDF_Rect rcWnd = pChild->ChildToParent(pChild->GetWindowRect());
-
- if (point.y < rcWnd.top)
- {
- nIndex = i;
- }
- }
- }
-
- return nIndex;
-}
-
-void CPWL_IconList_Content::ScrollToItem(FX_INT32 nItemIndex)
-{
- CPDF_Rect rcClient = GetClientRect();
-
- if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
- {
- CPDF_Rect rcOrigin = pItem->GetWindowRect();
- CPDF_Rect rcWnd = pItem->ChildToParent(rcOrigin);
-
- if (!(rcWnd.bottom > rcClient.bottom && rcWnd.top < rcClient.top))
- {
- CPDF_Point ptScroll = GetScrollPos();
-
- if (rcWnd.top > rcClient.top)
- {
- ptScroll.y = rcOrigin.top;
- }
- else if (rcWnd.bottom < rcClient.bottom)
- {
- ptScroll.y = rcOrigin.bottom + rcClient.Height();
- }
-
- this->SetScrollPos(ptScroll);
- this->ResetFace();
- this->InvalidateRect();
- if (CPWL_Wnd* pParent = this->GetParentWindow())
- {
- pParent->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);
- }
- }
- }
-}
-
-void CPWL_IconList_Content::SetSelect(FX_INT32 nIndex)
-{
- if (m_nSelectIndex != nIndex)
- {
- SelectItem(m_nSelectIndex, FALSE);
- SelectItem(nIndex, TRUE);
- m_nSelectIndex = nIndex;
-
- if (IPWL_IconList_Notify* pNotify = GetNotify())
- pNotify->OnNoteListSelChanged(nIndex);
- }
-}
-
-FX_INT32 CPWL_IconList_Content::GetSelect() const
-{
- return m_nSelectIndex;
-}
-
-IPWL_IconList_Notify* CPWL_IconList_Content::GetNotify() const
-{
- if (m_bEnableNotify)
- return m_pNotify;
- return NULL;
-}
-
-void CPWL_IconList_Content::SetNotify(IPWL_IconList_Notify* pNotify)
-{
- m_pNotify = pNotify;
-}
-
-void CPWL_IconList_Content::EnableNotify(FX_BOOL bNotify)
-{
- m_bEnableNotify = bNotify;
-}
-
-void CPWL_IconList_Content::SelectItem(FX_INT32 nItemIndex, FX_BOOL bSelect)
-{
- if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
- {
- pItem->SetSelect(bSelect);
- pItem->InvalidateRect();
- }
-}
-
-CPWL_IconList_Item* CPWL_IconList_Content::GetListItem(FX_INT32 nItemIndex) const
-{
- if (nItemIndex >= 0 && nItemIndex<m_aChildren.GetSize())
- {
- if (CPWL_Wnd * pChild = m_aChildren.GetAt(nItemIndex))
- {
- if (pChild->GetClassName() == "CPWL_IconList_Item")
- {
- return (CPWL_IconList_Item*)pChild;
- }
- }
- }
-
- return NULL;
-}
-
-void CPWL_IconList_Content::SetListData(FX_INT32 nItemIndex, void* pData)
-{
- if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
- pItem->SetData(pData);
-}
-
-void CPWL_IconList_Content::SetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex)
-{
- if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
- pItem->SetIcon(nIconIndex);
-}
-
-void CPWL_IconList_Content::SetListString(FX_INT32 nItemIndex, const CFX_WideString& str)
-{
- if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
- pItem->SetText(str);
-}
-
-CFX_WideString CPWL_IconList_Content::GetListString(FX_INT32 nItemIndex) const
-{
- if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
- return pItem->GetText();
-
- return L"";
-}
-
-void CPWL_IconList_Content::SetIconFillColor(const CPWL_Color& color)
-{
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
- {
- if (pChild->GetClassName() == "CPWL_IconList_Item")
- {
- CPWL_IconList_Item* pItem = (CPWL_IconList_Item*)pChild;
- pItem->SetIconFillColor(color);
- pItem->InvalidateRect();
- }
- }
- }
-
-}
-
-/* -------------------- CPWL_IconList --------------------- */
-
-CPWL_IconList::CPWL_IconList(FX_INT32 nListCount) :
- m_pListContent(NULL),
- m_nListCount(nListCount)
-{
-}
-
-CPWL_IconList::~CPWL_IconList()
-{
-}
-
-void CPWL_IconList::RePosChildWnd()
-{
- CPWL_Wnd::RePosChildWnd();
-
- if (m_pListContent)
- m_pListContent->Move(GetClientRect(), TRUE, FALSE);
-}
-
-void CPWL_IconList::CreateChildWnd(const PWL_CREATEPARAM & cp)
-{
- m_pListContent = new CPWL_IconList_Content(m_nListCount);
-
- PWL_CREATEPARAM ccp = cp;
- ccp.pParentWnd = this;
- ccp.dwFlags = PWS_CHILD | PWS_VISIBLE;
- m_pListContent->Create(ccp);
-}
-
-void CPWL_IconList::OnCreated()
-{
- if (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar())
- {
- pScrollBar->RemoveFlag(PWS_AUTOTRANSPARENT);
- pScrollBar->SetTransparency(255);
- pScrollBar->SetNotifyForever(TRUE);
- }
-}
-
-void CPWL_IconList::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
-{
- CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);
-
- if (wParam == SBT_VSCROLL)
- {
- switch (msg)
- {
- case PNM_SETSCROLLINFO:
- if (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam)
- {
- if (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar())
- {
- if (pInfo->fContentMax - pInfo->fContentMin > pInfo->fPlateWidth)
- {
- if (!pScrollBar->IsVisible())
- {
- pScrollBar->SetVisible(TRUE);
- RePosChildWnd();
- }
- else
- {
- }
- }
- else
- {
- if (pScrollBar->IsVisible())
- {
- pScrollBar->SetVisible(FALSE);
- RePosChildWnd();
- }
-
- if (m_pListContent)
- m_pListContent->SetScrollPos(CPDF_Point(0.0f,0.0f));
- }
-
- pScrollBar->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam);
- }
- }
- return;
- case PNM_SCROLLWINDOW:
- if (m_pListContent)
- {
- m_pListContent->SetScrollPos(CPDF_Point(0.0f, *(FX_FLOAT*)lParam));
- m_pListContent->ResetFace();
- m_pListContent->InvalidateRect(NULL);
- }
- return;
- case PNM_SETSCROLLPOS:
- if (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar())
- pScrollBar->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);
- return;
- }
- }
-}
-
-void CPWL_IconList::SetSelect(FX_INT32 nIndex)
-{
- m_pListContent->SetSelect(nIndex);
-}
-
-void CPWL_IconList::SetTopItem(FX_INT32 nIndex)
-{
- m_pListContent->ScrollToItem(nIndex);
-}
-
-FX_INT32 CPWL_IconList::GetSelect() const
-{
- return m_pListContent->GetSelect();
-}
-
-void CPWL_IconList::SetNotify(IPWL_IconList_Notify* pNotify)
-{
- m_pListContent->SetNotify(pNotify);
-}
-
-void CPWL_IconList::EnableNotify(FX_BOOL bNotify)
-{
- m_pListContent->EnableNotify(bNotify);
-}
-
-void CPWL_IconList::SetListData(FX_INT32 nItemIndex, void* pData)
-{
- m_pListContent->SetListData(nItemIndex, pData);
-}
-
-void CPWL_IconList::SetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex)
-{
- m_pListContent->SetListIcon(nItemIndex, nIconIndex);
-}
-
-void CPWL_IconList::SetListString(FX_INT32 nItemIndex, const CFX_WideString& str)
-{
- m_pListContent->SetListString(nItemIndex, str);
-}
-
-CFX_WideString CPWL_IconList::GetListString(FX_INT32 nItemIndex) const
-{
- return m_pListContent->GetListString(nItemIndex);
-}
-
-void CPWL_IconList::SetIconFillColor(const CPWL_Color& color)
-{
- m_pListContent->SetIconFillColor(color);
-}
-
-FX_BOOL CPWL_IconList::OnMouseWheel(short zDelta, const CPDF_Point & point)
-{
- CPDF_Point ptScroll = m_pListContent->GetScrollPos();
- CPDF_Rect rcScroll = m_pListContent->GetScrollArea();
- CPDF_Rect rcContents = m_pListContent->GetClientRect();
-
- if (rcScroll.top - rcScroll.bottom > rcContents.Height())
- {
- CPDF_Point ptNew = ptScroll;
-
- if (zDelta > 0)
- ptNew.y += 30;
- else
- ptNew.y -= 30;
-
- if (ptNew.y > rcScroll.top)
- ptNew.y = rcScroll.top;
- if (ptNew.y < rcScroll.bottom + rcContents.Height())
- ptNew.y = rcScroll.bottom + rcContents.Height();
- if (ptNew.y < rcScroll.bottom)
- ptNew.y = rcScroll.bottom;
-
- if (ptNew.y != ptScroll.y)
- {
- m_pListContent->SetScrollPos(ptNew);
- m_pListContent->ResetFace();
- m_pListContent->InvalidateRect(NULL);
-
- if (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar())
- pScrollBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);
-
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_ListCtrl.h" +#include "../../include/pdfwindow/PWL_IconList.h" +#include "../../include/pdfwindow/PWL_Utils.h" +#include "../../include/pdfwindow/PWL_ScrollBar.h" +#include "../../include/pdfwindow/PWL_Label.h" + +#define PWL_IconList_ITEM_ICON_LEFTMARGIN 10.0f +#define PWL_IconList_ITEM_WIDTH 20.0f +#define PWL_IconList_ITEM_HEIGHT 20.0f +#define PWL_IconList_ITEM_SPACE 4.0f + +/* ------------------ CPWL_IconList_Item ------------------- */ + +CPWL_IconList_Item::CPWL_IconList_Item() : + m_nIconIndex(-1), + m_pData(NULL), + m_bSelected(FALSE), + m_pText(NULL) +{ +} + +CPWL_IconList_Item::~CPWL_IconList_Item() +{ +} + +CFX_ByteString CPWL_IconList_Item::GetClassName() const +{ + return "CPWL_IconList_Item"; +} + +FX_FLOAT CPWL_IconList_Item::GetItemHeight(FX_FLOAT fLimitWidth) +{ + return PWL_IconList_ITEM_HEIGHT; +} + +void CPWL_IconList_Item::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + CPDF_Rect rcClient = GetClientRect(); + + if (m_bSelected) + { + if (this->IsEnabled()) + { + CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcClient, + CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_SELBACKCOLOR,this->GetTransparency())); + } + else + { + CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcClient, + CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_LIGHTGRAYCOLOR,this->GetTransparency())); + } + } + + CPDF_Rect rcIcon = rcClient; + rcIcon.left += PWL_IconList_ITEM_ICON_LEFTMARGIN; + rcIcon.right = rcIcon.left + PWL_IconList_ITEM_WIDTH; + + CPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, m_nIconIndex, rcIcon, + m_crIcon, m_pText->GetTextColor(), this->GetTransparency()); +} + +void CPWL_IconList_Item::SetSelect(FX_BOOL bSelected) +{ + m_bSelected = bSelected; + + if (bSelected) + m_pText->SetTextColor(PWL_DEFAULT_WHITECOLOR); + else + m_pText->SetTextColor(PWL_DEFAULT_BLACKCOLOR); + +} + +FX_BOOL CPWL_IconList_Item::IsSelected() const +{ + return m_bSelected; +} + +void CPWL_IconList_Item::CreateChildWnd(const PWL_CREATEPARAM & cp) +{ + m_pText = new CPWL_Label; + + PWL_CREATEPARAM lcp = cp; + lcp.pParentWnd = this; + lcp.dwFlags = PWS_CHILD | PWS_VISIBLE | PES_LEFT | PES_CENTER; + lcp.sTextColor = PWL_DEFAULT_BLACKCOLOR; + lcp.fFontSize = 12; + m_pText->Create(lcp); +} + +void CPWL_IconList_Item::SetData(void* pData) +{ + m_pData = pData; +} + +void CPWL_IconList_Item::SetIcon(FX_INT32 nIconIndex) +{ + m_nIconIndex = nIconIndex; +} + +void CPWL_IconList_Item::SetText(const CFX_WideString& str) +{ + m_pText->SetText(str); +} + +CFX_WideString CPWL_IconList_Item::GetText() const +{ + return m_pText->GetText(); +} + +void CPWL_IconList_Item::RePosChildWnd() +{ + CPDF_Rect rcClient = GetClientRect(); + + rcClient.left += (PWL_IconList_ITEM_ICON_LEFTMARGIN + PWL_IconList_ITEM_WIDTH + PWL_IconList_ITEM_ICON_LEFTMARGIN); + + m_pText->Move(rcClient, TRUE, FALSE); +} + +void CPWL_IconList_Item::SetIconFillColor(const CPWL_Color& color) +{ + m_crIcon = color; +} + +void CPWL_IconList_Item::OnEnabled() +{ + if (m_bSelected) + m_pText->SetTextColor(PWL_DEFAULT_WHITECOLOR); + else + m_pText->SetTextColor(PWL_DEFAULT_BLACKCOLOR); + + this->InvalidateRect(); +} + +void CPWL_IconList_Item::OnDisabled() +{ + m_pText->SetTextColor(PWL_DEFAULT_HEAVYGRAYCOLOR); + + this->InvalidateRect(); +} + +/* ----------------- CPWL_IconList_Content ----------------- */ + +CPWL_IconList_Content::CPWL_IconList_Content(FX_INT32 nListCount) : + m_nSelectIndex(-1), + m_pNotify(NULL), + m_bEnableNotify(TRUE), + m_bMouseDown(FALSE), + m_nListCount(nListCount) +{ +} + +CPWL_IconList_Content::~CPWL_IconList_Content() +{ +} + +void CPWL_IconList_Content::CreateChildWnd(const PWL_CREATEPARAM & cp) +{ + for (FX_INT32 i=0; i<m_nListCount; i++) + { + CPWL_IconList_Item* pNewItem = new CPWL_IconList_Item(); + + PWL_CREATEPARAM icp = cp; + icp.pParentWnd = this; + icp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_NOREFRESHCLIP; + pNewItem->Create(icp); + } + + this->SetItemSpace(PWL_IconList_ITEM_SPACE); + this->ResetContent(0); + + if (CPWL_Wnd * pParent = this->GetParentWindow()) + { + CPDF_Rect rcScroll = this->GetScrollArea(); + this->GetScrollPos(); + + PWL_SCROLL_INFO sInfo; + sInfo.fContentMin = rcScroll.bottom; + sInfo.fContentMax = rcScroll.top; + sInfo.fPlateWidth = GetClientRect().Height(); + sInfo.fSmallStep = 13.0f; + sInfo.fBigStep = sInfo.fPlateWidth; + + pParent->OnNotify(this, PNM_SETSCROLLINFO, SBT_VSCROLL, (FX_INTPTR)&sInfo); + } +} + +FX_BOOL CPWL_IconList_Content::OnLButtonDown(const CPDF_Point & point) +{ + SetFocus(); + + SetCapture(); + m_bMouseDown = TRUE; + + FX_INT32 nItemIndex = FindItemIndex(point); + SetSelect(nItemIndex); + ScrollToItem(nItemIndex); + + return TRUE; +} + +FX_BOOL CPWL_IconList_Content::OnLButtonUp(const CPDF_Point & point) +{ + m_bMouseDown = FALSE; + ReleaseCapture(); + + return TRUE; +} + +FX_BOOL CPWL_IconList_Content::OnMouseMove(const CPDF_Point & point) +{ + if (m_bMouseDown) + { + FX_INT32 nItemIndex = FindItemIndex(point); + SetSelect(nItemIndex); + ScrollToItem(nItemIndex); + } + + return TRUE; +} + +FX_BOOL CPWL_IconList_Content::OnKeyDown(FX_WORD nChar) +{ + switch (nChar) + { + case FWL_VKEY_Up: + if (m_nSelectIndex > 0) + { + FX_INT32 nItemIndex = m_nSelectIndex - 1; + SetSelect(nItemIndex); + ScrollToItem(nItemIndex); + } + return TRUE; + case FWL_VKEY_Down: + if (m_nSelectIndex < m_nListCount-1) + { + FX_INT32 nItemIndex = m_nSelectIndex + 1; + SetSelect(nItemIndex); + ScrollToItem(nItemIndex); + } + return TRUE; + } + + return FALSE; +} + +FX_INT32 CPWL_IconList_Content::FindItemIndex(const CPDF_Point& point) +{ + FX_INT32 nIndex = 0; + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd * pChild = m_aChildren.GetAt(i)) + { + CPDF_Rect rcWnd = pChild->ChildToParent(pChild->GetWindowRect()); + + if (point.y < rcWnd.top) + { + nIndex = i; + } + } + } + + return nIndex; +} + +void CPWL_IconList_Content::ScrollToItem(FX_INT32 nItemIndex) +{ + CPDF_Rect rcClient = GetClientRect(); + + if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex)) + { + CPDF_Rect rcOrigin = pItem->GetWindowRect(); + CPDF_Rect rcWnd = pItem->ChildToParent(rcOrigin); + + if (!(rcWnd.bottom > rcClient.bottom && rcWnd.top < rcClient.top)) + { + CPDF_Point ptScroll = GetScrollPos(); + + if (rcWnd.top > rcClient.top) + { + ptScroll.y = rcOrigin.top; + } + else if (rcWnd.bottom < rcClient.bottom) + { + ptScroll.y = rcOrigin.bottom + rcClient.Height(); + } + + this->SetScrollPos(ptScroll); + this->ResetFace(); + this->InvalidateRect(); + if (CPWL_Wnd* pParent = this->GetParentWindow()) + { + pParent->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y); + } + } + } +} + +void CPWL_IconList_Content::SetSelect(FX_INT32 nIndex) +{ + if (m_nSelectIndex != nIndex) + { + SelectItem(m_nSelectIndex, FALSE); + SelectItem(nIndex, TRUE); + m_nSelectIndex = nIndex; + + if (IPWL_IconList_Notify* pNotify = GetNotify()) + pNotify->OnNoteListSelChanged(nIndex); + } +} + +FX_INT32 CPWL_IconList_Content::GetSelect() const +{ + return m_nSelectIndex; +} + +IPWL_IconList_Notify* CPWL_IconList_Content::GetNotify() const +{ + if (m_bEnableNotify) + return m_pNotify; + return NULL; +} + +void CPWL_IconList_Content::SetNotify(IPWL_IconList_Notify* pNotify) +{ + m_pNotify = pNotify; +} + +void CPWL_IconList_Content::EnableNotify(FX_BOOL bNotify) +{ + m_bEnableNotify = bNotify; +} + +void CPWL_IconList_Content::SelectItem(FX_INT32 nItemIndex, FX_BOOL bSelect) +{ + if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex)) + { + pItem->SetSelect(bSelect); + pItem->InvalidateRect(); + } +} + +CPWL_IconList_Item* CPWL_IconList_Content::GetListItem(FX_INT32 nItemIndex) const +{ + if (nItemIndex >= 0 && nItemIndex<m_aChildren.GetSize()) + { + if (CPWL_Wnd * pChild = m_aChildren.GetAt(nItemIndex)) + { + if (pChild->GetClassName() == "CPWL_IconList_Item") + { + return (CPWL_IconList_Item*)pChild; + } + } + } + + return NULL; +} + +void CPWL_IconList_Content::SetListData(FX_INT32 nItemIndex, void* pData) +{ + if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex)) + pItem->SetData(pData); +} + +void CPWL_IconList_Content::SetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex) +{ + if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex)) + pItem->SetIcon(nIconIndex); +} + +void CPWL_IconList_Content::SetListString(FX_INT32 nItemIndex, const CFX_WideString& str) +{ + if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex)) + pItem->SetText(str); +} + +CFX_WideString CPWL_IconList_Content::GetListString(FX_INT32 nItemIndex) const +{ + if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex)) + return pItem->GetText(); + + return L""; +} + +void CPWL_IconList_Content::SetIconFillColor(const CPWL_Color& color) +{ + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd * pChild = m_aChildren.GetAt(i)) + { + if (pChild->GetClassName() == "CPWL_IconList_Item") + { + CPWL_IconList_Item* pItem = (CPWL_IconList_Item*)pChild; + pItem->SetIconFillColor(color); + pItem->InvalidateRect(); + } + } + } + +} + +/* -------------------- CPWL_IconList --------------------- */ + +CPWL_IconList::CPWL_IconList(FX_INT32 nListCount) : + m_pListContent(NULL), + m_nListCount(nListCount) +{ +} + +CPWL_IconList::~CPWL_IconList() +{ +} + +void CPWL_IconList::RePosChildWnd() +{ + CPWL_Wnd::RePosChildWnd(); + + if (m_pListContent) + m_pListContent->Move(GetClientRect(), TRUE, FALSE); +} + +void CPWL_IconList::CreateChildWnd(const PWL_CREATEPARAM & cp) +{ + m_pListContent = new CPWL_IconList_Content(m_nListCount); + + PWL_CREATEPARAM ccp = cp; + ccp.pParentWnd = this; + ccp.dwFlags = PWS_CHILD | PWS_VISIBLE; + m_pListContent->Create(ccp); +} + +void CPWL_IconList::OnCreated() +{ + if (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar()) + { + pScrollBar->RemoveFlag(PWS_AUTOTRANSPARENT); + pScrollBar->SetTransparency(255); + pScrollBar->SetNotifyForever(TRUE); + } +} + +void CPWL_IconList::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam) +{ + CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); + + if (wParam == SBT_VSCROLL) + { + switch (msg) + { + case PNM_SETSCROLLINFO: + if (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam) + { + if (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar()) + { + if (pInfo->fContentMax - pInfo->fContentMin > pInfo->fPlateWidth) + { + if (!pScrollBar->IsVisible()) + { + pScrollBar->SetVisible(TRUE); + RePosChildWnd(); + } + else + { + } + } + else + { + if (pScrollBar->IsVisible()) + { + pScrollBar->SetVisible(FALSE); + RePosChildWnd(); + } + + if (m_pListContent) + m_pListContent->SetScrollPos(CPDF_Point(0.0f,0.0f)); + } + + pScrollBar->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam); + } + } + return; + case PNM_SCROLLWINDOW: + if (m_pListContent) + { + m_pListContent->SetScrollPos(CPDF_Point(0.0f, *(FX_FLOAT*)lParam)); + m_pListContent->ResetFace(); + m_pListContent->InvalidateRect(NULL); + } + return; + case PNM_SETSCROLLPOS: + if (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar()) + pScrollBar->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam); + return; + } + } +} + +void CPWL_IconList::SetSelect(FX_INT32 nIndex) +{ + m_pListContent->SetSelect(nIndex); +} + +void CPWL_IconList::SetTopItem(FX_INT32 nIndex) +{ + m_pListContent->ScrollToItem(nIndex); +} + +FX_INT32 CPWL_IconList::GetSelect() const +{ + return m_pListContent->GetSelect(); +} + +void CPWL_IconList::SetNotify(IPWL_IconList_Notify* pNotify) +{ + m_pListContent->SetNotify(pNotify); +} + +void CPWL_IconList::EnableNotify(FX_BOOL bNotify) +{ + m_pListContent->EnableNotify(bNotify); +} + +void CPWL_IconList::SetListData(FX_INT32 nItemIndex, void* pData) +{ + m_pListContent->SetListData(nItemIndex, pData); +} + +void CPWL_IconList::SetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex) +{ + m_pListContent->SetListIcon(nItemIndex, nIconIndex); +} + +void CPWL_IconList::SetListString(FX_INT32 nItemIndex, const CFX_WideString& str) +{ + m_pListContent->SetListString(nItemIndex, str); +} + +CFX_WideString CPWL_IconList::GetListString(FX_INT32 nItemIndex) const +{ + return m_pListContent->GetListString(nItemIndex); +} + +void CPWL_IconList::SetIconFillColor(const CPWL_Color& color) +{ + m_pListContent->SetIconFillColor(color); +} + +FX_BOOL CPWL_IconList::OnMouseWheel(short zDelta, const CPDF_Point & point) +{ + CPDF_Point ptScroll = m_pListContent->GetScrollPos(); + CPDF_Rect rcScroll = m_pListContent->GetScrollArea(); + CPDF_Rect rcContents = m_pListContent->GetClientRect(); + + if (rcScroll.top - rcScroll.bottom > rcContents.Height()) + { + CPDF_Point ptNew = ptScroll; + + if (zDelta > 0) + ptNew.y += 30; + else + ptNew.y -= 30; + + if (ptNew.y > rcScroll.top) + ptNew.y = rcScroll.top; + if (ptNew.y < rcScroll.bottom + rcContents.Height()) + ptNew.y = rcScroll.bottom + rcContents.Height(); + if (ptNew.y < rcScroll.bottom) + ptNew.y = rcScroll.bottom; + + if (ptNew.y != ptScroll.y) + { + m_pListContent->SetScrollPos(ptNew); + m_pListContent->ResetFace(); + m_pListContent->InvalidateRect(NULL); + + if (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar()) + pScrollBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y); + + return TRUE; + } + } + + return FALSE; +} + diff --git a/fpdfsdk/src/pdfwindow/PWL_Label.cpp b/fpdfsdk/src/pdfwindow/PWL_Label.cpp index e1b8522248..18580f3be7 100644 --- a/fpdfsdk/src/pdfwindow/PWL_Label.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_Label.cpp @@ -1,187 +1,187 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_Label.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-
-/* ---------------------------- CPWL_Label ------------------------------ */
-
-CPWL_Label::CPWL_Label() : m_pEdit(NULL)
-{
- m_pEdit = IFX_Edit::NewEdit();
-
- ASSERT(m_pEdit != NULL);
-}
-
-CPWL_Label::~CPWL_Label()
-{
- IFX_Edit::DelEdit(m_pEdit);
-}
-
-CFX_ByteString CPWL_Label::GetClassName() const
-{
- return "CPWL_Label";
-}
-
-void CPWL_Label::OnCreated()
-{
- SetParamByFlag();
- SetFontSize(this->GetCreationParam().fFontSize);
-
- m_pEdit->SetFontMap(this->GetFontMap());
- m_pEdit->Initialize();
-
- if (HasFlag(PES_TEXTOVERFLOW))
- {
- SetClipRect(CPDF_Rect(0.0f,0.0f,0.0f,0.0f));
- m_pEdit->SetTextOverflow(TRUE);
- }
-}
-
-void CPWL_Label::SetText(FX_LPCWSTR csText)
-{
- m_pEdit->SetText(csText);
-}
-
-void CPWL_Label::RePosChildWnd()
-{
- m_pEdit->SetPlateRect(GetClientRect());
-}
-
-void CPWL_Label::SetFontSize(FX_FLOAT fFontSize)
-{
- m_pEdit->SetFontSize(fFontSize);
-}
-
-FX_FLOAT CPWL_Label::GetFontSize() const
-{
- return m_pEdit->GetFontSize();
-}
-
-void CPWL_Label::SetParamByFlag()
-{
- if (HasFlag(PES_LEFT))
- {
- m_pEdit->SetAlignmentH(0);
- }
- else if (HasFlag(PES_MIDDLE))
- {
- m_pEdit->SetAlignmentH(1);
- }
- else if (HasFlag(PES_RIGHT))
- {
- m_pEdit->SetAlignmentH(2);
- }
- else
- {
- m_pEdit->SetAlignmentH(0);
- }
-
- if (HasFlag(PES_TOP))
- {
- m_pEdit->SetAlignmentV(0);
- }
- else if (HasFlag(PES_CENTER))
- {
- m_pEdit->SetAlignmentV(1);
- }
- else if (HasFlag(PES_BOTTOM))
- {
- m_pEdit->SetAlignmentV(2);
- }
- else
- {
- m_pEdit->SetAlignmentV(0);
- }
-
- if (HasFlag(PES_PASSWORD))
- {
- m_pEdit->SetPasswordChar('*');
- }
-
- m_pEdit->SetMultiLine(HasFlag(PES_MULTILINE));
- m_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN));
- m_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE));
- m_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL));
-}
-
-void CPWL_Label::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
-
- GetClientRect();
-
- CPDF_Rect rcClip;
- CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange();
- CPVT_WordRange* pRange = NULL;
-
- if (!HasFlag(PES_TEXTOVERFLOW))
- {
- rcClip = GetClientRect();
- pRange = &wrRange;
- }
-IFX_SystemHandler* pSysHandler = GetSystemHandler();
- IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pEdit,
- CPWL_Utils::PWLColorToFXColor(GetTextColor(), this->GetTransparency()),
- CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(), this->GetTransparency()),
- rcClip, CPDF_Point(0.0f,0.0f), pRange,pSysHandler, NULL);
-}
-
-void CPWL_Label::SetHorzScale(FX_INT32 nHorzScale)
-{
- m_pEdit->SetHorzScale(nHorzScale);
-}
-
-void CPWL_Label::SetCharSpace(FX_FLOAT fCharSpace)
-{
- m_pEdit->SetCharSpace(fCharSpace);
-}
-
-CPDF_Rect CPWL_Label::GetContentRect() const
-{
- return m_pEdit->GetContentRect();
-}
-
-void CPWL_Label::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
-{
- CPWL_Wnd::GetThisAppearanceStream(sAppStream);
-
- sAppStream << GetTextAppearanceStream(CPDF_Point(0.0f, 0.0f));
-}
-
-CFX_ByteString CPWL_Label::GetTextAppearanceStream(const CPDF_Point & ptOffset) const
-{
- CFX_ByteTextBuf sRet;
- CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit,ptOffset);
-
- if (sEdit.GetLength() > 0)
- {
- sRet << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEdit << "ET\n";
- }
-
- return sRet.GetByteString();
-}
-
-CFX_WideString CPWL_Label::GetText() const
-{
- return m_pEdit->GetText();
-}
-
-void CPWL_Label::SetLimitChar(FX_INT32 nLimitChar)
-{
- m_pEdit->SetLimitChar(nLimitChar);
-}
-
-FX_INT32 CPWL_Label::GetTotalWords()
-{
- if (m_pEdit)
- return m_pEdit->GetTotalWords();
-
- return 0;
-}
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_Label.h" +#include "../../include/pdfwindow/PWL_Utils.h" + +/* ---------------------------- CPWL_Label ------------------------------ */ + +CPWL_Label::CPWL_Label() : m_pEdit(NULL) +{ + m_pEdit = IFX_Edit::NewEdit(); + + ASSERT(m_pEdit != NULL); +} + +CPWL_Label::~CPWL_Label() +{ + IFX_Edit::DelEdit(m_pEdit); +} + +CFX_ByteString CPWL_Label::GetClassName() const +{ + return "CPWL_Label"; +} + +void CPWL_Label::OnCreated() +{ + SetParamByFlag(); + SetFontSize(this->GetCreationParam().fFontSize); + + m_pEdit->SetFontMap(this->GetFontMap()); + m_pEdit->Initialize(); + + if (HasFlag(PES_TEXTOVERFLOW)) + { + SetClipRect(CPDF_Rect(0.0f,0.0f,0.0f,0.0f)); + m_pEdit->SetTextOverflow(TRUE); + } +} + +void CPWL_Label::SetText(FX_LPCWSTR csText) +{ + m_pEdit->SetText(csText); +} + +void CPWL_Label::RePosChildWnd() +{ + m_pEdit->SetPlateRect(GetClientRect()); +} + +void CPWL_Label::SetFontSize(FX_FLOAT fFontSize) +{ + m_pEdit->SetFontSize(fFontSize); +} + +FX_FLOAT CPWL_Label::GetFontSize() const +{ + return m_pEdit->GetFontSize(); +} + +void CPWL_Label::SetParamByFlag() +{ + if (HasFlag(PES_LEFT)) + { + m_pEdit->SetAlignmentH(0); + } + else if (HasFlag(PES_MIDDLE)) + { + m_pEdit->SetAlignmentH(1); + } + else if (HasFlag(PES_RIGHT)) + { + m_pEdit->SetAlignmentH(2); + } + else + { + m_pEdit->SetAlignmentH(0); + } + + if (HasFlag(PES_TOP)) + { + m_pEdit->SetAlignmentV(0); + } + else if (HasFlag(PES_CENTER)) + { + m_pEdit->SetAlignmentV(1); + } + else if (HasFlag(PES_BOTTOM)) + { + m_pEdit->SetAlignmentV(2); + } + else + { + m_pEdit->SetAlignmentV(0); + } + + if (HasFlag(PES_PASSWORD)) + { + m_pEdit->SetPasswordChar('*'); + } + + m_pEdit->SetMultiLine(HasFlag(PES_MULTILINE)); + m_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN)); + m_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE)); + m_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL)); +} + +void CPWL_Label::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device); + + GetClientRect(); + + CPDF_Rect rcClip; + CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange(); + CPVT_WordRange* pRange = NULL; + + if (!HasFlag(PES_TEXTOVERFLOW)) + { + rcClip = GetClientRect(); + pRange = &wrRange; + } +IFX_SystemHandler* pSysHandler = GetSystemHandler(); + IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pEdit, + CPWL_Utils::PWLColorToFXColor(GetTextColor(), this->GetTransparency()), + CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(), this->GetTransparency()), + rcClip, CPDF_Point(0.0f,0.0f), pRange,pSysHandler, NULL); +} + +void CPWL_Label::SetHorzScale(FX_INT32 nHorzScale) +{ + m_pEdit->SetHorzScale(nHorzScale); +} + +void CPWL_Label::SetCharSpace(FX_FLOAT fCharSpace) +{ + m_pEdit->SetCharSpace(fCharSpace); +} + +CPDF_Rect CPWL_Label::GetContentRect() const +{ + return m_pEdit->GetContentRect(); +} + +void CPWL_Label::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream) +{ + CPWL_Wnd::GetThisAppearanceStream(sAppStream); + + sAppStream << GetTextAppearanceStream(CPDF_Point(0.0f, 0.0f)); +} + +CFX_ByteString CPWL_Label::GetTextAppearanceStream(const CPDF_Point & ptOffset) const +{ + CFX_ByteTextBuf sRet; + CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit,ptOffset); + + if (sEdit.GetLength() > 0) + { + sRet << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEdit << "ET\n"; + } + + return sRet.GetByteString(); +} + +CFX_WideString CPWL_Label::GetText() const +{ + return m_pEdit->GetText(); +} + +void CPWL_Label::SetLimitChar(FX_INT32 nLimitChar) +{ + m_pEdit->SetLimitChar(nLimitChar); +} + +FX_INT32 CPWL_Label::GetTotalWords() +{ + if (m_pEdit) + return m_pEdit->GetTotalWords(); + + return 0; +} + diff --git a/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp b/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp index 951ed93f79..035d81959d 100644 --- a/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp @@ -1,632 +1,632 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_ListBox.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-#include "../../include/pdfwindow/PWL_ScrollBar.h"
-#include "../../include/pdfwindow/PWL_EditCtrl.h"
-#include "../../include/pdfwindow/PWL_Edit.h"
-
-#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
-#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb))
-
-/* ------------------------ CPWL_List_Notify ----------------------- */
-
-CPWL_List_Notify::CPWL_List_Notify(CPWL_ListBox* pList) : m_pList(pList)
-{
- ASSERT(m_pList != NULL);
-}
-
-CPWL_List_Notify::~CPWL_List_Notify()
-{
-}
-
-void CPWL_List_Notify::IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
- FX_FLOAT fContentMin, FX_FLOAT fContentMax,
- FX_FLOAT fSmallStep, FX_FLOAT fBigStep)
-{
- PWL_SCROLL_INFO Info;
-
- Info.fPlateWidth = fPlateMax - fPlateMin;
- Info.fContentMin = fContentMin;
- Info.fContentMax = fContentMax;
- Info.fSmallStep = fSmallStep;
- Info.fBigStep = fBigStep;
-
- m_pList->OnNotify(m_pList,PNM_SETSCROLLINFO,SBT_VSCROLL,(FX_INTPTR)&Info);
-
- if (CPWL_ScrollBar * pScroll = m_pList->GetVScrollBar())
- {
- if (IsFloatBigger(Info.fPlateWidth,Info.fContentMax-Info.fContentMin)
- || IsFloatEqual(Info.fPlateWidth,Info.fContentMax-Info.fContentMin))
- {
- if (pScroll->IsVisible())
- {
- pScroll->SetVisible(FALSE);
- m_pList->RePosChildWnd();
- }
- }
- else
- {
- if (!pScroll->IsVisible())
- {
- pScroll->SetVisible(TRUE);
- m_pList->RePosChildWnd();
- }
- }
- }
-}
-
-void CPWL_List_Notify::IOnSetScrollPosY(FX_FLOAT fy)
-{
- m_pList->OnNotify(m_pList,PNM_SETSCROLLPOS,SBT_VSCROLL,(FX_INTPTR)&fy);
-}
-
-void CPWL_List_Notify::IOnInvalidateRect(CPDF_Rect * pRect)
-{
- m_pList->InvalidateRect(pRect);
-}
-
-/* --------------------------- CPWL_ListBox ---------------------------- */
-
-CPWL_ListBox::CPWL_ListBox() :
- m_pList(NULL),
- m_pListNotify(NULL),
- m_bMouseDown(FALSE),
- m_bHoverSel(FALSE),
- m_pFillerNotify(NULL)
-{
- m_pList = IFX_List::NewList();
-
- ASSERT(m_pList != NULL);
-}
-
-CPWL_ListBox::~CPWL_ListBox()
-{
- IFX_List::DelList(m_pList);
-
- if (m_pListNotify)
- {
- delete m_pListNotify;
- m_pListNotify = NULL;
- }
-}
-
-CFX_ByteString CPWL_ListBox::GetClassName() const
-{
- return "CPWL_ListBox";
-}
-
-void CPWL_ListBox::OnCreated()
-{
- if (m_pList)
- {
- if (m_pListNotify) delete m_pListNotify;
-
- m_pList->SetFontMap(GetFontMap());
- m_pList->SetNotify(m_pListNotify = new CPWL_List_Notify(this));
-
- SetHoverSel(HasFlag(PLBS_HOVERSEL));
- m_pList->SetMultipleSel(HasFlag(PLBS_MULTIPLESEL));
- m_pList->SetFontSize(this->GetCreationParam().fFontSize);
-
- m_bHoverSel = HasFlag(PLBS_HOVERSEL);
- }
-}
-
-void CPWL_ListBox::OnDestroy()
-{
- if (m_pListNotify)
- {
- delete m_pListNotify;
- m_pListNotify = NULL;
- }
-}
-
-void CPWL_ListBox::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
-{
- CPWL_Wnd::GetThisAppearanceStream(sAppStream);
-
- CFX_ByteTextBuf sListItems;
-
- if (m_pList)
- {
- CPDF_Rect rcPlate = m_pList->GetPlateRect();
- for (FX_INT32 i=0,sz=m_pList->GetCount(); i<sz; i++)
- {
- CPDF_Rect rcItem = m_pList->GetItemRect(i);
-
- if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) continue;
-
- CPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f);
- if (m_pList->IsItemSelected(i))
- {
- sListItems << CPWL_Utils::GetRectFillAppStream(rcItem,PWL_DEFAULT_SELBACKCOLOR);
- CFX_ByteString sItem = CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset);
- if (sItem.GetLength() > 0)
- {
- sListItems << "BT\n" << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELTEXTCOLOR) << sItem << "ET\n";
- }
- }
- else
- {
- CFX_ByteString sItem = CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset);
- if (sItem.GetLength() > 0)
- {
- sListItems << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sItem << "ET\n";
- }
- }
- }
- }
-
- if (sListItems.GetLength() > 0)
- {
- CFX_ByteTextBuf sClip;
- CPDF_Rect rcClient = this->GetClientRect();
-
- sClip << "q\n";
- sClip << rcClient.left << " " << rcClient.bottom << " "
- << rcClient.right - rcClient.left << " " << rcClient.top - rcClient.bottom << " re W n\n";
-
- sClip << sListItems << "Q\n";
-
- sAppStream << "/Tx BMC\n" << sClip << "EMC\n";
- }
-}
-
-void CPWL_ListBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
-
- if (m_pList)
- {
- CPDF_Rect rcPlate = m_pList->GetPlateRect();
- CPDF_Rect rcList = GetListRect();
- CPDF_Rect rcClient = GetClientRect();
-
- for (FX_INT32 i=0,sz=m_pList->GetCount(); i<sz; i++)
- {
- CPDF_Rect rcItem = m_pList->GetItemRect(i);
- if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) continue;
-
- CPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f);
- if (IFX_Edit* pEdit = m_pList->GetItemEdit(i))
- {
- CPDF_Rect rcContent = pEdit->GetContentRect();
- if (rcContent.Width() > rcClient.Width())
- rcItem.Intersect(rcList);
- else
- rcItem.Intersect(rcClient);
- }
-
- if (m_pList->IsItemSelected(i))
- {
- // CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, ArgbEncode(255,0,51,113));
- IFX_SystemHandler* pSysHandler = GetSystemHandler();
- if(pSysHandler && pSysHandler->IsSelectionImplemented())
- {
- IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), CPWL_Utils::PWLColorToFXColor(GetTextColor()), CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()),
- rcList, ptOffset, NULL,pSysHandler, m_pFormFiller);
- pSysHandler->OutputSelectedRect(m_pFormFiller, rcItem);
- }
- else
- {
- CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, ArgbEncode(255,0,51,113));
- IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), ArgbEncode(255,255,255,255), 0,
- rcList, ptOffset, NULL, pSysHandler, m_pFormFiller);
- }
- }
- else
- {
- IFX_SystemHandler* pSysHandler = GetSystemHandler();
- IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i),
- CPWL_Utils::PWLColorToFXColor(GetTextColor()),
- CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()),
- rcList, ptOffset, NULL,pSysHandler, NULL);
-
- }
- }
- }
-}
-
-FX_BOOL CPWL_ListBox::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnKeyDown(nChar, nFlag);
-
- if (!m_pList) return FALSE;
-
- switch (nChar)
- {
- default:
- return FALSE;
- case FWL_VKEY_Up:
- case FWL_VKEY_Down:
- case FWL_VKEY_Home:
- case FWL_VKEY_Left:
- case FWL_VKEY_End:
- case FWL_VKEY_Right:
- break;
- }
-
- switch (nChar)
- {
- case FWL_VKEY_Up:
- m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- break;
- case FWL_VKEY_Down:
- m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- break;
- case FWL_VKEY_Home:
- m_pList->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- break;
- case FWL_VKEY_Left:
- m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- break;
- case FWL_VKEY_End:
- m_pList->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- break;
- case FWL_VKEY_Right:
- m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- break;
- case FWL_VKEY_Delete:
- break;
- }
-
- FX_BOOL bExit = FALSE;
- OnNotifySelChanged(TRUE,bExit,nFlag);
-
- return TRUE;
-}
-
-FX_BOOL CPWL_ListBox::OnChar(FX_WORD nChar, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnChar(nChar,nFlag);
-
- if (!m_pList) return FALSE;
-
- if (!m_pList->OnChar(nChar,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag))) return FALSE;
-
- FX_BOOL bExit = FALSE;
- OnNotifySelChanged(TRUE,bExit, nFlag);
-
- return TRUE;
-}
-
-FX_BOOL CPWL_ListBox::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonDown(point,nFlag);
-
- if (ClientHitTest(point))
- {
- m_bMouseDown = TRUE;
- SetFocus();
- SetCapture();
-
- if (m_pList)
- m_pList->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- }
-
- return TRUE;
-}
-
-FX_BOOL CPWL_ListBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonUp(point,nFlag);
-
- if (m_bMouseDown)
- {
- ReleaseCapture();
- m_bMouseDown = FALSE;
- }
-
- FX_BOOL bExit = FALSE;
- OnNotifySelChanged(FALSE,bExit,nFlag);
-
- return TRUE;
-}
-
-void CPWL_ListBox::SetHoverSel(FX_BOOL bHoverSel)
-{
- m_bHoverSel = bHoverSel;
-}
-
-FX_BOOL CPWL_ListBox::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnMouseMove(point, nFlag);
-
- if (m_bHoverSel && !IsCaptureMouse() && ClientHitTest(point))
- {
- if (m_pList)
- m_pList->Select(m_pList->GetItemIndex(point));
- }
-
- if (m_bMouseDown)
- {
- if (m_pList)
- m_pList->OnMouseMove(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- }
-
- return TRUE;
-}
-
-void CPWL_ListBox::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
-{
- CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
-
- FX_FLOAT fPos;
-
- switch (msg)
- {
- case PNM_SETSCROLLINFO:
- switch (wParam)
- {
- case SBT_VSCROLL:
- if (CPWL_Wnd * pChild = GetVScrollBar())
- {
- pChild->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam);
- }
- break;
- }
- break;
- case PNM_SETSCROLLPOS:
- switch (wParam)
- {
- case SBT_VSCROLL:
- if (CPWL_Wnd * pChild = GetVScrollBar())
- {
- pChild->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);
- }
- break;
- }
- break;
- case PNM_SCROLLWINDOW:
- fPos = *(FX_FLOAT*)lParam;
- switch (wParam)
- {
- case SBT_VSCROLL:
- if (m_pList)
- m_pList->SetScrollPos(CPDF_Point(0,fPos));
- break;
- }
- break;
- }
-}
-
-void CPWL_ListBox::KillFocus()
-{
- CPWL_Wnd::KillFocus();
-
- /*
- if (this->IsMultipleSel())
- {
- for(FX_INT32 i=0;i<this->GetCount();i++)
- {
- if (this->IsListItemSelected(i))
- {
- if (!IsListItemVisible(i))
- this->ScrollToListItem(i);
- break;
- }
- }
- }
- else
- {
- if (!IsListItemVisible(this->GetCurSel()))
- this->ScrollToListItem(this->GetCurSel());
- }
-
- SetListItemCaret(m_nCaretIndex,FALSE);
- */
-}
-
-void CPWL_ListBox::RePosChildWnd()
-{
- CPWL_Wnd::RePosChildWnd();
-
- if (m_pList)
- m_pList->SetPlateRect(GetListRect());
-}
-
-void CPWL_ListBox::OnNotifySelChanged(FX_BOOL bKeyDown, FX_BOOL & bExit, FX_DWORD nFlag)
-{
- if (m_pFillerNotify)
- {
- FX_BOOL bRC = TRUE;
- CFX_WideString swChange = GetText();
- CFX_WideString strChangeEx;
- int nSelStart = 0;
- int nSelEnd = swChange.GetLength();
- m_pFillerNotify->OnBeforeKeyStroke(FALSE, GetAttachedData(), 0, swChange, strChangeEx, nSelStart, nSelEnd, bKeyDown, bRC, bExit, nFlag);
- if (bExit) return;
-
- m_pFillerNotify->OnAfterKeyStroke(FALSE, GetAttachedData(), bExit,nFlag);
- }
-}
-
-CPDF_Rect CPWL_ListBox::GetFocusRect() const
-{
- if (m_pList && m_pList->IsMultipleSel())
- {
- CPDF_Rect rcCaret = m_pList->GetItemRect(m_pList->GetCaret());
- rcCaret.Intersect(GetClientRect());
- return rcCaret;
- }
-
- return CPWL_Wnd::GetFocusRect();
-}
-
-void CPWL_ListBox::AddString(FX_LPCWSTR string)
-{
- if (m_pList)
- {
- m_pList->AddString(string);
- }
-}
-
-void CPWL_ListBox::SetText(FX_LPCWSTR csText,FX_BOOL bRefresh)
-{
- //return CPDF_List::SetText(csText,bRefresh);
-}
-
-CFX_WideString CPWL_ListBox::GetText() const
-{
- if (m_pList)
- return m_pList->GetText();
-
- return L"";
-}
-
-void CPWL_ListBox::SetFontSize(FX_FLOAT fFontSize)
-{
- if (m_pList)
- m_pList->SetFontSize(fFontSize);
-}
-
-FX_FLOAT CPWL_ListBox::GetFontSize() const
-{
- if (m_pList)
- return m_pList->GetFontSize();
- return 0.0f;
-}
-
-void CPWL_ListBox::Select(FX_INT32 nItemIndex)
-{
- if (m_pList)
- m_pList->Select(nItemIndex);
-}
-
-void CPWL_ListBox::SetCaret(FX_INT32 nItemIndex)
-{
- if (m_pList)
- m_pList->SetCaret(nItemIndex);
-}
-
-void CPWL_ListBox::SetTopVisibleIndex(FX_INT32 nItemIndex)
-{
- if (m_pList)
- m_pList->SetTopItem(nItemIndex);
-}
-
-void CPWL_ListBox::ScrollToListItem(FX_INT32 nItemIndex)
-{
- if (m_pList)
- m_pList->ScrollToListItem(nItemIndex);
-}
-
-void CPWL_ListBox::ResetContent()
-{
- if (m_pList)
- m_pList->Empty();
-}
-
-void CPWL_ListBox::Reset()
-{
- if (m_pList)
- m_pList->Cancel();
-}
-
-FX_BOOL CPWL_ListBox::IsMultipleSel() const
-{
- if (m_pList)
- return m_pList->IsMultipleSel();
-
- return FALSE;
-}
-
-FX_INT32 CPWL_ListBox::GetCaretIndex() const
-{
- if (m_pList)
- return m_pList->GetCaret();
-
- return -1;
-}
-
-FX_INT32 CPWL_ListBox::GetCurSel() const
-{
- if (m_pList)
- return m_pList->GetSelect();
-
- return -1;
-}
-
-FX_BOOL CPWL_ListBox::IsItemSelected(FX_INT32 nItemIndex) const
-{
- if (m_pList)
- return m_pList->IsItemSelected(nItemIndex);
-
- return FALSE;
-}
-
-FX_INT32 CPWL_ListBox::GetTopVisibleIndex() const
-{
- if (m_pList)
- {
- m_pList->ScrollToListItem(m_pList->GetFirstSelected());
- return m_pList->GetTopItem();
- }
-
- return -1;
-}
-
-FX_INT32 CPWL_ListBox::GetCount() const
-{
- if (m_pList)
- return m_pList->GetCount();
-
- return 0;
-}
-
-FX_INT32 CPWL_ListBox::FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const
-{
- if (m_pList)
- return m_pList->FindNext(nIndex,nChar);
-
- return nIndex;
-}
-
-CPDF_Rect CPWL_ListBox::GetContentRect() const
-{
- if (m_pList)
- return m_pList->GetContentRect();
-
- return CPDF_Rect();
-}
-
-FX_FLOAT CPWL_ListBox::GetFirstHeight() const
-{
- if (m_pList)
- return m_pList->GetFirstHeight();
-
- return 0.0f;
-}
-
-CPDF_Rect CPWL_ListBox::GetListRect() const
-{
- return CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
-}
-
-FX_BOOL CPWL_ListBox::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)
-{
- if (!m_pList) return FALSE;
-
- if (zDelta < 0)
- {
- m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- }
- else
- {
- m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
- }
-
- FX_BOOL bExit = FALSE;
- OnNotifySelChanged(FALSE,bExit, nFlag);
- return TRUE;
-}
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_ListBox.h" +#include "../../include/pdfwindow/PWL_Utils.h" +#include "../../include/pdfwindow/PWL_ScrollBar.h" +#include "../../include/pdfwindow/PWL_EditCtrl.h" +#include "../../include/pdfwindow/PWL_Edit.h" + +#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) +#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) +#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) +#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb)) + +/* ------------------------ CPWL_List_Notify ----------------------- */ + +CPWL_List_Notify::CPWL_List_Notify(CPWL_ListBox* pList) : m_pList(pList) +{ + ASSERT(m_pList != NULL); +} + +CPWL_List_Notify::~CPWL_List_Notify() +{ +} + +void CPWL_List_Notify::IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax, + FX_FLOAT fContentMin, FX_FLOAT fContentMax, + FX_FLOAT fSmallStep, FX_FLOAT fBigStep) +{ + PWL_SCROLL_INFO Info; + + Info.fPlateWidth = fPlateMax - fPlateMin; + Info.fContentMin = fContentMin; + Info.fContentMax = fContentMax; + Info.fSmallStep = fSmallStep; + Info.fBigStep = fBigStep; + + m_pList->OnNotify(m_pList,PNM_SETSCROLLINFO,SBT_VSCROLL,(FX_INTPTR)&Info); + + if (CPWL_ScrollBar * pScroll = m_pList->GetVScrollBar()) + { + if (IsFloatBigger(Info.fPlateWidth,Info.fContentMax-Info.fContentMin) + || IsFloatEqual(Info.fPlateWidth,Info.fContentMax-Info.fContentMin)) + { + if (pScroll->IsVisible()) + { + pScroll->SetVisible(FALSE); + m_pList->RePosChildWnd(); + } + } + else + { + if (!pScroll->IsVisible()) + { + pScroll->SetVisible(TRUE); + m_pList->RePosChildWnd(); + } + } + } +} + +void CPWL_List_Notify::IOnSetScrollPosY(FX_FLOAT fy) +{ + m_pList->OnNotify(m_pList,PNM_SETSCROLLPOS,SBT_VSCROLL,(FX_INTPTR)&fy); +} + +void CPWL_List_Notify::IOnInvalidateRect(CPDF_Rect * pRect) +{ + m_pList->InvalidateRect(pRect); +} + +/* --------------------------- CPWL_ListBox ---------------------------- */ + +CPWL_ListBox::CPWL_ListBox() : + m_pList(NULL), + m_pListNotify(NULL), + m_bMouseDown(FALSE), + m_bHoverSel(FALSE), + m_pFillerNotify(NULL) +{ + m_pList = IFX_List::NewList(); + + ASSERT(m_pList != NULL); +} + +CPWL_ListBox::~CPWL_ListBox() +{ + IFX_List::DelList(m_pList); + + if (m_pListNotify) + { + delete m_pListNotify; + m_pListNotify = NULL; + } +} + +CFX_ByteString CPWL_ListBox::GetClassName() const +{ + return "CPWL_ListBox"; +} + +void CPWL_ListBox::OnCreated() +{ + if (m_pList) + { + if (m_pListNotify) delete m_pListNotify; + + m_pList->SetFontMap(GetFontMap()); + m_pList->SetNotify(m_pListNotify = new CPWL_List_Notify(this)); + + SetHoverSel(HasFlag(PLBS_HOVERSEL)); + m_pList->SetMultipleSel(HasFlag(PLBS_MULTIPLESEL)); + m_pList->SetFontSize(this->GetCreationParam().fFontSize); + + m_bHoverSel = HasFlag(PLBS_HOVERSEL); + } +} + +void CPWL_ListBox::OnDestroy() +{ + if (m_pListNotify) + { + delete m_pListNotify; + m_pListNotify = NULL; + } +} + +void CPWL_ListBox::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream) +{ + CPWL_Wnd::GetThisAppearanceStream(sAppStream); + + CFX_ByteTextBuf sListItems; + + if (m_pList) + { + CPDF_Rect rcPlate = m_pList->GetPlateRect(); + for (FX_INT32 i=0,sz=m_pList->GetCount(); i<sz; i++) + { + CPDF_Rect rcItem = m_pList->GetItemRect(i); + + if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) continue; + + CPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f); + if (m_pList->IsItemSelected(i)) + { + sListItems << CPWL_Utils::GetRectFillAppStream(rcItem,PWL_DEFAULT_SELBACKCOLOR); + CFX_ByteString sItem = CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset); + if (sItem.GetLength() > 0) + { + sListItems << "BT\n" << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELTEXTCOLOR) << sItem << "ET\n"; + } + } + else + { + CFX_ByteString sItem = CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset); + if (sItem.GetLength() > 0) + { + sListItems << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sItem << "ET\n"; + } + } + } + } + + if (sListItems.GetLength() > 0) + { + CFX_ByteTextBuf sClip; + CPDF_Rect rcClient = this->GetClientRect(); + + sClip << "q\n"; + sClip << rcClient.left << " " << rcClient.bottom << " " + << rcClient.right - rcClient.left << " " << rcClient.top - rcClient.bottom << " re W n\n"; + + sClip << sListItems << "Q\n"; + + sAppStream << "/Tx BMC\n" << sClip << "EMC\n"; + } +} + +void CPWL_ListBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device); + + if (m_pList) + { + CPDF_Rect rcPlate = m_pList->GetPlateRect(); + CPDF_Rect rcList = GetListRect(); + CPDF_Rect rcClient = GetClientRect(); + + for (FX_INT32 i=0,sz=m_pList->GetCount(); i<sz; i++) + { + CPDF_Rect rcItem = m_pList->GetItemRect(i); + if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) continue; + + CPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f); + if (IFX_Edit* pEdit = m_pList->GetItemEdit(i)) + { + CPDF_Rect rcContent = pEdit->GetContentRect(); + if (rcContent.Width() > rcClient.Width()) + rcItem.Intersect(rcList); + else + rcItem.Intersect(rcClient); + } + + if (m_pList->IsItemSelected(i)) + { + // CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, ArgbEncode(255,0,51,113)); + IFX_SystemHandler* pSysHandler = GetSystemHandler(); + if(pSysHandler && pSysHandler->IsSelectionImplemented()) + { + IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), CPWL_Utils::PWLColorToFXColor(GetTextColor()), CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()), + rcList, ptOffset, NULL,pSysHandler, m_pFormFiller); + pSysHandler->OutputSelectedRect(m_pFormFiller, rcItem); + } + else + { + CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, ArgbEncode(255,0,51,113)); + IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), ArgbEncode(255,255,255,255), 0, + rcList, ptOffset, NULL, pSysHandler, m_pFormFiller); + } + } + else + { + IFX_SystemHandler* pSysHandler = GetSystemHandler(); + IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), + CPWL_Utils::PWLColorToFXColor(GetTextColor()), + CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()), + rcList, ptOffset, NULL,pSysHandler, NULL); + + } + } + } +} + +FX_BOOL CPWL_ListBox::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag) +{ + CPWL_Wnd::OnKeyDown(nChar, nFlag); + + if (!m_pList) return FALSE; + + switch (nChar) + { + default: + return FALSE; + case FWL_VKEY_Up: + case FWL_VKEY_Down: + case FWL_VKEY_Home: + case FWL_VKEY_Left: + case FWL_VKEY_End: + case FWL_VKEY_Right: + break; + } + + switch (nChar) + { + case FWL_VKEY_Up: + m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Down: + m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Home: + m_pList->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Left: + m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_End: + m_pList->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Right: + m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Delete: + break; + } + + FX_BOOL bExit = FALSE; + OnNotifySelChanged(TRUE,bExit,nFlag); + + return TRUE; +} + +FX_BOOL CPWL_ListBox::OnChar(FX_WORD nChar, FX_DWORD nFlag) +{ + CPWL_Wnd::OnChar(nChar,nFlag); + + if (!m_pList) return FALSE; + + if (!m_pList->OnChar(nChar,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag))) return FALSE; + + FX_BOOL bExit = FALSE; + OnNotifySelChanged(TRUE,bExit, nFlag); + + return TRUE; +} + +FX_BOOL CPWL_ListBox::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonDown(point,nFlag); + + if (ClientHitTest(point)) + { + m_bMouseDown = TRUE; + SetFocus(); + SetCapture(); + + if (m_pList) + m_pList->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + } + + return TRUE; +} + +FX_BOOL CPWL_ListBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonUp(point,nFlag); + + if (m_bMouseDown) + { + ReleaseCapture(); + m_bMouseDown = FALSE; + } + + FX_BOOL bExit = FALSE; + OnNotifySelChanged(FALSE,bExit,nFlag); + + return TRUE; +} + +void CPWL_ListBox::SetHoverSel(FX_BOOL bHoverSel) +{ + m_bHoverSel = bHoverSel; +} + +FX_BOOL CPWL_ListBox::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnMouseMove(point, nFlag); + + if (m_bHoverSel && !IsCaptureMouse() && ClientHitTest(point)) + { + if (m_pList) + m_pList->Select(m_pList->GetItemIndex(point)); + } + + if (m_bMouseDown) + { + if (m_pList) + m_pList->OnMouseMove(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + } + + return TRUE; +} + +void CPWL_ListBox::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam) +{ + CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam); + + FX_FLOAT fPos; + + switch (msg) + { + case PNM_SETSCROLLINFO: + switch (wParam) + { + case SBT_VSCROLL: + if (CPWL_Wnd * pChild = GetVScrollBar()) + { + pChild->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam); + } + break; + } + break; + case PNM_SETSCROLLPOS: + switch (wParam) + { + case SBT_VSCROLL: + if (CPWL_Wnd * pChild = GetVScrollBar()) + { + pChild->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam); + } + break; + } + break; + case PNM_SCROLLWINDOW: + fPos = *(FX_FLOAT*)lParam; + switch (wParam) + { + case SBT_VSCROLL: + if (m_pList) + m_pList->SetScrollPos(CPDF_Point(0,fPos)); + break; + } + break; + } +} + +void CPWL_ListBox::KillFocus() +{ + CPWL_Wnd::KillFocus(); + + /* + if (this->IsMultipleSel()) + { + for(FX_INT32 i=0;i<this->GetCount();i++) + { + if (this->IsListItemSelected(i)) + { + if (!IsListItemVisible(i)) + this->ScrollToListItem(i); + break; + } + } + } + else + { + if (!IsListItemVisible(this->GetCurSel())) + this->ScrollToListItem(this->GetCurSel()); + } + + SetListItemCaret(m_nCaretIndex,FALSE); + */ +} + +void CPWL_ListBox::RePosChildWnd() +{ + CPWL_Wnd::RePosChildWnd(); + + if (m_pList) + m_pList->SetPlateRect(GetListRect()); +} + +void CPWL_ListBox::OnNotifySelChanged(FX_BOOL bKeyDown, FX_BOOL & bExit, FX_DWORD nFlag) +{ + if (m_pFillerNotify) + { + FX_BOOL bRC = TRUE; + CFX_WideString swChange = GetText(); + CFX_WideString strChangeEx; + int nSelStart = 0; + int nSelEnd = swChange.GetLength(); + m_pFillerNotify->OnBeforeKeyStroke(FALSE, GetAttachedData(), 0, swChange, strChangeEx, nSelStart, nSelEnd, bKeyDown, bRC, bExit, nFlag); + if (bExit) return; + + m_pFillerNotify->OnAfterKeyStroke(FALSE, GetAttachedData(), bExit,nFlag); + } +} + +CPDF_Rect CPWL_ListBox::GetFocusRect() const +{ + if (m_pList && m_pList->IsMultipleSel()) + { + CPDF_Rect rcCaret = m_pList->GetItemRect(m_pList->GetCaret()); + rcCaret.Intersect(GetClientRect()); + return rcCaret; + } + + return CPWL_Wnd::GetFocusRect(); +} + +void CPWL_ListBox::AddString(FX_LPCWSTR string) +{ + if (m_pList) + { + m_pList->AddString(string); + } +} + +void CPWL_ListBox::SetText(FX_LPCWSTR csText,FX_BOOL bRefresh) +{ + //return CPDF_List::SetText(csText,bRefresh); +} + +CFX_WideString CPWL_ListBox::GetText() const +{ + if (m_pList) + return m_pList->GetText(); + + return L""; +} + +void CPWL_ListBox::SetFontSize(FX_FLOAT fFontSize) +{ + if (m_pList) + m_pList->SetFontSize(fFontSize); +} + +FX_FLOAT CPWL_ListBox::GetFontSize() const +{ + if (m_pList) + return m_pList->GetFontSize(); + return 0.0f; +} + +void CPWL_ListBox::Select(FX_INT32 nItemIndex) +{ + if (m_pList) + m_pList->Select(nItemIndex); +} + +void CPWL_ListBox::SetCaret(FX_INT32 nItemIndex) +{ + if (m_pList) + m_pList->SetCaret(nItemIndex); +} + +void CPWL_ListBox::SetTopVisibleIndex(FX_INT32 nItemIndex) +{ + if (m_pList) + m_pList->SetTopItem(nItemIndex); +} + +void CPWL_ListBox::ScrollToListItem(FX_INT32 nItemIndex) +{ + if (m_pList) + m_pList->ScrollToListItem(nItemIndex); +} + +void CPWL_ListBox::ResetContent() +{ + if (m_pList) + m_pList->Empty(); +} + +void CPWL_ListBox::Reset() +{ + if (m_pList) + m_pList->Cancel(); +} + +FX_BOOL CPWL_ListBox::IsMultipleSel() const +{ + if (m_pList) + return m_pList->IsMultipleSel(); + + return FALSE; +} + +FX_INT32 CPWL_ListBox::GetCaretIndex() const +{ + if (m_pList) + return m_pList->GetCaret(); + + return -1; +} + +FX_INT32 CPWL_ListBox::GetCurSel() const +{ + if (m_pList) + return m_pList->GetSelect(); + + return -1; +} + +FX_BOOL CPWL_ListBox::IsItemSelected(FX_INT32 nItemIndex) const +{ + if (m_pList) + return m_pList->IsItemSelected(nItemIndex); + + return FALSE; +} + +FX_INT32 CPWL_ListBox::GetTopVisibleIndex() const +{ + if (m_pList) + { + m_pList->ScrollToListItem(m_pList->GetFirstSelected()); + return m_pList->GetTopItem(); + } + + return -1; +} + +FX_INT32 CPWL_ListBox::GetCount() const +{ + if (m_pList) + return m_pList->GetCount(); + + return 0; +} + +FX_INT32 CPWL_ListBox::FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const +{ + if (m_pList) + return m_pList->FindNext(nIndex,nChar); + + return nIndex; +} + +CPDF_Rect CPWL_ListBox::GetContentRect() const +{ + if (m_pList) + return m_pList->GetContentRect(); + + return CPDF_Rect(); +} + +FX_FLOAT CPWL_ListBox::GetFirstHeight() const +{ + if (m_pList) + return m_pList->GetFirstHeight(); + + return 0.0f; +} + +CPDF_Rect CPWL_ListBox::GetListRect() const +{ + return CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth())); +} + +FX_BOOL CPWL_ListBox::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag) +{ + if (!m_pList) return FALSE; + + if (zDelta < 0) + { + m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + } + else + { + m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag)); + } + + FX_BOOL bExit = FALSE; + OnNotifySelChanged(FALSE,bExit, nFlag); + return TRUE; +} + diff --git a/fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp b/fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp index 603bb4a139..9ac18fdc63 100644 --- a/fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp @@ -1,245 +1,245 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_ListCtrl.h"
-
-/* ---------------------------- CPWL_ListCtrl ---------------------------- */
-
-CPWL_ListCtrl::CPWL_ListCtrl() :
- m_rcContent(0,0,0,0),
- m_ptScroll(0,0),
- m_fItemSpace(0.0f),
- m_fTopSpace(0.0f),
- m_fBottomSpace(0.0f)
-{
-}
-
-CPWL_ListCtrl::~CPWL_ListCtrl()
-{
-}
-
-void CPWL_ListCtrl::SetScrollPos(const CPDF_Point& point)
-{
- m_ptScroll = point;
-
- if (m_ptScroll.x < m_rcContent.left)
- m_ptScroll.x = m_rcContent.left;
-
- if (m_ptScroll.x > m_rcContent.right)
- m_ptScroll.x = m_rcContent.right;
-
- if (m_ptScroll.y > m_rcContent.top)
- m_ptScroll.y = m_rcContent.top;
-
- if (m_ptScroll.y < m_rcContent.bottom)
- m_ptScroll.y = m_rcContent.bottom;
-}
-
-CPDF_Point CPWL_ListCtrl::GetScrollPos() const
-{
- return m_ptScroll;
-}
-
-CPDF_Rect CPWL_ListCtrl::GetScrollArea() const
-{
- return m_rcContent;
-}
-
-void CPWL_ListCtrl::ResetFace()
-{
- ResetAll(FALSE, 0);
-}
-
-void CPWL_ListCtrl::ResetContent(FX_INT32 nStart)
-{
- if (nStart < 0)
- nStart = 0;
- if (nStart >= 0 && nStart < m_aChildren.GetSize())
- ResetAll(TRUE, nStart);
-}
-
-FX_FLOAT CPWL_ListCtrl::GetContentsHeight(FX_FLOAT fLimitWidth)
-{
- FX_FLOAT fRet = m_fTopSpace;
-
- FX_FLOAT fBorderWidth = (FX_FLOAT)this->GetBorderWidth();
-
- if (fLimitWidth > fBorderWidth* 2)
- {
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
- {
- FX_FLOAT fLeft = pChild->GetItemLeftMargin();
- FX_FLOAT fRight = pChild->GetItemRightMargin();
-
- fRet += pChild->GetItemHeight(fLimitWidth - fBorderWidth* 2 - fLeft - fRight);
- fRet += m_fItemSpace;
- }
- }
-
- fRet -= m_fItemSpace;
- }
-
- fRet += m_fBottomSpace;
-
- return fRet;
-}
-
-void CPWL_ListCtrl::ResetAll(FX_BOOL bMove, FX_INT32 nStart)
-{
- CPDF_Rect rcClient = GetClientRect();
-
- FX_FLOAT fWidth = rcClient.Width();
-
- FX_FLOAT fy = 0.0f - m_fTopSpace;
-
- if (nStart-1 >= 0 && nStart-1 < m_aChildren.GetSize())
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(nStart-1))
- fy = pChild->GetWindowRect().bottom - m_fItemSpace;
-
- for (FX_INT32 i=nStart,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
- {
- FX_FLOAT fLeft = pChild->GetItemLeftMargin();
- FX_FLOAT fRight = pChild->GetItemRightMargin();
-
- pChild->SetChildMatrix(
- CPDF_Matrix(1,0,0,1,
- rcClient.left - m_ptScroll.x,
- rcClient.top - m_ptScroll.y)
- );
-
- if (bMove)
- {
- FX_FLOAT fItemHeight = pChild->GetItemHeight(fWidth - fLeft - fRight);
- pChild->Move(CPDF_Rect(fLeft, fy-fItemHeight, fWidth - fRight, fy), TRUE, FALSE);
- fy -= fItemHeight;
- fy -= m_fItemSpace;
- }
- }
- }
-
- fy += m_fItemSpace;
-
- fy -= m_fBottomSpace;
-
- if (bMove)
- {
- m_rcContent.left = 0;
- m_rcContent.top = 0;
- m_rcContent.right = fWidth;
- m_rcContent.bottom = fy;
- }
-}
-
-void CPWL_ListCtrl::SetItemSpace(FX_FLOAT fSpace)
-{
- m_fItemSpace = fSpace;
-}
-
-void CPWL_ListCtrl::SetTopSpace(FX_FLOAT fSpace)
-{
- m_fTopSpace = fSpace;
-}
-
-void CPWL_ListCtrl::SetBottomSpace(FX_FLOAT fSpace)
-{
- m_fBottomSpace = fSpace;
-}
-
-void CPWL_ListCtrl::RePosChildWnd()
-{
- ResetFace();
-}
-
-void CPWL_ListCtrl::DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- pDevice->SaveState();
- CPDF_Rect rcClient = GetClientRect();
- CPDF_Rect rcTemp = rcClient;
- pUser2Device->TransformRect(rcTemp);
- FX_RECT rcClip((FX_INT32)rcTemp.left,
- (FX_INT32)rcTemp.bottom,
- (FX_INT32)rcTemp.right,
- (FX_INT32)rcTemp.top);
-
- pDevice->SetClip_Rect(&rcClip);
-
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
- {
- CPDF_Rect rcChild = pChild->ChildToParent(pChild->GetWindowRect());
- if (!(rcChild.top < rcClient.bottom || rcChild.bottom > rcClient.top))
- {
- CPDF_Matrix mt = pChild->GetChildMatrix();
- if (mt.IsIdentity())
- {
- pChild->DrawAppearance(pDevice,pUser2Device);
- }
- else
- {
- mt.Concat(*pUser2Device);
- pChild->DrawAppearance(pDevice,&mt);
- }
- }
- }
- }
-
- pDevice->RestoreState();
-}
-
-FX_INT32 CPWL_ListCtrl::GetItemIndex(CPWL_Wnd* pItem)
-{
- for (FX_INT32 i=0, sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (pItem == m_aChildren.GetAt(i))
- return i;
- }
-
- return -1;
-}
-
-CPDF_Point CPWL_ListCtrl::InToOut(const CPDF_Point& point) const
-{
- CPDF_Rect rcClient = GetClientRect();
-
- return CPDF_Point(point.x + rcClient.left - m_ptScroll.x,
- point.y + rcClient.top - m_ptScroll.y);
-}
-
-CPDF_Point CPWL_ListCtrl::OutToIn(const CPDF_Point& point) const
-{
- CPDF_Rect rcClient = GetClientRect();
-
- return CPDF_Point(point.x - rcClient.left + m_ptScroll.x,
- point.y - rcClient.top + m_ptScroll.y);
-}
-
-CPDF_Rect CPWL_ListCtrl::InToOut(const CPDF_Rect& rect) const
-{
- CPDF_Rect rcClient = GetClientRect();
-
- return CPDF_Rect(rect.left + rcClient.left - m_ptScroll.x,
- rect.bottom + rcClient.top - m_ptScroll.y,
- rect.right + rcClient.left - m_ptScroll.x,
- rect.top + rcClient.top - m_ptScroll.y);
-}
-
-CPDF_Rect CPWL_ListCtrl::OutToIn(const CPDF_Rect& rect) const
-{
- CPDF_Rect rcClient = GetClientRect();
-
- return CPDF_Rect(rect.left - rcClient.left + m_ptScroll.x,
- rect.bottom - rcClient.top + m_ptScroll.y,
- rect.right - rcClient.left + m_ptScroll.x,
- rect.top - rcClient.top + m_ptScroll.y);
-}
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_ListCtrl.h" + +/* ---------------------------- CPWL_ListCtrl ---------------------------- */ + +CPWL_ListCtrl::CPWL_ListCtrl() : + m_rcContent(0,0,0,0), + m_ptScroll(0,0), + m_fItemSpace(0.0f), + m_fTopSpace(0.0f), + m_fBottomSpace(0.0f) +{ +} + +CPWL_ListCtrl::~CPWL_ListCtrl() +{ +} + +void CPWL_ListCtrl::SetScrollPos(const CPDF_Point& point) +{ + m_ptScroll = point; + + if (m_ptScroll.x < m_rcContent.left) + m_ptScroll.x = m_rcContent.left; + + if (m_ptScroll.x > m_rcContent.right) + m_ptScroll.x = m_rcContent.right; + + if (m_ptScroll.y > m_rcContent.top) + m_ptScroll.y = m_rcContent.top; + + if (m_ptScroll.y < m_rcContent.bottom) + m_ptScroll.y = m_rcContent.bottom; +} + +CPDF_Point CPWL_ListCtrl::GetScrollPos() const +{ + return m_ptScroll; +} + +CPDF_Rect CPWL_ListCtrl::GetScrollArea() const +{ + return m_rcContent; +} + +void CPWL_ListCtrl::ResetFace() +{ + ResetAll(FALSE, 0); +} + +void CPWL_ListCtrl::ResetContent(FX_INT32 nStart) +{ + if (nStart < 0) + nStart = 0; + if (nStart >= 0 && nStart < m_aChildren.GetSize()) + ResetAll(TRUE, nStart); +} + +FX_FLOAT CPWL_ListCtrl::GetContentsHeight(FX_FLOAT fLimitWidth) +{ + FX_FLOAT fRet = m_fTopSpace; + + FX_FLOAT fBorderWidth = (FX_FLOAT)this->GetBorderWidth(); + + if (fLimitWidth > fBorderWidth* 2) + { + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) + { + FX_FLOAT fLeft = pChild->GetItemLeftMargin(); + FX_FLOAT fRight = pChild->GetItemRightMargin(); + + fRet += pChild->GetItemHeight(fLimitWidth - fBorderWidth* 2 - fLeft - fRight); + fRet += m_fItemSpace; + } + } + + fRet -= m_fItemSpace; + } + + fRet += m_fBottomSpace; + + return fRet; +} + +void CPWL_ListCtrl::ResetAll(FX_BOOL bMove, FX_INT32 nStart) +{ + CPDF_Rect rcClient = GetClientRect(); + + FX_FLOAT fWidth = rcClient.Width(); + + FX_FLOAT fy = 0.0f - m_fTopSpace; + + if (nStart-1 >= 0 && nStart-1 < m_aChildren.GetSize()) + if (CPWL_Wnd* pChild = m_aChildren.GetAt(nStart-1)) + fy = pChild->GetWindowRect().bottom - m_fItemSpace; + + for (FX_INT32 i=nStart,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) + { + FX_FLOAT fLeft = pChild->GetItemLeftMargin(); + FX_FLOAT fRight = pChild->GetItemRightMargin(); + + pChild->SetChildMatrix( + CPDF_Matrix(1,0,0,1, + rcClient.left - m_ptScroll.x, + rcClient.top - m_ptScroll.y) + ); + + if (bMove) + { + FX_FLOAT fItemHeight = pChild->GetItemHeight(fWidth - fLeft - fRight); + pChild->Move(CPDF_Rect(fLeft, fy-fItemHeight, fWidth - fRight, fy), TRUE, FALSE); + fy -= fItemHeight; + fy -= m_fItemSpace; + } + } + } + + fy += m_fItemSpace; + + fy -= m_fBottomSpace; + + if (bMove) + { + m_rcContent.left = 0; + m_rcContent.top = 0; + m_rcContent.right = fWidth; + m_rcContent.bottom = fy; + } +} + +void CPWL_ListCtrl::SetItemSpace(FX_FLOAT fSpace) +{ + m_fItemSpace = fSpace; +} + +void CPWL_ListCtrl::SetTopSpace(FX_FLOAT fSpace) +{ + m_fTopSpace = fSpace; +} + +void CPWL_ListCtrl::SetBottomSpace(FX_FLOAT fSpace) +{ + m_fBottomSpace = fSpace; +} + +void CPWL_ListCtrl::RePosChildWnd() +{ + ResetFace(); +} + +void CPWL_ListCtrl::DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + pDevice->SaveState(); + CPDF_Rect rcClient = GetClientRect(); + CPDF_Rect rcTemp = rcClient; + pUser2Device->TransformRect(rcTemp); + FX_RECT rcClip((FX_INT32)rcTemp.left, + (FX_INT32)rcTemp.bottom, + (FX_INT32)rcTemp.right, + (FX_INT32)rcTemp.top); + + pDevice->SetClip_Rect(&rcClip); + + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd * pChild = m_aChildren.GetAt(i)) + { + CPDF_Rect rcChild = pChild->ChildToParent(pChild->GetWindowRect()); + if (!(rcChild.top < rcClient.bottom || rcChild.bottom > rcClient.top)) + { + CPDF_Matrix mt = pChild->GetChildMatrix(); + if (mt.IsIdentity()) + { + pChild->DrawAppearance(pDevice,pUser2Device); + } + else + { + mt.Concat(*pUser2Device); + pChild->DrawAppearance(pDevice,&mt); + } + } + } + } + + pDevice->RestoreState(); +} + +FX_INT32 CPWL_ListCtrl::GetItemIndex(CPWL_Wnd* pItem) +{ + for (FX_INT32 i=0, sz=m_aChildren.GetSize(); i<sz; i++) + { + if (pItem == m_aChildren.GetAt(i)) + return i; + } + + return -1; +} + +CPDF_Point CPWL_ListCtrl::InToOut(const CPDF_Point& point) const +{ + CPDF_Rect rcClient = GetClientRect(); + + return CPDF_Point(point.x + rcClient.left - m_ptScroll.x, + point.y + rcClient.top - m_ptScroll.y); +} + +CPDF_Point CPWL_ListCtrl::OutToIn(const CPDF_Point& point) const +{ + CPDF_Rect rcClient = GetClientRect(); + + return CPDF_Point(point.x - rcClient.left + m_ptScroll.x, + point.y - rcClient.top + m_ptScroll.y); +} + +CPDF_Rect CPWL_ListCtrl::InToOut(const CPDF_Rect& rect) const +{ + CPDF_Rect rcClient = GetClientRect(); + + return CPDF_Rect(rect.left + rcClient.left - m_ptScroll.x, + rect.bottom + rcClient.top - m_ptScroll.y, + rect.right + rcClient.left - m_ptScroll.x, + rect.top + rcClient.top - m_ptScroll.y); +} + +CPDF_Rect CPWL_ListCtrl::OutToIn(const CPDF_Rect& rect) const +{ + CPDF_Rect rcClient = GetClientRect(); + + return CPDF_Rect(rect.left - rcClient.left + m_ptScroll.x, + rect.bottom - rcClient.top + m_ptScroll.y, + rect.right - rcClient.left + m_ptScroll.x, + rect.top - rcClient.top + m_ptScroll.y); +} + diff --git a/fpdfsdk/src/pdfwindow/PWL_Note.cpp b/fpdfsdk/src/pdfwindow/PWL_Note.cpp index 3c6d8661c6..5929a357c9 100644 --- a/fpdfsdk/src/pdfwindow/PWL_Note.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_Note.cpp @@ -1,1779 +1,1779 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_Button.h"
-#include "../../include/pdfwindow/PWL_EditCtrl.h"
-#include "../../include/pdfwindow/PWL_Edit.h"
-#include "../../include/pdfwindow/PWL_ListCtrl.h"
-#include "../../include/pdfwindow/PWL_ScrollBar.h"
-#include "../../include/pdfwindow/PWL_Note.h"
-#include "../../include/pdfwindow/PWL_Label.h"
-#include "../../include/pdfwindow/PWL_Edit.h"
-#include "../../include/pdfwindow/PWL_ScrollBar.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-#include "../../include/pdfwindow/PWL_Caret.h"
-
-#define POPUP_ITEM_HEAD_BOTTOM 3.0f
-#define POPUP_ITEM_BOTTOMWIDTH 1.0f
-#define POPUP_ITEM_SIDEMARGIN 3.0f
-#define POPUP_ITEM_SPACE 4.0f
-#define POPUP_ITEM_TEXT_INDENT 2.0f
-#define POPUP_ITEM_BORDERCOLOR CPWL_Color(COLORTYPE_RGB, 80/255.0f, 80/255.0f, 80/255.0f)
-
-#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
-#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb))
-
-
-/* ------------------------------- CPWL_Note_Options ------------------------------- */
-
-CPWL_Note_Options::CPWL_Note_Options() : m_pText(NULL)
-{
-}
-
-CPWL_Note_Options::~CPWL_Note_Options()
-{
-}
-
-void CPWL_Note_Options::SetTextColor(const CPWL_Color & color)
-{
- CPWL_Wnd::SetTextColor(color);
-
- if (m_pText)
- m_pText->SetTextColor(color);
-}
-
-void CPWL_Note_Options::RePosChildWnd()
-{
- if (this->IsValid())
- {
- ASSERT(m_pText != NULL);
-
- CPDF_Rect rcClient = GetClientRect();
-
- if (rcClient.Width() > 15.0f)
- {
- rcClient.right -= 15.0f;
- m_pText->Move(rcClient, TRUE, FALSE);
- m_pText->SetVisible(TRUE);
- }
- else
- {
- m_pText->Move(CPDF_Rect(0,0,0,0), TRUE, FALSE);
- m_pText->SetVisible(FALSE);
- }
- }
-}
-
-void CPWL_Note_Options::CreateChildWnd(const PWL_CREATEPARAM & cp)
-{
- m_pText = new CPWL_Label;
- PWL_CREATEPARAM tcp = cp;
- tcp.pParentWnd = this;
- tcp.dwFlags = PWS_CHILD | PWS_VISIBLE;
- m_pText->Create(tcp);
-}
-
-void CPWL_Note_Options::SetText(const CFX_WideString& sText)
-{
- m_pText->SetText(sText);
-}
-
-void CPWL_Note_Options::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
-
- CPDF_Rect rcClient = GetClientRect();
- rcClient.left = rcClient.right - 15.0f;
-
- CPDF_Point ptCenter = CPDF_Point((rcClient.left + rcClient.right) * 0.5f, (rcClient.top + rcClient.bottom) * 0.5f);
-
- CPDF_Point pt1(ptCenter.x - 2.0f, ptCenter.y + 2.0f * 0.5f);
- CPDF_Point pt2(ptCenter.x + 2.0f, ptCenter.y + 2.0f * 0.5f);
- CPDF_Point pt3(ptCenter.x, ptCenter.y - 3.0f * 0.5f);
-
- CFX_PathData path;
-
- path.SetPointCount(4);
- path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);
- path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);
- path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);
- path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);
-
- pDevice->DrawPath(&path, pUser2Device, NULL,
- CPWL_Utils::PWLColorToFXColor(GetTextColor(),GetTransparency()),
- 0, FXFILL_ALTERNATE);
-}
-
-CPDF_Rect CPWL_Note_Options::GetContentRect() const
-{
- ASSERT(m_pText != NULL);
-
- CPDF_Rect rcText = m_pText->GetContentRect();
- rcText.right += 15.0f;
- return rcText;
-}
-
-/* ------------------------------- CPWL_Note_Edit ------------------------------ */
-
-CPWL_Note_Edit::CPWL_Note_Edit() : m_bEnableNotify(TRUE),
- m_fOldItemHeight(0.0f),
- m_bSizeChanged(FALSE),
- m_fOldMin(0.0f),
- m_fOldMax(0.0f)
-{
-}
-
-CPWL_Note_Edit::~CPWL_Note_Edit()
-{
-}
-
-void CPWL_Note_Edit::RePosChildWnd()
-{
- m_bEnableNotify = FALSE;
- CPWL_Edit::RePosChildWnd();
- m_bEnableNotify = TRUE;
-
- m_fOldItemHeight = this->GetContentRect().Height();
-}
-
-void CPWL_Note_Edit::SetText(FX_LPCWSTR csText)
-{
- m_bEnableNotify = FALSE;
- CPWL_Edit::SetText(csText);
- m_bEnableNotify = TRUE;
- m_fOldItemHeight = this->GetContentRect().Height();
-}
-
-void CPWL_Note_Edit::OnSetFocus()
-{
- m_bEnableNotify = FALSE;
- CPWL_Edit::OnSetFocus();
- m_bEnableNotify = TRUE;
-
- this->EnableSpellCheck(TRUE);
-}
-
-void CPWL_Note_Edit::OnKillFocus()
-{
- this->EnableSpellCheck(FALSE);
-
- if (CPWL_Wnd* pParent = this->GetParentWindow())
- {
- if (CPWL_Wnd* pGrand = pParent->GetParentWindow())
- {
- ASSERT(pGrand->GetClassName() == "CPWL_NoteItem");
-
- CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pGrand;
-
- pNoteItem->OnContentsValidate();
- }
- }
-
- CPWL_Edit::OnKillFocus();
-}
-
-void CPWL_Note_Edit::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
-{
- if (m_bEnableNotify)
- {
- if (wParam == SBT_VSCROLL)
- {
- switch (msg)
- {
- case PNM_SETSCROLLINFO:
- if (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam)
- {
- if (!IsFloatEqual(pInfo->fContentMax, m_fOldMax) ||
- !IsFloatEqual(pInfo->fContentMin, m_fOldMin))
- {
- m_bSizeChanged = TRUE;
- if (CPWL_Wnd * pParent = this->GetParentWindow())
- {
- pParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
- }
-
- m_fOldMax = pInfo->fContentMax;
- m_fOldMin = pInfo->fContentMin;
- return;
- }
- }
- }
- }
- }
-
- CPWL_Edit::OnNotify(pWnd, msg, wParam, lParam);
-
- if (m_bEnableNotify)
- {
- switch (msg)
- {
- case PNM_SETCARETINFO:
- if (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam)
- {
- PWL_CARET_INFO newInfo = *pInfo;
- newInfo.bVisible = TRUE;
- newInfo.ptHead = this->ChildToParent(pInfo->ptHead);
- newInfo.ptFoot = this->ChildToParent(pInfo->ptFoot);
-
- if (CPWL_Wnd * pParent = this->GetParentWindow())
- {
- pParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&newInfo, 0);
- }
- }
- break;
- }
- }
-}
-
-FX_FLOAT CPWL_Note_Edit::GetItemHeight(FX_FLOAT fLimitWidth)
-{
- if (fLimitWidth > 0)
- {
- if (!m_bSizeChanged)
- return m_fOldItemHeight;
-
- m_bSizeChanged = FALSE;
-
- this->EnableNotify(FALSE);
- this->EnableRefresh(FALSE);
- m_pEdit->EnableNotify(FALSE);
-
- //CPDF_Rect rcOld = this->GetWindowRect();
-
- this->Move(CPDF_Rect(0,0,fLimitWidth,0), TRUE, FALSE);
- FX_FLOAT fRet = this->GetContentRect().Height();
-
- //this->Move(rcOld, TRUE, FALSE);
-
- m_pEdit->EnableNotify(TRUE);
- this->EnableNotify(TRUE);
- this->EnableRefresh(TRUE);
-
- return fRet;
- }
-
- return 0;
-}
-
-FX_FLOAT CPWL_Note_Edit::GetItemLeftMargin()
-{
- return POPUP_ITEM_TEXT_INDENT;
-}
-
-FX_FLOAT CPWL_Note_Edit::GetItemRightMargin()
-{
- return POPUP_ITEM_TEXT_INDENT;
-}
-
-/* -------------------------------- CPWL_Note_LBBox --------------------------------*/
-
-CPWL_Note_LBBox::CPWL_Note_LBBox()
-{
-}
-
-CPWL_Note_LBBox::~CPWL_Note_LBBox()
-{
-}
-
-void CPWL_Note_LBBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- CPDF_Rect rcClient = this->GetClientRect();
-
- CFX_GraphStateData gsd;
- gsd.m_LineWidth = 1.0f;
-
- CFX_PathData pathCross;
-
- pathCross.SetPointCount(4);
- pathCross.SetPoint(0, rcClient.left, rcClient.top, FXPT_MOVETO);
- pathCross.SetPoint(1, rcClient.right, rcClient.bottom, FXPT_LINETO);
- pathCross.SetPoint(2, rcClient.left, rcClient.bottom + rcClient.Height() * 0.5f, FXPT_MOVETO);
- pathCross.SetPoint(3, rcClient.left + rcClient.Width() * 0.5f, rcClient.bottom, FXPT_LINETO);
-
- pDevice->DrawPath(&pathCross, pUser2Device, &gsd,
- 0, CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()), FXFILL_ALTERNATE);
-}
-
-/* -------------------------------- CPWL_Note_RBBox --------------------------------*/
-
-CPWL_Note_RBBox::CPWL_Note_RBBox()
-{
-}
-
-CPWL_Note_RBBox::~CPWL_Note_RBBox()
-{
-}
-
-void CPWL_Note_RBBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- CPDF_Rect rcClient = this->GetClientRect();
-
- CFX_GraphStateData gsd;
- gsd.m_LineWidth = 1.0f;
-
- CFX_PathData pathCross;
-
- pathCross.SetPointCount(4);
- pathCross.SetPoint(0, rcClient.right, rcClient.top, FXPT_MOVETO);
- pathCross.SetPoint(1, rcClient.left, rcClient.bottom, FXPT_LINETO);
- pathCross.SetPoint(2, rcClient.right, rcClient.bottom + rcClient.Height() * 0.5f, FXPT_MOVETO);
- pathCross.SetPoint(3, rcClient.left + rcClient.Width() * 0.5f, rcClient.bottom, FXPT_LINETO);
-
- pDevice->DrawPath(&pathCross, pUser2Device, &gsd,
- 0, CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()), FXFILL_ALTERNATE);
-}
-
-/* --------------------------------- CPWL_Note_Icon ---------------------------------- */
-
-CPWL_Note_Icon::CPWL_Note_Icon() : m_nType(0)
-{
-}
-
-CPWL_Note_Icon::~CPWL_Note_Icon()
-{
-}
-
-void CPWL_Note_Icon::SetIconType(FX_INT32 nType)
-{
- m_nType = nType;
-}
-
-void CPWL_Note_Icon::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- CPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, m_nType, GetClientRect(),
- this->GetBackgroundColor(), PWL_DEFAULT_BLACKCOLOR, this->GetTransparency());
-}
-
-/* --------------------------------- CPWL_Note_CloseBox ---------------------------------- */
-
-CPWL_Note_CloseBox::CPWL_Note_CloseBox() : m_bMouseDown(FALSE)
-{
-}
-
-CPWL_Note_CloseBox::~CPWL_Note_CloseBox()
-{
-}
-
-void CPWL_Note_CloseBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- CPWL_Button::DrawThisAppearance(pDevice, pUser2Device);
-
- CPDF_Rect rcClient = this->GetClientRect();
- rcClient = CPWL_Utils::DeflateRect(rcClient, 2.0f);
-
- CFX_GraphStateData gsd;
- gsd.m_LineWidth = 1.0f;
-
- CFX_PathData pathCross;
-
- if (m_bMouseDown)
- {
- rcClient.left += 0.5f;
- rcClient.right += 0.5f;
- rcClient.top -= 0.5f;
- rcClient.bottom -= 0.5f;
- }
-
- pathCross.SetPointCount(4);
- pathCross.SetPoint(0, rcClient.left, rcClient.bottom, FXPT_MOVETO);
- pathCross.SetPoint(1, rcClient.right, rcClient.top, FXPT_LINETO);
- pathCross.SetPoint(2, rcClient.left, rcClient.top, FXPT_MOVETO);
- pathCross.SetPoint(3, rcClient.right, rcClient.bottom, FXPT_LINETO);
-
- pDevice->DrawPath(&pathCross, pUser2Device, &gsd,
- 0, CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()), FXFILL_ALTERNATE);
-}
-
-FX_BOOL CPWL_Note_CloseBox::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
-{
- SetBorderStyle(PBS_INSET);
- InvalidateRect(NULL);
-
- m_bMouseDown = TRUE;
-
- return CPWL_Button::OnLButtonDown(point,nFlag);
-}
-
-FX_BOOL CPWL_Note_CloseBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
-{
- m_bMouseDown = FALSE;
-
- SetBorderStyle(PBS_BEVELED);
- InvalidateRect(NULL);
-
- return CPWL_Button::OnLButtonUp(point,nFlag);
-}
-
-/* ------------------------------ CPWL_Note_Contents ------------------------------- */
-
-CPWL_Note_Contents::CPWL_Note_Contents() : m_pEdit(NULL)
-{
-}
-
-CPWL_Note_Contents::~CPWL_Note_Contents()
-{
-}
-
-CFX_ByteString CPWL_Note_Contents::GetClassName() const
-{
- return "CPWL_Note_Contents";
-}
-
-void CPWL_Note_Contents::CreateChildWnd(const PWL_CREATEPARAM & cp)
-{
- m_pEdit = new CPWL_Note_Edit;
- PWL_CREATEPARAM ecp = cp;
- ecp.pParentWnd = this;
- ecp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_MULTILINE | PES_AUTORETURN | PES_TEXTOVERFLOW | PES_UNDO | PES_SPELLCHECK;
-
- m_pEdit->EnableNotify(FALSE);
- m_pEdit->Create(ecp);
- m_pEdit->EnableNotify(TRUE);
-}
-
-void CPWL_Note_Contents::SetText(const CFX_WideString& sText)
-{
- if (m_pEdit)
- {
- m_pEdit->EnableNotify(FALSE);
- m_pEdit->SetText(sText);
- m_pEdit->EnableNotify(TRUE);
- OnNotify(m_pEdit, PNM_NOTEEDITCHANGED, 0, 0);
- }
-}
-
-CFX_WideString CPWL_Note_Contents::GetText() const
-{
- if (m_pEdit)
- return m_pEdit->GetText();
-
- return L"";
-}
-
-CPWL_NoteItem* CPWL_Note_Contents::CreateSubItem()
-{
- CPWL_NoteItem* pNoteItem = new CPWL_NoteItem;
- PWL_CREATEPARAM icp = this->GetCreationParam();
- icp.pParentWnd = this;
- icp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_BACKGROUND;
- pNoteItem->Create(icp);
-
- pNoteItem->OnCreateNoteItem();
-
- pNoteItem->ResetSubjectName(m_aChildren.GetSize() - 1);
-
- FX_SYSTEMTIME st;
- if (IFX_SystemHandler* pSH = this->GetSystemHandler())
- st = pSH->GetLocalTime();
- pNoteItem->SetDateTime(st);
-
- pNoteItem->SetContents(L"");
-
- this->OnNotify(pNoteItem, PNM_NOTEEDITCHANGED, 0, 0);
-
- return pNoteItem;
-}
-
-FX_INT32 CPWL_Note_Contents::CountSubItems() const
-{
- return m_aChildren.GetSize() - 1;
-}
-
-IPWL_NoteItem* CPWL_Note_Contents::GetSubItems(FX_INT32 index) const
-{
- FX_INT32 nIndex = index + 1;
-
- if (nIndex > 0 && nIndex < m_aChildren.GetSize())
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(nIndex))
- {
- ASSERT(pChild->GetClassName() == "CPWL_NoteItem");
- CPWL_NoteItem* pItem = (CPWL_NoteItem*)pChild;
- return pItem;
- }
- return NULL;
-}
-
-void CPWL_Note_Contents::DeleteSubItem(IPWL_NoteItem* pNoteItem)
-{
- FX_INT32 nIndex = this->GetItemIndex((CPWL_NoteItem*)pNoteItem);
-
- if (nIndex > 0)
- {
- if (CPWL_NoteItem* pPWLNoteItem = (CPWL_NoteItem*)pNoteItem)
- {
- pPWLNoteItem->KillFocus();
- pPWLNoteItem->Destroy();
- delete pPWLNoteItem;
- }
-
- for (FX_INT32 i=nIndex,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
- {
- ASSERT(pChild->GetClassName() == "CPWL_NoteItem");
- CPWL_NoteItem* pItem = (CPWL_NoteItem*)pChild;
- pItem->ResetSubjectName(i);
- }
- }
-
- this->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
- }
-}
-
-IPWL_NoteItem* CPWL_Note_Contents::GetHitNoteItem(const CPDF_Point& point)
-{
- CPDF_Point pt = this->ParentToChild(point);
-
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
- {
- if (pChild->GetClassName() == "CPWL_NoteItem")
- {
- CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild;
- if (IPWL_NoteItem* pRet = pNoteItem->GetHitNoteItem(pt))
- return pRet;
- }
- }
- }
- return NULL;
-}
-
-void CPWL_Note_Contents::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
-{
- switch (msg)
- {
- case PNM_NOTEEDITCHANGED:
- {
- FX_INT32 nIndex = this->GetItemIndex(pWnd);
- if (nIndex < 0) nIndex = 0;
-
- m_pEdit->EnableNotify(FALSE);
- this->ResetContent(nIndex);
- m_pEdit->EnableNotify(TRUE);
-
- for (FX_INT32 i=nIndex+1, sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
- pChild->OnNotify(this, PNM_NOTERESET, 0, 0);
- }
-
- if (CPWL_Wnd * pParent = this->GetParentWindow())
- {
- pParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
- }
- }
- return;
- case PNM_SCROLLWINDOW:
- this->SetScrollPos(CPDF_Point(0.0f, *(FX_FLOAT*)lParam));
- this->ResetFace();
- InvalidateRect(NULL);
- return;
- case PNM_SETCARETINFO:
- if (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam)
- {
- PWL_CARET_INFO newInfo = *pInfo;
- newInfo.bVisible = TRUE;
- newInfo.ptHead = this->ChildToParent(pInfo->ptHead);
- newInfo.ptFoot = this->ChildToParent(pInfo->ptFoot);
-
- if (CPWL_Wnd * pParent = this->GetParentWindow())
- {
- pParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&newInfo, 0);
- }
- }
- return;
- case PNM_NOTERESET:
- {
- m_pEdit->EnableNotify(FALSE);
- this->ResetContent(0);
- m_pEdit->EnableNotify(TRUE);
-
- for (FX_INT32 i=1, sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
- pChild->OnNotify(this, PNM_NOTERESET, 0, 0);
- }
-
- m_pEdit->EnableNotify(FALSE);
- this->ResetContent(0);
- m_pEdit->EnableNotify(TRUE);
- }
- return;
- }
-
- CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);
-}
-
-FX_BOOL CPWL_Note_Contents::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
-{
- if (CPWL_Wnd::OnLButtonDown(point,nFlag)) return TRUE;
-
- if (!m_pEdit->IsFocused())
- {
- m_pEdit->SetFocus();
- }
-
- return TRUE;
-}
-
-void CPWL_Note_Contents::SetEditFocus(FX_BOOL bLast)
-{
- if (!m_pEdit->IsFocused())
- {
- m_pEdit->SetFocus();
- m_pEdit->SetCaret(bLast ? m_pEdit->GetTotalWords() : 0);
- }
-}
-
-CPWL_Edit* CPWL_Note_Contents::GetEdit() const
-{
- return m_pEdit;
-}
-
-void CPWL_Note_Contents::EnableModify(FX_BOOL bEnabled)
-{
- if (!bEnabled)
- m_pEdit->AddFlag(PWS_READONLY);
- else
- m_pEdit->RemoveFlag(PWS_READONLY);
-
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
- {
- if (pChild->GetClassName() == "CPWL_NoteItem")
- {
- CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild;
- pNoteItem->EnableModify(bEnabled);
- }
- }
- }
-}
-
-void CPWL_Note_Contents::EnableRead(FX_BOOL bEnabled)
-{
- if (!bEnabled)
- m_pEdit->AddFlag(PES_NOREAD);
- else
- m_pEdit->RemoveFlag(PES_NOREAD);
-
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
- {
- if (pChild->GetClassName() == "CPWL_NoteItem")
- {
- CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild;
- pNoteItem->EnableRead(bEnabled);
- }
- }
- }
-}
-
-/* ---------------------------------- CPWL_NoteItem ---------------------------------- */
-
-CPWL_NoteItem::CPWL_NoteItem() :
- m_pPrivateData(NULL),
- m_pSubject(NULL),
- m_pDateTime(NULL),
- m_pContents(NULL),
- m_sAuthor(L""),
- m_fOldItemHeight(0.0f),
- m_bSizeChanged(FALSE),
- m_bAllowModify(TRUE)
-{
-}
-
-CPWL_NoteItem::~CPWL_NoteItem()
-{
-}
-
-CFX_ByteString CPWL_NoteItem::GetClassName() const
-{
- return "CPWL_NoteItem";
-}
-
-void CPWL_NoteItem::CreateChildWnd(const PWL_CREATEPARAM & cp)
-{
- CPWL_Color sTextColor;
-
- if (CPWL_Utils::IsBlackOrWhite(this->GetBackgroundColor()))
- sTextColor = PWL_DEFAULT_WHITECOLOR;
- else
- sTextColor = PWL_DEFAULT_BLACKCOLOR;
-
- m_pSubject = new CPWL_Label;
- PWL_CREATEPARAM scp = cp;
- scp.pParentWnd = this;
- scp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_LEFT | PES_TOP;
- scp.sTextColor = sTextColor;
- m_pSubject->Create(scp);
-
- m_pDateTime = new CPWL_Label;
- PWL_CREATEPARAM dcp = cp;
- dcp.pParentWnd = this;
- dcp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_RIGHT | PES_TOP;
- dcp.sTextColor = sTextColor;
- m_pDateTime->Create(dcp);
-
- m_pContents = new CPWL_Note_Contents;
- PWL_CREATEPARAM ccp = cp;
- ccp.pParentWnd = this;
- //ccp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
- ccp.sBackgroundColor = CPWL_Color(COLORTYPE_RGB, 240/255.0f, 240/255.0f, 240/255.0f);
- ccp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BACKGROUND;
- m_pContents->Create(ccp);
- m_pContents->SetItemSpace(POPUP_ITEM_SPACE);
- m_pContents->SetTopSpace(POPUP_ITEM_SPACE);
- m_pContents->SetBottomSpace(POPUP_ITEM_SPACE);
-}
-
-void CPWL_NoteItem::RePosChildWnd()
-{
- if (this->IsValid())
- {
- ASSERT(m_pSubject != NULL);
- ASSERT(m_pDateTime != NULL);
- ASSERT(m_pContents != NULL);
-
- CPDF_Rect rcClient = GetClientRect();
-
- CPDF_Rect rcSubject = rcClient;
- rcSubject.left += POPUP_ITEM_TEXT_INDENT;
- rcSubject.top = rcClient.top;
- rcSubject.right = PWL_MIN(rcSubject.left + m_pSubject->GetContentRect().Width() + 1.0f, rcClient.right);
- rcSubject.bottom = rcSubject.top - m_pSubject->GetContentRect().Height();
- rcSubject.Normalize();
- m_pSubject->Move(rcSubject, TRUE, FALSE);
- m_pSubject->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcSubject));
-
- CPDF_Rect rcDate = rcClient;
- rcDate.right -= POPUP_ITEM_TEXT_INDENT;
- rcDate.left = PWL_MAX(rcDate.right - m_pDateTime->GetContentRect().Width() - 1.0f, rcSubject.right);
- rcDate.bottom = rcDate.top - m_pDateTime->GetContentRect().Height();
- rcDate.Normalize();
- m_pDateTime->Move(rcDate, TRUE, FALSE);
- m_pDateTime->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcDate));
-
- CPDF_Rect rcContents = rcClient;
- rcContents.left += 1.0f;
- rcContents.right -= 1.0f;
- rcContents.top = rcDate.bottom - POPUP_ITEM_HEAD_BOTTOM;
- rcContents.bottom += POPUP_ITEM_BOTTOMWIDTH;
- rcContents.Normalize();
- m_pContents->Move(rcContents, TRUE, FALSE);
- m_pContents->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcContents));
- }
-
- SetClipRect(CPWL_Utils::InflateRect(GetWindowRect(),1.0f));
-}
-
-void CPWL_NoteItem::SetPrivateData(void* pData)
-{
- m_pPrivateData = pData;
-}
-
-void CPWL_NoteItem::SetBkColor(const CPWL_Color& color)
-{
- CPWL_Color sBK = color;
- this->SetBackgroundColor(sBK);
-
- CPWL_Color sTextColor;
-
- if (CPWL_Utils::IsBlackOrWhite(sBK))
- sTextColor = PWL_DEFAULT_WHITECOLOR;
- else
- sTextColor = PWL_DEFAULT_BLACKCOLOR;
-
- this->SetTextColor(sTextColor);
- if (m_pSubject)
- m_pSubject->SetTextColor(sTextColor);
- if (m_pDateTime)
- m_pDateTime->SetTextColor(sTextColor);
-
- this->InvalidateRect(NULL);
-
- if (IPWL_NoteNotify* pNotify = GetNoteNotify())
- {
- pNotify->OnSetBkColor(this);
- }
-}
-
-void CPWL_NoteItem::SetSubjectName(const CFX_WideString& sName)
-{
- if (m_pSubject)
- {
- m_pSubject->SetText(sName);
- }
-
- if (IPWL_NoteNotify* pNotify = GetNoteNotify())
- {
- pNotify->OnSetSubjectName(this);
- }
-}
-
-void CPWL_NoteItem::SetAuthorName(const CFX_WideString& sName)
-{
- m_sAuthor = sName;
- ResetSubjectName(-1);
-
- if (IPWL_NoteNotify* pNotify = GetNoteNotify())
- {
- pNotify->OnSetAuthorName(this);
- }
-}
-
-void CPWL_NoteItem::ResetSubjectName(FX_INT32 nItemIndex)
-{
- if (nItemIndex < 0)
- {
- if (CPWL_Wnd* pParent = this->GetParentWindow())
- {
- ASSERT(pParent->GetClassName() == "CPWL_Note_Contents");
-
- CPWL_Note_Contents* pContents = (CPWL_Note_Contents*)pParent;
- nItemIndex = pContents->GetItemIndex(this);
- }
- }
-
- const CPWL_Note* pNote = GetNote();
- ASSERT(pNote != NULL);
-
- CFX_WideString sSubject;
- sSubject.Format(pNote->GetReplyString(), nItemIndex);
-
- if (!m_sAuthor.IsEmpty())
- {
-
- sSubject += L" - ";
- sSubject += m_sAuthor;
- }
- this->SetSubjectName(sSubject);
- this->RePosChildWnd();
-}
-
-void CPWL_NoteItem::SetDateTime(FX_SYSTEMTIME time)
-{
- m_dtNote = time;
-
- CFX_WideString swTime;
- swTime.Format((FX_LPCWSTR)L"%04d-%02d-%02d %02d:%02d:%02d", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);
- if (m_pDateTime)
- {
- m_pDateTime->SetText(swTime);
- }
-
- this->RePosChildWnd();
-
- if (IPWL_NoteNotify* pNotify = GetNoteNotify())
- {
- pNotify->OnSetDateTime(this);
- }
-}
-
-void CPWL_NoteItem::SetContents(const CFX_WideString& sContents)
-{
- if (m_pContents)
- {
- m_pContents->SetText(sContents);
- }
-
- if (IPWL_NoteNotify* pNotify = GetNoteNotify())
- {
- pNotify->OnSetContents(this);
- }
-}
-
-CPWL_NoteItem* CPWL_NoteItem::GetParentNoteItem() const
-{
- if (CPWL_Wnd* pParent = this->GetParentWindow())
- {
- if (CPWL_Wnd* pGrand = pParent->GetParentWindow())
- {
- ASSERT(pGrand->GetClassName() == "CPWL_NoteItem");
- return (CPWL_NoteItem*)pGrand;
- }
- }
-
- return NULL;
-}
-
-IPWL_NoteItem* CPWL_NoteItem::GetParentItem() const
-{
- return GetParentNoteItem();
-}
-
-CPWL_Edit* CPWL_NoteItem::GetEdit() const
-{
- if (m_pContents)
- return m_pContents->GetEdit();
- return NULL;
-}
-
-void* CPWL_NoteItem::GetPrivateData() const
-{
- return m_pPrivateData;
-}
-
-CFX_WideString CPWL_NoteItem::GetAuthorName() const
-{
- return m_sAuthor;
-}
-
-CPWL_Color CPWL_NoteItem::GetBkColor() const
-{
- return this->GetBackgroundColor();
-}
-
-CFX_WideString CPWL_NoteItem::GetContents() const
-{
- if (m_pContents)
- return m_pContents->GetText();
-
- return L"";
-}
-
-FX_SYSTEMTIME CPWL_NoteItem::GetDateTime() const
-{
- return m_dtNote;
-}
-
-CFX_WideString CPWL_NoteItem::GetSubjectName() const
-{
- if (m_pSubject)
- return m_pSubject->GetText();
-
- return L"";
-}
-
-CPWL_NoteItem* CPWL_NoteItem::CreateNoteItem()
-{
- if (m_pContents)
- return m_pContents->CreateSubItem();
-
- return NULL;
-}
-
-IPWL_NoteItem* CPWL_NoteItem::CreateSubItem()
-{
- return CreateNoteItem();
-}
-
-FX_INT32 CPWL_NoteItem::CountSubItems() const
-{
- if (m_pContents)
- return m_pContents->CountSubItems();
-
- return 0;
-}
-
-IPWL_NoteItem* CPWL_NoteItem::GetSubItems(FX_INT32 index) const
-{
- if (m_pContents)
- return m_pContents->GetSubItems(index);
-
- return NULL;
-}
-
-void CPWL_NoteItem::DeleteSubItem(IPWL_NoteItem* pNoteItem)
-{
- this->KillFocus();
-
- if (IPWL_NoteNotify* pNotify = GetNoteNotify())
- {
- pNotify->OnItemDelete(pNoteItem);
- }
-
- if (m_pContents)
- m_pContents->DeleteSubItem(pNoteItem);
-}
-
-IPWL_NoteItem* CPWL_NoteItem::GetHitNoteItem(const CPDF_Point& point)
-{
- CPDF_Point pt = this->ParentToChild(point);
-
- if (this->WndHitTest(pt))
- {
- if (m_pContents)
- {
- if (IPWL_NoteItem* pNoteItem = m_pContents->GetHitNoteItem(pt))
- return pNoteItem;
- }
-
- return this;
- }
-
- return NULL;
-}
-
-IPWL_NoteItem* CPWL_NoteItem::GetFocusedNoteItem() const
-{
- if (const CPWL_Wnd* pWnd = this->GetFocused())
- {
- if (pWnd->GetClassName() == "CPWL_Edit")
- {
- if (CPWL_Wnd* pParent = pWnd->GetParentWindow())
- {
- ASSERT(pParent->GetClassName() == "CPWL_Note_Contents");
-
- if (CPWL_Wnd* pGrand = pParent->GetParentWindow())
- {
- ASSERT(pGrand->GetClassName() == "CPWL_NoteItem");
- return (CPWL_NoteItem*)pGrand;
- }
- }
- }
- }
-
- return NULL;
-}
-
-FX_FLOAT CPWL_NoteItem::GetItemHeight(FX_FLOAT fLimitWidth)
-{
- if (fLimitWidth > 0)
- {
- if (!m_bSizeChanged)
- return m_fOldItemHeight;
-
- m_bSizeChanged = FALSE;
-
- ASSERT(m_pSubject != NULL);
- ASSERT(m_pDateTime != NULL);
- ASSERT(m_pContents != NULL);
-
- FX_FLOAT fRet = m_pDateTime->GetContentRect().Height();
- FX_FLOAT fBorderWidth = (FX_FLOAT)this->GetBorderWidth();
- if (fLimitWidth > fBorderWidth * 2)
- fRet += m_pContents->GetContentsHeight(fLimitWidth - fBorderWidth * 2);
- fRet += POPUP_ITEM_HEAD_BOTTOM + POPUP_ITEM_BOTTOMWIDTH + fBorderWidth * 2;
-
- return m_fOldItemHeight = fRet;
- }
-
- return 0;
-}
-
-FX_FLOAT CPWL_NoteItem::GetItemLeftMargin()
-{
- return POPUP_ITEM_SIDEMARGIN;
-}
-
-FX_FLOAT CPWL_NoteItem::GetItemRightMargin()
-{
- return POPUP_ITEM_SIDEMARGIN;
-}
-
-FX_BOOL CPWL_NoteItem::OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag)
-{
- if (!m_pContents->WndHitTest(m_pContents->ParentToChild(point)))
- {
- SetNoteFocus(FALSE);
- }
-
- CPWL_Wnd::OnLButtonDown(point,nFlag);
-
- return TRUE;
-}
-
-FX_BOOL CPWL_NoteItem::OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
-{
- if (!m_pContents->WndHitTest(m_pContents->ParentToChild(point)))
- {
- SetNoteFocus(FALSE);
- PopupNoteItemMenu(point);
-
- return TRUE;
- }
-
- return CPWL_Wnd::OnRButtonUp(point,nFlag);
-}
-
-void CPWL_NoteItem::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
-{
- switch (msg)
- {
- case PNM_NOTEEDITCHANGED:
- m_bSizeChanged = TRUE;
-
- if (CPWL_Wnd* pParent = this->GetParentWindow())
- {
- pParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
- }
- return;
- case PNM_SETCARETINFO:
- if (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam)
- {
- PWL_CARET_INFO newInfo = *pInfo;
- newInfo.bVisible = TRUE;
- newInfo.ptHead = this->ChildToParent(pInfo->ptHead);
- newInfo.ptFoot = this->ChildToParent(pInfo->ptFoot);
-
- if (CPWL_Wnd * pParent = this->GetParentWindow())
- {
- pParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&newInfo, 0);
- }
- }
- return;
- case PNM_NOTERESET:
- m_bSizeChanged = TRUE;
- m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
-
- return;
- }
-
- CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);
-}
-
-void CPWL_NoteItem::PopupNoteItemMenu(const CPDF_Point& point)
-{
- if (IPWL_NoteNotify* pNotify = GetNoteNotify())
- {
- FX_INT32 x,y;
- PWLtoWnd(point, x, y);
- if (IFX_SystemHandler* pSH = GetSystemHandler())
- pSH->ClientToScreen(GetAttachedHWnd(), x, y);
- pNotify->OnPopupMenu(this, x, y);
- }
-}
-
-const CPWL_Note* CPWL_NoteItem::GetNote() const
-{
- if (const CPWL_Wnd* pRoot = this->GetRootWnd())
- {
- ASSERT(pRoot->GetClassName() == "CPWL_NoteItem");
- CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pRoot;
- if (pNoteItem->IsTopItem())
- {
- return (CPWL_Note*)pNoteItem;
- }
- }
-
- return NULL;
-}
-
-IPWL_NoteNotify* CPWL_NoteItem::GetNoteNotify() const
-{
- if (const CPWL_Note* pNote = GetNote())
- return pNote->GetNoteNotify();
-
- return NULL;
-}
-
-void CPWL_NoteItem::OnCreateNoteItem()
-{
- if (IPWL_NoteNotify* pNotify = GetNoteNotify())
- {
- pNotify->OnItemCreate(this);
- }
-}
-
-void CPWL_NoteItem::OnContentsValidate()
-{
- if (IPWL_NoteNotify* pNotify = GetNoteNotify())
- {
- pNotify->OnSetContents(this);
- }
-}
-
-void CPWL_NoteItem::SetNoteFocus(FX_BOOL bLast)
-{
- m_pContents->SetEditFocus(bLast);
-}
-
-void CPWL_NoteItem::EnableModify(FX_BOOL bEnabled)
-{
- m_pContents->EnableModify(bEnabled);
- m_bAllowModify = bEnabled;
-}
-
-void CPWL_NoteItem::EnableRead(FX_BOOL bEnabled)
-{
- m_pContents->EnableRead(bEnabled);
-}
-
-/* ---------------------------------- CPWL_Note ---------------------------------- */
-
-CPWL_Note::CPWL_Note(IPopup_Note* pPopupNote, IPWL_NoteNotify* pNoteNotify, IPWL_NoteHandler* pNoteHandler) :
- m_pAuthor(NULL),
- m_pIcon(NULL),
- m_pCloseBox(NULL),
- m_pContentsBar(NULL),
- m_pLBBox(NULL),
- m_pRBBox(NULL),
- m_pOptions(NULL),
- m_bResizing(FALSE),
- m_rcCaption(0,0,0,0),
- m_pNoteNotify(pNoteNotify),
- m_bEnalbleNotify(TRUE),
- m_pPopupNote(pPopupNote),
- m_pNoteHandler(pNoteHandler)
-{
-}
-
-CPWL_Note::~CPWL_Note()
-{
-}
-
-IPWL_NoteItem* CPWL_Note::Reply()
-{
- return CreateNoteItem();
-}
-
-void CPWL_Note::EnableNotify(FX_BOOL bEnabled)
-{
- m_bEnalbleNotify = bEnabled;
-}
-
-void CPWL_Note::RePosChildWnd()
-{
- RePosNoteChildren();
- m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
- ResetScrollBar();
- m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
- this->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
- //ͬ²½
- if (const CPWL_Wnd* pWnd = this->GetFocused())
- {
- if (pWnd->GetClassName() == "CPWL_Edit")
- {
- CPWL_Edit* pEdit = (CPWL_Edit*)pWnd;
- pEdit->SetCaret(pEdit->GetCaret());
- }
- }
- //CPDF_Point ptNew = m_pContents->GetScrollPos();
- //m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);
-}
-
-FX_BOOL CPWL_Note::ResetScrollBar()
-{
- FX_BOOL bScrollChanged = FALSE;
-
- if (ScrollBarShouldVisible())
- {
- if (!m_pContentsBar->IsVisible())
- {
- m_pContentsBar->SetVisible(TRUE);
- if (m_pContentsBar->IsVisible())
- {
- m_pContentsBar->InvalidateRect(NULL);
- bScrollChanged = TRUE;
- }
- }
- }
- else
- {
- if (m_pContentsBar->IsVisible())
- {
- m_pContentsBar->SetVisible(FALSE);
- m_pContentsBar->InvalidateRect(NULL);
-
- bScrollChanged = TRUE;
- }
- }
-
- if (bScrollChanged)
- {
- CPDF_Rect rcNote = this->GetClientRect();
- CPDF_Rect rcContents = m_pContents->GetWindowRect();
- rcContents.right = rcNote.right - 3.0f;
- if (m_pContentsBar->IsVisible())
- rcContents.right -= PWL_SCROLLBAR_WIDTH;
- m_pContents->Move(rcContents, TRUE, TRUE);
- m_pContents->SetScrollPos(CPDF_Point(0.0f,0.0f));
- m_pContents->InvalidateRect(NULL);
- }
-
- return bScrollChanged;
-}
-
-FX_BOOL CPWL_Note::ScrollBarShouldVisible()
-{
- CPDF_Rect rcContentsFact = m_pContents->GetScrollArea();
- CPDF_Rect rcContentsClient = m_pContents->GetClientRect();
-
- return rcContentsFact.Height() > rcContentsClient.Height();
-}
-
-void CPWL_Note::SetOptionsText(const CFX_WideString& sText)
-{
- if (m_pOptions)
- m_pOptions->SetText(sText);
-
- RePosNoteChildren();
-}
-
-void CPWL_Note::RePosNoteChildren()
-{
- if (m_bResizing) return;
-
- m_bResizing = TRUE;
-
- if (this->IsValid())
- {
- ASSERT(m_pSubject != NULL);
- ASSERT(m_pDateTime != NULL);
- ASSERT(m_pContents != NULL);
- ASSERT(m_pAuthor != NULL);
- ASSERT(m_pCloseBox != NULL);
- ASSERT(m_pIcon != NULL);
- ASSERT(m_pLBBox != NULL);
- ASSERT(m_pRBBox != NULL);
- ASSERT(m_pContentsBar != NULL);
- ASSERT(m_pOptions != NULL);
-
- CPDF_Rect rcClient = GetClientRect();
-
- CPDF_Rect rcIcon = rcClient;
- rcIcon.top -= 2.0f;
- rcIcon.right = rcIcon.left + 14.0f;
- rcIcon.bottom = rcIcon.top - 14.0f;
- rcIcon.Normalize();
- m_pIcon->Move(rcIcon, TRUE, FALSE);
- m_pIcon->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcIcon));
-
- CPDF_Rect rcCloseBox = rcClient;
- rcCloseBox.right -= 1.0f;
- rcCloseBox.top -= 1.0f;
- rcCloseBox.left = rcCloseBox.right - 14.0f;
- rcCloseBox.bottom = rcCloseBox.top - 14.0f;
- rcCloseBox.Normalize();
- m_pCloseBox->Move(rcCloseBox, TRUE, FALSE);
- m_pCloseBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcCloseBox));
-
- CPDF_Rect rcDate = rcClient;
- rcDate.right = rcCloseBox.left - POPUP_ITEM_TEXT_INDENT;
- rcDate.left = PWL_MAX(rcDate.right - m_pDateTime->GetContentRect().Width() - 1.0f, rcIcon.right + 1.0f);
- rcDate.top = rcClient.top - 2.0f;
- rcDate.bottom = rcDate.top - m_pDateTime->GetContentRect().Height();
- rcDate.Normalize();
- m_pDateTime->Move(rcDate, TRUE, FALSE);
- m_pDateTime->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcDate));
-
- CPDF_Rect rcSubject = rcClient;
- rcSubject.top = rcClient.top - 2.0f;
- rcSubject.left = rcIcon.right + POPUP_ITEM_TEXT_INDENT;
- rcSubject.right = PWL_MIN(rcSubject.left + m_pSubject->GetContentRect().Width() + 1.0f, rcDate.left - 1.0f);
- rcSubject.bottom = rcSubject.top - m_pSubject->GetContentRect().Height();
- rcSubject.Normalize();
- m_pSubject->Move(rcSubject, TRUE, FALSE);
- m_pSubject->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcSubject));
-
- CPDF_Rect rcOptions = rcClient;
- rcOptions.left = PWL_MAX(rcOptions.right - m_pOptions->GetContentRect().Width(), rcIcon.right + 1.0f);
- rcOptions.top = rcSubject.bottom - 4.0f;
- rcOptions.bottom = rcOptions.top - m_pOptions->GetContentRect().Height();
- rcOptions.Normalize();
- m_pOptions->Move(rcOptions, TRUE, FALSE);
- m_pOptions->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcOptions));
-
- CPDF_Rect rcAuthor = rcClient;
- rcAuthor.top = rcSubject.bottom - 4.0f;
- rcAuthor.left = rcSubject.left;
- rcAuthor.right = PWL_MIN(rcSubject.left + m_pAuthor->GetContentRect().Width() + 1.0f, rcOptions.left - 1.0f);
- rcAuthor.bottom = rcAuthor.top - m_pAuthor->GetContentRect().Height();
- rcAuthor.Normalize();
- m_pAuthor->Move(rcAuthor, TRUE, FALSE);
- m_pAuthor->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcAuthor));
-
- CPDF_Rect rcLBBox = rcClient;
- rcLBBox.top = rcLBBox.bottom + 7.0f;
- rcLBBox.right = rcLBBox.left + 7.0f;
- rcLBBox.Normalize();
- m_pLBBox->Move(rcLBBox, TRUE, FALSE);
- m_pLBBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcLBBox));
-
- CPDF_Rect rcRBBox = rcClient;
- rcRBBox.top = rcRBBox.bottom + 7.0f;
- rcRBBox.left = rcRBBox.right - 7.0f;
- rcRBBox.Normalize();
- m_pRBBox->Move(rcRBBox, TRUE, FALSE);
- m_pRBBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcRBBox));
-
- CPDF_Rect rcContents = rcClient;
- rcContents.top = rcAuthor.bottom - POPUP_ITEM_HEAD_BOTTOM;
- rcContents.left += 3.0f;
- rcContents.right -= 3.0f;
- if (m_pContentsBar->IsVisible())
- rcContents.right -= PWL_SCROLLBAR_WIDTH;
- rcContents.bottom += 14.0f;
- rcContents.Normalize();
- m_pContents->Move(rcContents, FALSE, FALSE);
- m_pContents->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcContents));
-
- CPDF_Rect rcContentsBar = rcContents;
- rcContentsBar.right = rcClient.right - 3.0f;
- rcContentsBar.left = rcContentsBar.right - PWL_SCROLLBAR_WIDTH;
- rcContentsBar.Normalize();
- m_pContentsBar->Move(rcContentsBar, TRUE, FALSE);
-
- m_rcCaption = rcClient;
- m_rcCaption.bottom = rcContents.top;
- }
-
- m_bResizing = FALSE;
-}
-
-//0-normal / 1-caption / 2-leftbottom corner / 3-rightbottom corner / 4-close / 5-options
-FX_INT32 CPWL_Note::NoteHitTest(const CPDF_Point& point) const
-{
- ASSERT(m_pSubject != NULL);
- ASSERT(m_pDateTime != NULL);
- ASSERT(m_pContents != NULL);
- ASSERT(m_pAuthor != NULL);
- ASSERT(m_pIcon != NULL);
- ASSERT(m_pContentsBar != NULL);
-
- ASSERT(m_pCloseBox != NULL);
- ASSERT(m_pLBBox != NULL);
- ASSERT(m_pRBBox != NULL);
- ASSERT(m_pOptions != NULL);
-
- GetClientRect();
-
- if (m_pSubject->WndHitTest(m_pSubject->ParentToChild(point))) return 1;
- if (m_pDateTime->WndHitTest(m_pDateTime->ParentToChild(point))) return 1;
- if (m_pAuthor->WndHitTest(m_pAuthor->ParentToChild(point))) return 1;
- if (m_pIcon->WndHitTest(m_pIcon->ParentToChild(point))) return 1;
-
- if (m_pContents->WndHitTest(m_pContents->ParentToChild(point))) return 0;
- if (m_pContentsBar->WndHitTest(m_pContentsBar->ParentToChild(point))) return 0;
-
- if (m_pCloseBox->WndHitTest(m_pCloseBox->ParentToChild(point))) return 4;
- if (m_pLBBox->WndHitTest(m_pLBBox->ParentToChild(point))) return 2;
- if (m_pRBBox->WndHitTest(m_pRBBox->ParentToChild(point))) return 3;
- if (m_pOptions->WndHitTest(m_pOptions->ParentToChild(point))) return 5;
-
- return 1;
-}
-
-void CPWL_Note::CreateChildWnd(const PWL_CREATEPARAM & cp)
-{
- CPWL_NoteItem::CreateChildWnd(cp);
-
- CPWL_Color sTextColor;
-
- if (CPWL_Utils::IsBlackOrWhite(this->GetBackgroundColor()))
- sTextColor = PWL_DEFAULT_WHITECOLOR;
- else
- sTextColor = PWL_DEFAULT_BLACKCOLOR;
-
- m_pAuthor = new CPWL_Label;
- PWL_CREATEPARAM acp = cp;
- acp.pParentWnd = this;
- acp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_LEFT | PES_TOP;
- acp.sTextColor = sTextColor;
- m_pAuthor->Create(acp);
-
- m_pCloseBox = new CPWL_Note_CloseBox;
- PWL_CREATEPARAM ccp = cp;
- ccp.pParentWnd = this;
- ccp.dwBorderWidth = 2;
- ccp.nBorderStyle = PBS_BEVELED;
- ccp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER;
- ccp.sTextColor = sTextColor;
- m_pCloseBox->Create(ccp);
-
- m_pIcon = new CPWL_Note_Icon;
- PWL_CREATEPARAM icp = cp;
- icp.pParentWnd = this;
- icp.dwFlags = PWS_VISIBLE | PWS_CHILD;
- m_pIcon->Create(icp);
-
- m_pOptions = new CPWL_Note_Options;
- PWL_CREATEPARAM ocp = cp;
- ocp.pParentWnd = this;
- ocp.dwFlags = PWS_CHILD | PWS_VISIBLE;
- ocp.sTextColor = sTextColor;
- m_pOptions->Create(ocp);
-
- m_pLBBox = new CPWL_Note_LBBox;
- PWL_CREATEPARAM lcp = cp;
- lcp.pParentWnd = this;
- lcp.dwFlags = PWS_VISIBLE | PWS_CHILD;
- lcp.eCursorType = FXCT_NESW;
- lcp.sTextColor = sTextColor;
- m_pLBBox->Create(lcp);
-
- m_pRBBox = new CPWL_Note_RBBox;
- PWL_CREATEPARAM rcp = cp;
- rcp.pParentWnd = this;
- rcp.dwFlags = PWS_VISIBLE | PWS_CHILD;
- rcp.eCursorType = FXCT_NWSE;
- rcp.sTextColor = sTextColor;
- m_pRBBox->Create(rcp);
-
- m_pContentsBar = new CPWL_ScrollBar(SBT_VSCROLL);
- PWL_CREATEPARAM scp = cp;
- scp.pParentWnd = this;
- scp.sBackgroundColor = CPWL_Color(COLORTYPE_RGB, 240/255.0f, 240/255.0f, 240/255.0f);
- scp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_BACKGROUND;
- m_pContentsBar->Create(scp);
- m_pContentsBar->SetNotifyForever(TRUE);
-}
-
-void CPWL_Note::SetSubjectName(const CFX_WideString& sName)
-{
- CPWL_NoteItem::SetSubjectName(sName);
- RePosChildWnd();
-}
-
-void CPWL_Note::SetAuthorName(const CFX_WideString& sName)
-{
- if (m_pAuthor)
- {
- m_pAuthor->SetText(sName);
- RePosChildWnd();
- }
-
- if (IPWL_NoteNotify* pNotify = GetNoteNotify())
- {
- pNotify->OnSetAuthorName(this);
- }
-}
-
-CFX_WideString CPWL_Note::GetAuthorName() const
-{
- if (m_pAuthor)
- return m_pAuthor->GetText();
-
- return L"";
-}
-
-FX_BOOL CPWL_Note::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPDF_Point ptScroll = m_pContents->GetScrollPos();
- CPDF_Rect rcScroll = m_pContents->GetScrollArea();
- CPDF_Rect rcContents = m_pContents->GetClientRect();
-
- if (rcScroll.top - rcScroll.bottom > rcContents.Height())
- {
- CPDF_Point ptNew = ptScroll;
-
- if (zDelta > 0)
- ptNew.y += 30;
- else
- ptNew.y -= 30;
-
- if (ptNew.y > rcScroll.top)
- ptNew.y = rcScroll.top;
- if (ptNew.y < rcScroll.bottom + rcContents.Height())
- ptNew.y = rcScroll.bottom + rcContents.Height();
- if (ptNew.y < rcScroll.bottom)
- ptNew.y = rcScroll.bottom;
-
- if (ptNew.y != ptScroll.y)
- {
- m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
- m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);
- m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);
-
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-void CPWL_Note::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
-{
- switch (msg)
- {
- case PNM_NOTEEDITCHANGED:
- {
- CPDF_Rect rcScroll = m_pContents->GetScrollArea();
-
-
- PWL_SCROLL_INFO sInfo;
- sInfo.fContentMin = rcScroll.bottom;
- sInfo.fContentMax = rcScroll.top;
- sInfo.fPlateWidth = m_pContents->GetClientRect().Height();
- sInfo.fSmallStep = 13.0f;
- sInfo.fBigStep = sInfo.fPlateWidth;
-
- if (FXSYS_memcmp(&m_OldScrollInfo, &sInfo, sizeof(PWL_SCROLL_INFO)) != 0)
- {
- FX_BOOL bScrollChanged = FALSE;
-
- if (lParam < 3) //·ÀÖ¹ËÀÑ»· mantis:15759
- {
- bScrollChanged = ResetScrollBar();
- if (bScrollChanged)
- {
- lParam++;
- m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
- this->OnNotify(this, PNM_NOTEEDITCHANGED, 0, lParam);
- }
- }
-
- if (!bScrollChanged)
- {
- if (m_pContentsBar->IsVisible())
- {
- m_pContentsBar->OnNotify(pWnd, PNM_SETSCROLLINFO, SBT_VSCROLL, (FX_INTPTR)&sInfo);
- m_OldScrollInfo = sInfo;
-
- CPDF_Point ptScroll = m_pContents->GetScrollPos();
- CPDF_Point ptOld = ptScroll;
-
- if (ptScroll.y > sInfo.fContentMax)
- ptScroll.y = sInfo.fContentMax;
- if (ptScroll.y < sInfo.fContentMin + sInfo.fPlateWidth)
- ptScroll.y = sInfo.fContentMin + sInfo.fPlateWidth;
- if (ptScroll.y < sInfo.fContentMin)
- ptScroll.y = sInfo.fContentMin;
-
- if (ptOld.y != ptScroll.y)
- {
- m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);
- m_pContentsBar->InvalidateRect(NULL);
- m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);
- }
- }
- }
- }
- }
-
- m_pContents->InvalidateRect(NULL);
-
- return;
- case PNM_SCROLLWINDOW:
- if (m_pContents)
- m_pContents->OnNotify(pWnd, msg, wParam, lParam);
- return;
- case PNM_SETSCROLLPOS:
- if (m_pContentsBar)
- m_pContentsBar->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);
- return;
- }
-
- if (msg == PNM_SETCARETINFO && IsValid())
- {
- if (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam)
- {
- if (m_pContents)
- {
- CPDF_Rect rcClient = m_pContents->GetClientRect();
- if (pInfo->ptHead.y > rcClient.top)
- {
- CPDF_Point pt = m_pContents->OutToIn(pInfo->ptHead);
- m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&pt.y);
-
- CPDF_Point ptScroll = m_pContents->GetScrollPos();
- m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);
-
- return;
- }
-
- if (pInfo->ptFoot.y < rcClient.bottom)
- {
- CPDF_Point pt = m_pContents->OutToIn(pInfo->ptFoot);
- pt.y += rcClient.Height();
- m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&pt.y);
-
- CPDF_Point ptScroll = m_pContents->GetScrollPos();
- m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);
-
- return;
- }
- }
- }
- }
-
- CPWL_NoteItem::OnNotify(pWnd, msg, wParam, lParam);
-}
-
-void CPWL_Note::SetBkColor(const CPWL_Color& color)
-{
- CPWL_NoteItem::SetBkColor(color);
-
- CPWL_Color sBK = color;
- CPWL_Color sTextColor;
- if (CPWL_Utils::IsBlackOrWhite(sBK))
- sTextColor = PWL_DEFAULT_WHITECOLOR;
- else
- sTextColor = PWL_DEFAULT_BLACKCOLOR;
-
- if (m_pCloseBox)
- m_pCloseBox->SetTextColor(sTextColor);
- if (m_pAuthor)
- m_pAuthor->SetTextColor(sTextColor);
- if (m_pOptions)
- m_pOptions->SetTextColor(sTextColor);
- if (m_pLBBox)
- m_pLBBox->SetTextColor(sTextColor);
- if (m_pRBBox)
- m_pRBBox->SetTextColor(sTextColor);
-}
-
-FX_BOOL CPWL_Note::OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag)
-{
- if (m_pOptions->WndHitTest(m_pOptions->ParentToChild(point)))
- {
- if (IPWL_NoteNotify* pNotify = this->GetNoteNotify())
- {
- FX_INT32 x, y;
- PWLtoWnd(point, x, y);
- if (IFX_SystemHandler* pSH = GetSystemHandler())
- pSH->ClientToScreen(GetAttachedHWnd(), x, y);
- this->KillFocus();
- pNotify->OnPopupMenu(x, y);
-
- return TRUE;
- }
- }
-
- return CPWL_Wnd::OnLButtonDown(point,nFlag);
-}
-
-FX_BOOL CPWL_Note::OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
-{
- return CPWL_Wnd::OnRButtonUp(point,nFlag);
-}
-
-const CPWL_Note* CPWL_Note::GetNote() const
-{
- return this;
-}
-
-IPWL_NoteNotify* CPWL_Note::GetNoteNotify() const
-{
- if (m_bEnalbleNotify)
- return m_pNoteNotify;
-
- return NULL;
-}
-
-void CPWL_Note::SetIconType(FX_INT32 nType)
-{
- if (m_pIcon)
- m_pIcon->SetIconType(nType);
-}
-
-void CPWL_Note::EnableModify(FX_BOOL bEnabled)
-{
- m_pContents->EnableModify(bEnabled);
-}
-
-void CPWL_Note::EnableRead(FX_BOOL bEnabled)
-{
- m_pContents->EnableRead(bEnabled);
-}
-
-CFX_WideString CPWL_Note::GetReplyString() const
-{
- return m_sReplyString;
-}
-
-void CPWL_Note::SetReplyString(const CFX_WideString& string)
-{
- m_sReplyString = string;
-}
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_Button.h" +#include "../../include/pdfwindow/PWL_EditCtrl.h" +#include "../../include/pdfwindow/PWL_Edit.h" +#include "../../include/pdfwindow/PWL_ListCtrl.h" +#include "../../include/pdfwindow/PWL_ScrollBar.h" +#include "../../include/pdfwindow/PWL_Note.h" +#include "../../include/pdfwindow/PWL_Label.h" +#include "../../include/pdfwindow/PWL_Edit.h" +#include "../../include/pdfwindow/PWL_ScrollBar.h" +#include "../../include/pdfwindow/PWL_Utils.h" +#include "../../include/pdfwindow/PWL_Caret.h" + +#define POPUP_ITEM_HEAD_BOTTOM 3.0f +#define POPUP_ITEM_BOTTOMWIDTH 1.0f +#define POPUP_ITEM_SIDEMARGIN 3.0f +#define POPUP_ITEM_SPACE 4.0f +#define POPUP_ITEM_TEXT_INDENT 2.0f +#define POPUP_ITEM_BORDERCOLOR CPWL_Color(COLORTYPE_RGB, 80/255.0f, 80/255.0f, 80/255.0f) + +#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) +#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) +#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) +#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb)) + + +/* ------------------------------- CPWL_Note_Options ------------------------------- */ + +CPWL_Note_Options::CPWL_Note_Options() : m_pText(NULL) +{ +} + +CPWL_Note_Options::~CPWL_Note_Options() +{ +} + +void CPWL_Note_Options::SetTextColor(const CPWL_Color & color) +{ + CPWL_Wnd::SetTextColor(color); + + if (m_pText) + m_pText->SetTextColor(color); +} + +void CPWL_Note_Options::RePosChildWnd() +{ + if (this->IsValid()) + { + ASSERT(m_pText != NULL); + + CPDF_Rect rcClient = GetClientRect(); + + if (rcClient.Width() > 15.0f) + { + rcClient.right -= 15.0f; + m_pText->Move(rcClient, TRUE, FALSE); + m_pText->SetVisible(TRUE); + } + else + { + m_pText->Move(CPDF_Rect(0,0,0,0), TRUE, FALSE); + m_pText->SetVisible(FALSE); + } + } +} + +void CPWL_Note_Options::CreateChildWnd(const PWL_CREATEPARAM & cp) +{ + m_pText = new CPWL_Label; + PWL_CREATEPARAM tcp = cp; + tcp.pParentWnd = this; + tcp.dwFlags = PWS_CHILD | PWS_VISIBLE; + m_pText->Create(tcp); +} + +void CPWL_Note_Options::SetText(const CFX_WideString& sText) +{ + m_pText->SetText(sText); +} + +void CPWL_Note_Options::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); + + CPDF_Rect rcClient = GetClientRect(); + rcClient.left = rcClient.right - 15.0f; + + CPDF_Point ptCenter = CPDF_Point((rcClient.left + rcClient.right) * 0.5f, (rcClient.top + rcClient.bottom) * 0.5f); + + CPDF_Point pt1(ptCenter.x - 2.0f, ptCenter.y + 2.0f * 0.5f); + CPDF_Point pt2(ptCenter.x + 2.0f, ptCenter.y + 2.0f * 0.5f); + CPDF_Point pt3(ptCenter.x, ptCenter.y - 3.0f * 0.5f); + + CFX_PathData path; + + path.SetPointCount(4); + path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO); + path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO); + path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO); + path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO); + + pDevice->DrawPath(&path, pUser2Device, NULL, + CPWL_Utils::PWLColorToFXColor(GetTextColor(),GetTransparency()), + 0, FXFILL_ALTERNATE); +} + +CPDF_Rect CPWL_Note_Options::GetContentRect() const +{ + ASSERT(m_pText != NULL); + + CPDF_Rect rcText = m_pText->GetContentRect(); + rcText.right += 15.0f; + return rcText; +} + +/* ------------------------------- CPWL_Note_Edit ------------------------------ */ + +CPWL_Note_Edit::CPWL_Note_Edit() : m_bEnableNotify(TRUE), + m_fOldItemHeight(0.0f), + m_bSizeChanged(FALSE), + m_fOldMin(0.0f), + m_fOldMax(0.0f) +{ +} + +CPWL_Note_Edit::~CPWL_Note_Edit() +{ +} + +void CPWL_Note_Edit::RePosChildWnd() +{ + m_bEnableNotify = FALSE; + CPWL_Edit::RePosChildWnd(); + m_bEnableNotify = TRUE; + + m_fOldItemHeight = this->GetContentRect().Height(); +} + +void CPWL_Note_Edit::SetText(FX_LPCWSTR csText) +{ + m_bEnableNotify = FALSE; + CPWL_Edit::SetText(csText); + m_bEnableNotify = TRUE; + m_fOldItemHeight = this->GetContentRect().Height(); +} + +void CPWL_Note_Edit::OnSetFocus() +{ + m_bEnableNotify = FALSE; + CPWL_Edit::OnSetFocus(); + m_bEnableNotify = TRUE; + + this->EnableSpellCheck(TRUE); +} + +void CPWL_Note_Edit::OnKillFocus() +{ + this->EnableSpellCheck(FALSE); + + if (CPWL_Wnd* pParent = this->GetParentWindow()) + { + if (CPWL_Wnd* pGrand = pParent->GetParentWindow()) + { + ASSERT(pGrand->GetClassName() == "CPWL_NoteItem"); + + CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pGrand; + + pNoteItem->OnContentsValidate(); + } + } + + CPWL_Edit::OnKillFocus(); +} + +void CPWL_Note_Edit::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam) +{ + if (m_bEnableNotify) + { + if (wParam == SBT_VSCROLL) + { + switch (msg) + { + case PNM_SETSCROLLINFO: + if (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam) + { + if (!IsFloatEqual(pInfo->fContentMax, m_fOldMax) || + !IsFloatEqual(pInfo->fContentMin, m_fOldMin)) + { + m_bSizeChanged = TRUE; + if (CPWL_Wnd * pParent = this->GetParentWindow()) + { + pParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0); + } + + m_fOldMax = pInfo->fContentMax; + m_fOldMin = pInfo->fContentMin; + return; + } + } + } + } + } + + CPWL_Edit::OnNotify(pWnd, msg, wParam, lParam); + + if (m_bEnableNotify) + { + switch (msg) + { + case PNM_SETCARETINFO: + if (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam) + { + PWL_CARET_INFO newInfo = *pInfo; + newInfo.bVisible = TRUE; + newInfo.ptHead = this->ChildToParent(pInfo->ptHead); + newInfo.ptFoot = this->ChildToParent(pInfo->ptFoot); + + if (CPWL_Wnd * pParent = this->GetParentWindow()) + { + pParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&newInfo, 0); + } + } + break; + } + } +} + +FX_FLOAT CPWL_Note_Edit::GetItemHeight(FX_FLOAT fLimitWidth) +{ + if (fLimitWidth > 0) + { + if (!m_bSizeChanged) + return m_fOldItemHeight; + + m_bSizeChanged = FALSE; + + this->EnableNotify(FALSE); + this->EnableRefresh(FALSE); + m_pEdit->EnableNotify(FALSE); + + //CPDF_Rect rcOld = this->GetWindowRect(); + + this->Move(CPDF_Rect(0,0,fLimitWidth,0), TRUE, FALSE); + FX_FLOAT fRet = this->GetContentRect().Height(); + + //this->Move(rcOld, TRUE, FALSE); + + m_pEdit->EnableNotify(TRUE); + this->EnableNotify(TRUE); + this->EnableRefresh(TRUE); + + return fRet; + } + + return 0; +} + +FX_FLOAT CPWL_Note_Edit::GetItemLeftMargin() +{ + return POPUP_ITEM_TEXT_INDENT; +} + +FX_FLOAT CPWL_Note_Edit::GetItemRightMargin() +{ + return POPUP_ITEM_TEXT_INDENT; +} + +/* -------------------------------- CPWL_Note_LBBox --------------------------------*/ + +CPWL_Note_LBBox::CPWL_Note_LBBox() +{ +} + +CPWL_Note_LBBox::~CPWL_Note_LBBox() +{ +} + +void CPWL_Note_LBBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + CPDF_Rect rcClient = this->GetClientRect(); + + CFX_GraphStateData gsd; + gsd.m_LineWidth = 1.0f; + + CFX_PathData pathCross; + + pathCross.SetPointCount(4); + pathCross.SetPoint(0, rcClient.left, rcClient.top, FXPT_MOVETO); + pathCross.SetPoint(1, rcClient.right, rcClient.bottom, FXPT_LINETO); + pathCross.SetPoint(2, rcClient.left, rcClient.bottom + rcClient.Height() * 0.5f, FXPT_MOVETO); + pathCross.SetPoint(3, rcClient.left + rcClient.Width() * 0.5f, rcClient.bottom, FXPT_LINETO); + + pDevice->DrawPath(&pathCross, pUser2Device, &gsd, + 0, CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()), FXFILL_ALTERNATE); +} + +/* -------------------------------- CPWL_Note_RBBox --------------------------------*/ + +CPWL_Note_RBBox::CPWL_Note_RBBox() +{ +} + +CPWL_Note_RBBox::~CPWL_Note_RBBox() +{ +} + +void CPWL_Note_RBBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + CPDF_Rect rcClient = this->GetClientRect(); + + CFX_GraphStateData gsd; + gsd.m_LineWidth = 1.0f; + + CFX_PathData pathCross; + + pathCross.SetPointCount(4); + pathCross.SetPoint(0, rcClient.right, rcClient.top, FXPT_MOVETO); + pathCross.SetPoint(1, rcClient.left, rcClient.bottom, FXPT_LINETO); + pathCross.SetPoint(2, rcClient.right, rcClient.bottom + rcClient.Height() * 0.5f, FXPT_MOVETO); + pathCross.SetPoint(3, rcClient.left + rcClient.Width() * 0.5f, rcClient.bottom, FXPT_LINETO); + + pDevice->DrawPath(&pathCross, pUser2Device, &gsd, + 0, CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()), FXFILL_ALTERNATE); +} + +/* --------------------------------- CPWL_Note_Icon ---------------------------------- */ + +CPWL_Note_Icon::CPWL_Note_Icon() : m_nType(0) +{ +} + +CPWL_Note_Icon::~CPWL_Note_Icon() +{ +} + +void CPWL_Note_Icon::SetIconType(FX_INT32 nType) +{ + m_nType = nType; +} + +void CPWL_Note_Icon::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + CPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, m_nType, GetClientRect(), + this->GetBackgroundColor(), PWL_DEFAULT_BLACKCOLOR, this->GetTransparency()); +} + +/* --------------------------------- CPWL_Note_CloseBox ---------------------------------- */ + +CPWL_Note_CloseBox::CPWL_Note_CloseBox() : m_bMouseDown(FALSE) +{ +} + +CPWL_Note_CloseBox::~CPWL_Note_CloseBox() +{ +} + +void CPWL_Note_CloseBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + CPWL_Button::DrawThisAppearance(pDevice, pUser2Device); + + CPDF_Rect rcClient = this->GetClientRect(); + rcClient = CPWL_Utils::DeflateRect(rcClient, 2.0f); + + CFX_GraphStateData gsd; + gsd.m_LineWidth = 1.0f; + + CFX_PathData pathCross; + + if (m_bMouseDown) + { + rcClient.left += 0.5f; + rcClient.right += 0.5f; + rcClient.top -= 0.5f; + rcClient.bottom -= 0.5f; + } + + pathCross.SetPointCount(4); + pathCross.SetPoint(0, rcClient.left, rcClient.bottom, FXPT_MOVETO); + pathCross.SetPoint(1, rcClient.right, rcClient.top, FXPT_LINETO); + pathCross.SetPoint(2, rcClient.left, rcClient.top, FXPT_MOVETO); + pathCross.SetPoint(3, rcClient.right, rcClient.bottom, FXPT_LINETO); + + pDevice->DrawPath(&pathCross, pUser2Device, &gsd, + 0, CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()), FXFILL_ALTERNATE); +} + +FX_BOOL CPWL_Note_CloseBox::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag) +{ + SetBorderStyle(PBS_INSET); + InvalidateRect(NULL); + + m_bMouseDown = TRUE; + + return CPWL_Button::OnLButtonDown(point,nFlag); +} + +FX_BOOL CPWL_Note_CloseBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag) +{ + m_bMouseDown = FALSE; + + SetBorderStyle(PBS_BEVELED); + InvalidateRect(NULL); + + return CPWL_Button::OnLButtonUp(point,nFlag); +} + +/* ------------------------------ CPWL_Note_Contents ------------------------------- */ + +CPWL_Note_Contents::CPWL_Note_Contents() : m_pEdit(NULL) +{ +} + +CPWL_Note_Contents::~CPWL_Note_Contents() +{ +} + +CFX_ByteString CPWL_Note_Contents::GetClassName() const +{ + return "CPWL_Note_Contents"; +} + +void CPWL_Note_Contents::CreateChildWnd(const PWL_CREATEPARAM & cp) +{ + m_pEdit = new CPWL_Note_Edit; + PWL_CREATEPARAM ecp = cp; + ecp.pParentWnd = this; + ecp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_MULTILINE | PES_AUTORETURN | PES_TEXTOVERFLOW | PES_UNDO | PES_SPELLCHECK; + + m_pEdit->EnableNotify(FALSE); + m_pEdit->Create(ecp); + m_pEdit->EnableNotify(TRUE); +} + +void CPWL_Note_Contents::SetText(const CFX_WideString& sText) +{ + if (m_pEdit) + { + m_pEdit->EnableNotify(FALSE); + m_pEdit->SetText(sText); + m_pEdit->EnableNotify(TRUE); + OnNotify(m_pEdit, PNM_NOTEEDITCHANGED, 0, 0); + } +} + +CFX_WideString CPWL_Note_Contents::GetText() const +{ + if (m_pEdit) + return m_pEdit->GetText(); + + return L""; +} + +CPWL_NoteItem* CPWL_Note_Contents::CreateSubItem() +{ + CPWL_NoteItem* pNoteItem = new CPWL_NoteItem; + PWL_CREATEPARAM icp = this->GetCreationParam(); + icp.pParentWnd = this; + icp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_BACKGROUND; + pNoteItem->Create(icp); + + pNoteItem->OnCreateNoteItem(); + + pNoteItem->ResetSubjectName(m_aChildren.GetSize() - 1); + + FX_SYSTEMTIME st; + if (IFX_SystemHandler* pSH = this->GetSystemHandler()) + st = pSH->GetLocalTime(); + pNoteItem->SetDateTime(st); + + pNoteItem->SetContents(L""); + + this->OnNotify(pNoteItem, PNM_NOTEEDITCHANGED, 0, 0); + + return pNoteItem; +} + +FX_INT32 CPWL_Note_Contents::CountSubItems() const +{ + return m_aChildren.GetSize() - 1; +} + +IPWL_NoteItem* CPWL_Note_Contents::GetSubItems(FX_INT32 index) const +{ + FX_INT32 nIndex = index + 1; + + if (nIndex > 0 && nIndex < m_aChildren.GetSize()) + if (CPWL_Wnd* pChild = m_aChildren.GetAt(nIndex)) + { + ASSERT(pChild->GetClassName() == "CPWL_NoteItem"); + CPWL_NoteItem* pItem = (CPWL_NoteItem*)pChild; + return pItem; + } + return NULL; +} + +void CPWL_Note_Contents::DeleteSubItem(IPWL_NoteItem* pNoteItem) +{ + FX_INT32 nIndex = this->GetItemIndex((CPWL_NoteItem*)pNoteItem); + + if (nIndex > 0) + { + if (CPWL_NoteItem* pPWLNoteItem = (CPWL_NoteItem*)pNoteItem) + { + pPWLNoteItem->KillFocus(); + pPWLNoteItem->Destroy(); + delete pPWLNoteItem; + } + + for (FX_INT32 i=nIndex,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) + { + ASSERT(pChild->GetClassName() == "CPWL_NoteItem"); + CPWL_NoteItem* pItem = (CPWL_NoteItem*)pChild; + pItem->ResetSubjectName(i); + } + } + + this->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0); + } +} + +IPWL_NoteItem* CPWL_Note_Contents::GetHitNoteItem(const CPDF_Point& point) +{ + CPDF_Point pt = this->ParentToChild(point); + + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) + { + if (pChild->GetClassName() == "CPWL_NoteItem") + { + CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild; + if (IPWL_NoteItem* pRet = pNoteItem->GetHitNoteItem(pt)) + return pRet; + } + } + } + return NULL; +} + +void CPWL_Note_Contents::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam) +{ + switch (msg) + { + case PNM_NOTEEDITCHANGED: + { + FX_INT32 nIndex = this->GetItemIndex(pWnd); + if (nIndex < 0) nIndex = 0; + + m_pEdit->EnableNotify(FALSE); + this->ResetContent(nIndex); + m_pEdit->EnableNotify(TRUE); + + for (FX_INT32 i=nIndex+1, sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) + pChild->OnNotify(this, PNM_NOTERESET, 0, 0); + } + + if (CPWL_Wnd * pParent = this->GetParentWindow()) + { + pParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0); + } + } + return; + case PNM_SCROLLWINDOW: + this->SetScrollPos(CPDF_Point(0.0f, *(FX_FLOAT*)lParam)); + this->ResetFace(); + InvalidateRect(NULL); + return; + case PNM_SETCARETINFO: + if (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam) + { + PWL_CARET_INFO newInfo = *pInfo; + newInfo.bVisible = TRUE; + newInfo.ptHead = this->ChildToParent(pInfo->ptHead); + newInfo.ptFoot = this->ChildToParent(pInfo->ptFoot); + + if (CPWL_Wnd * pParent = this->GetParentWindow()) + { + pParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&newInfo, 0); + } + } + return; + case PNM_NOTERESET: + { + m_pEdit->EnableNotify(FALSE); + this->ResetContent(0); + m_pEdit->EnableNotify(TRUE); + + for (FX_INT32 i=1, sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) + pChild->OnNotify(this, PNM_NOTERESET, 0, 0); + } + + m_pEdit->EnableNotify(FALSE); + this->ResetContent(0); + m_pEdit->EnableNotify(TRUE); + } + return; + } + + CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); +} + +FX_BOOL CPWL_Note_Contents::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag) +{ + if (CPWL_Wnd::OnLButtonDown(point,nFlag)) return TRUE; + + if (!m_pEdit->IsFocused()) + { + m_pEdit->SetFocus(); + } + + return TRUE; +} + +void CPWL_Note_Contents::SetEditFocus(FX_BOOL bLast) +{ + if (!m_pEdit->IsFocused()) + { + m_pEdit->SetFocus(); + m_pEdit->SetCaret(bLast ? m_pEdit->GetTotalWords() : 0); + } +} + +CPWL_Edit* CPWL_Note_Contents::GetEdit() const +{ + return m_pEdit; +} + +void CPWL_Note_Contents::EnableModify(FX_BOOL bEnabled) +{ + if (!bEnabled) + m_pEdit->AddFlag(PWS_READONLY); + else + m_pEdit->RemoveFlag(PWS_READONLY); + + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) + { + if (pChild->GetClassName() == "CPWL_NoteItem") + { + CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild; + pNoteItem->EnableModify(bEnabled); + } + } + } +} + +void CPWL_Note_Contents::EnableRead(FX_BOOL bEnabled) +{ + if (!bEnabled) + m_pEdit->AddFlag(PES_NOREAD); + else + m_pEdit->RemoveFlag(PES_NOREAD); + + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) + { + if (pChild->GetClassName() == "CPWL_NoteItem") + { + CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild; + pNoteItem->EnableRead(bEnabled); + } + } + } +} + +/* ---------------------------------- CPWL_NoteItem ---------------------------------- */ + +CPWL_NoteItem::CPWL_NoteItem() : + m_pPrivateData(NULL), + m_pSubject(NULL), + m_pDateTime(NULL), + m_pContents(NULL), + m_sAuthor(L""), + m_fOldItemHeight(0.0f), + m_bSizeChanged(FALSE), + m_bAllowModify(TRUE) +{ +} + +CPWL_NoteItem::~CPWL_NoteItem() +{ +} + +CFX_ByteString CPWL_NoteItem::GetClassName() const +{ + return "CPWL_NoteItem"; +} + +void CPWL_NoteItem::CreateChildWnd(const PWL_CREATEPARAM & cp) +{ + CPWL_Color sTextColor; + + if (CPWL_Utils::IsBlackOrWhite(this->GetBackgroundColor())) + sTextColor = PWL_DEFAULT_WHITECOLOR; + else + sTextColor = PWL_DEFAULT_BLACKCOLOR; + + m_pSubject = new CPWL_Label; + PWL_CREATEPARAM scp = cp; + scp.pParentWnd = this; + scp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_LEFT | PES_TOP; + scp.sTextColor = sTextColor; + m_pSubject->Create(scp); + + m_pDateTime = new CPWL_Label; + PWL_CREATEPARAM dcp = cp; + dcp.pParentWnd = this; + dcp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_RIGHT | PES_TOP; + dcp.sTextColor = sTextColor; + m_pDateTime->Create(dcp); + + m_pContents = new CPWL_Note_Contents; + PWL_CREATEPARAM ccp = cp; + ccp.pParentWnd = this; + //ccp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR; + ccp.sBackgroundColor = CPWL_Color(COLORTYPE_RGB, 240/255.0f, 240/255.0f, 240/255.0f); + ccp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BACKGROUND; + m_pContents->Create(ccp); + m_pContents->SetItemSpace(POPUP_ITEM_SPACE); + m_pContents->SetTopSpace(POPUP_ITEM_SPACE); + m_pContents->SetBottomSpace(POPUP_ITEM_SPACE); +} + +void CPWL_NoteItem::RePosChildWnd() +{ + if (this->IsValid()) + { + ASSERT(m_pSubject != NULL); + ASSERT(m_pDateTime != NULL); + ASSERT(m_pContents != NULL); + + CPDF_Rect rcClient = GetClientRect(); + + CPDF_Rect rcSubject = rcClient; + rcSubject.left += POPUP_ITEM_TEXT_INDENT; + rcSubject.top = rcClient.top; + rcSubject.right = PWL_MIN(rcSubject.left + m_pSubject->GetContentRect().Width() + 1.0f, rcClient.right); + rcSubject.bottom = rcSubject.top - m_pSubject->GetContentRect().Height(); + rcSubject.Normalize(); + m_pSubject->Move(rcSubject, TRUE, FALSE); + m_pSubject->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcSubject)); + + CPDF_Rect rcDate = rcClient; + rcDate.right -= POPUP_ITEM_TEXT_INDENT; + rcDate.left = PWL_MAX(rcDate.right - m_pDateTime->GetContentRect().Width() - 1.0f, rcSubject.right); + rcDate.bottom = rcDate.top - m_pDateTime->GetContentRect().Height(); + rcDate.Normalize(); + m_pDateTime->Move(rcDate, TRUE, FALSE); + m_pDateTime->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcDate)); + + CPDF_Rect rcContents = rcClient; + rcContents.left += 1.0f; + rcContents.right -= 1.0f; + rcContents.top = rcDate.bottom - POPUP_ITEM_HEAD_BOTTOM; + rcContents.bottom += POPUP_ITEM_BOTTOMWIDTH; + rcContents.Normalize(); + m_pContents->Move(rcContents, TRUE, FALSE); + m_pContents->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcContents)); + } + + SetClipRect(CPWL_Utils::InflateRect(GetWindowRect(),1.0f)); +} + +void CPWL_NoteItem::SetPrivateData(void* pData) +{ + m_pPrivateData = pData; +} + +void CPWL_NoteItem::SetBkColor(const CPWL_Color& color) +{ + CPWL_Color sBK = color; + this->SetBackgroundColor(sBK); + + CPWL_Color sTextColor; + + if (CPWL_Utils::IsBlackOrWhite(sBK)) + sTextColor = PWL_DEFAULT_WHITECOLOR; + else + sTextColor = PWL_DEFAULT_BLACKCOLOR; + + this->SetTextColor(sTextColor); + if (m_pSubject) + m_pSubject->SetTextColor(sTextColor); + if (m_pDateTime) + m_pDateTime->SetTextColor(sTextColor); + + this->InvalidateRect(NULL); + + if (IPWL_NoteNotify* pNotify = GetNoteNotify()) + { + pNotify->OnSetBkColor(this); + } +} + +void CPWL_NoteItem::SetSubjectName(const CFX_WideString& sName) +{ + if (m_pSubject) + { + m_pSubject->SetText(sName); + } + + if (IPWL_NoteNotify* pNotify = GetNoteNotify()) + { + pNotify->OnSetSubjectName(this); + } +} + +void CPWL_NoteItem::SetAuthorName(const CFX_WideString& sName) +{ + m_sAuthor = sName; + ResetSubjectName(-1); + + if (IPWL_NoteNotify* pNotify = GetNoteNotify()) + { + pNotify->OnSetAuthorName(this); + } +} + +void CPWL_NoteItem::ResetSubjectName(FX_INT32 nItemIndex) +{ + if (nItemIndex < 0) + { + if (CPWL_Wnd* pParent = this->GetParentWindow()) + { + ASSERT(pParent->GetClassName() == "CPWL_Note_Contents"); + + CPWL_Note_Contents* pContents = (CPWL_Note_Contents*)pParent; + nItemIndex = pContents->GetItemIndex(this); + } + } + + const CPWL_Note* pNote = GetNote(); + ASSERT(pNote != NULL); + + CFX_WideString sSubject; + sSubject.Format(pNote->GetReplyString(), nItemIndex); + + if (!m_sAuthor.IsEmpty()) + { + + sSubject += L" - "; + sSubject += m_sAuthor; + } + this->SetSubjectName(sSubject); + this->RePosChildWnd(); +} + +void CPWL_NoteItem::SetDateTime(FX_SYSTEMTIME time) +{ + m_dtNote = time; + + CFX_WideString swTime; + swTime.Format((FX_LPCWSTR)L"%04d-%02d-%02d %02d:%02d:%02d", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond); + if (m_pDateTime) + { + m_pDateTime->SetText(swTime); + } + + this->RePosChildWnd(); + + if (IPWL_NoteNotify* pNotify = GetNoteNotify()) + { + pNotify->OnSetDateTime(this); + } +} + +void CPWL_NoteItem::SetContents(const CFX_WideString& sContents) +{ + if (m_pContents) + { + m_pContents->SetText(sContents); + } + + if (IPWL_NoteNotify* pNotify = GetNoteNotify()) + { + pNotify->OnSetContents(this); + } +} + +CPWL_NoteItem* CPWL_NoteItem::GetParentNoteItem() const +{ + if (CPWL_Wnd* pParent = this->GetParentWindow()) + { + if (CPWL_Wnd* pGrand = pParent->GetParentWindow()) + { + ASSERT(pGrand->GetClassName() == "CPWL_NoteItem"); + return (CPWL_NoteItem*)pGrand; + } + } + + return NULL; +} + +IPWL_NoteItem* CPWL_NoteItem::GetParentItem() const +{ + return GetParentNoteItem(); +} + +CPWL_Edit* CPWL_NoteItem::GetEdit() const +{ + if (m_pContents) + return m_pContents->GetEdit(); + return NULL; +} + +void* CPWL_NoteItem::GetPrivateData() const +{ + return m_pPrivateData; +} + +CFX_WideString CPWL_NoteItem::GetAuthorName() const +{ + return m_sAuthor; +} + +CPWL_Color CPWL_NoteItem::GetBkColor() const +{ + return this->GetBackgroundColor(); +} + +CFX_WideString CPWL_NoteItem::GetContents() const +{ + if (m_pContents) + return m_pContents->GetText(); + + return L""; +} + +FX_SYSTEMTIME CPWL_NoteItem::GetDateTime() const +{ + return m_dtNote; +} + +CFX_WideString CPWL_NoteItem::GetSubjectName() const +{ + if (m_pSubject) + return m_pSubject->GetText(); + + return L""; +} + +CPWL_NoteItem* CPWL_NoteItem::CreateNoteItem() +{ + if (m_pContents) + return m_pContents->CreateSubItem(); + + return NULL; +} + +IPWL_NoteItem* CPWL_NoteItem::CreateSubItem() +{ + return CreateNoteItem(); +} + +FX_INT32 CPWL_NoteItem::CountSubItems() const +{ + if (m_pContents) + return m_pContents->CountSubItems(); + + return 0; +} + +IPWL_NoteItem* CPWL_NoteItem::GetSubItems(FX_INT32 index) const +{ + if (m_pContents) + return m_pContents->GetSubItems(index); + + return NULL; +} + +void CPWL_NoteItem::DeleteSubItem(IPWL_NoteItem* pNoteItem) +{ + this->KillFocus(); + + if (IPWL_NoteNotify* pNotify = GetNoteNotify()) + { + pNotify->OnItemDelete(pNoteItem); + } + + if (m_pContents) + m_pContents->DeleteSubItem(pNoteItem); +} + +IPWL_NoteItem* CPWL_NoteItem::GetHitNoteItem(const CPDF_Point& point) +{ + CPDF_Point pt = this->ParentToChild(point); + + if (this->WndHitTest(pt)) + { + if (m_pContents) + { + if (IPWL_NoteItem* pNoteItem = m_pContents->GetHitNoteItem(pt)) + return pNoteItem; + } + + return this; + } + + return NULL; +} + +IPWL_NoteItem* CPWL_NoteItem::GetFocusedNoteItem() const +{ + if (const CPWL_Wnd* pWnd = this->GetFocused()) + { + if (pWnd->GetClassName() == "CPWL_Edit") + { + if (CPWL_Wnd* pParent = pWnd->GetParentWindow()) + { + ASSERT(pParent->GetClassName() == "CPWL_Note_Contents"); + + if (CPWL_Wnd* pGrand = pParent->GetParentWindow()) + { + ASSERT(pGrand->GetClassName() == "CPWL_NoteItem"); + return (CPWL_NoteItem*)pGrand; + } + } + } + } + + return NULL; +} + +FX_FLOAT CPWL_NoteItem::GetItemHeight(FX_FLOAT fLimitWidth) +{ + if (fLimitWidth > 0) + { + if (!m_bSizeChanged) + return m_fOldItemHeight; + + m_bSizeChanged = FALSE; + + ASSERT(m_pSubject != NULL); + ASSERT(m_pDateTime != NULL); + ASSERT(m_pContents != NULL); + + FX_FLOAT fRet = m_pDateTime->GetContentRect().Height(); + FX_FLOAT fBorderWidth = (FX_FLOAT)this->GetBorderWidth(); + if (fLimitWidth > fBorderWidth * 2) + fRet += m_pContents->GetContentsHeight(fLimitWidth - fBorderWidth * 2); + fRet += POPUP_ITEM_HEAD_BOTTOM + POPUP_ITEM_BOTTOMWIDTH + fBorderWidth * 2; + + return m_fOldItemHeight = fRet; + } + + return 0; +} + +FX_FLOAT CPWL_NoteItem::GetItemLeftMargin() +{ + return POPUP_ITEM_SIDEMARGIN; +} + +FX_FLOAT CPWL_NoteItem::GetItemRightMargin() +{ + return POPUP_ITEM_SIDEMARGIN; +} + +FX_BOOL CPWL_NoteItem::OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag) +{ + if (!m_pContents->WndHitTest(m_pContents->ParentToChild(point))) + { + SetNoteFocus(FALSE); + } + + CPWL_Wnd::OnLButtonDown(point,nFlag); + + return TRUE; +} + +FX_BOOL CPWL_NoteItem::OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag) +{ + if (!m_pContents->WndHitTest(m_pContents->ParentToChild(point))) + { + SetNoteFocus(FALSE); + PopupNoteItemMenu(point); + + return TRUE; + } + + return CPWL_Wnd::OnRButtonUp(point,nFlag); +} + +void CPWL_NoteItem::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam) +{ + switch (msg) + { + case PNM_NOTEEDITCHANGED: + m_bSizeChanged = TRUE; + + if (CPWL_Wnd* pParent = this->GetParentWindow()) + { + pParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0); + } + return; + case PNM_SETCARETINFO: + if (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam) + { + PWL_CARET_INFO newInfo = *pInfo; + newInfo.bVisible = TRUE; + newInfo.ptHead = this->ChildToParent(pInfo->ptHead); + newInfo.ptFoot = this->ChildToParent(pInfo->ptFoot); + + if (CPWL_Wnd * pParent = this->GetParentWindow()) + { + pParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&newInfo, 0); + } + } + return; + case PNM_NOTERESET: + m_bSizeChanged = TRUE; + m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); + + return; + } + + CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); +} + +void CPWL_NoteItem::PopupNoteItemMenu(const CPDF_Point& point) +{ + if (IPWL_NoteNotify* pNotify = GetNoteNotify()) + { + FX_INT32 x,y; + PWLtoWnd(point, x, y); + if (IFX_SystemHandler* pSH = GetSystemHandler()) + pSH->ClientToScreen(GetAttachedHWnd(), x, y); + pNotify->OnPopupMenu(this, x, y); + } +} + +const CPWL_Note* CPWL_NoteItem::GetNote() const +{ + if (const CPWL_Wnd* pRoot = this->GetRootWnd()) + { + ASSERT(pRoot->GetClassName() == "CPWL_NoteItem"); + CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pRoot; + if (pNoteItem->IsTopItem()) + { + return (CPWL_Note*)pNoteItem; + } + } + + return NULL; +} + +IPWL_NoteNotify* CPWL_NoteItem::GetNoteNotify() const +{ + if (const CPWL_Note* pNote = GetNote()) + return pNote->GetNoteNotify(); + + return NULL; +} + +void CPWL_NoteItem::OnCreateNoteItem() +{ + if (IPWL_NoteNotify* pNotify = GetNoteNotify()) + { + pNotify->OnItemCreate(this); + } +} + +void CPWL_NoteItem::OnContentsValidate() +{ + if (IPWL_NoteNotify* pNotify = GetNoteNotify()) + { + pNotify->OnSetContents(this); + } +} + +void CPWL_NoteItem::SetNoteFocus(FX_BOOL bLast) +{ + m_pContents->SetEditFocus(bLast); +} + +void CPWL_NoteItem::EnableModify(FX_BOOL bEnabled) +{ + m_pContents->EnableModify(bEnabled); + m_bAllowModify = bEnabled; +} + +void CPWL_NoteItem::EnableRead(FX_BOOL bEnabled) +{ + m_pContents->EnableRead(bEnabled); +} + +/* ---------------------------------- CPWL_Note ---------------------------------- */ + +CPWL_Note::CPWL_Note(IPopup_Note* pPopupNote, IPWL_NoteNotify* pNoteNotify, IPWL_NoteHandler* pNoteHandler) : + m_pAuthor(NULL), + m_pIcon(NULL), + m_pCloseBox(NULL), + m_pContentsBar(NULL), + m_pLBBox(NULL), + m_pRBBox(NULL), + m_pOptions(NULL), + m_bResizing(FALSE), + m_rcCaption(0,0,0,0), + m_pNoteNotify(pNoteNotify), + m_bEnalbleNotify(TRUE), + m_pPopupNote(pPopupNote), + m_pNoteHandler(pNoteHandler) +{ +} + +CPWL_Note::~CPWL_Note() +{ +} + +IPWL_NoteItem* CPWL_Note::Reply() +{ + return CreateNoteItem(); +} + +void CPWL_Note::EnableNotify(FX_BOOL bEnabled) +{ + m_bEnalbleNotify = bEnabled; +} + +void CPWL_Note::RePosChildWnd() +{ + RePosNoteChildren(); + m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); + ResetScrollBar(); + m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); + this->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0); + //ͬ²½ + if (const CPWL_Wnd* pWnd = this->GetFocused()) + { + if (pWnd->GetClassName() == "CPWL_Edit") + { + CPWL_Edit* pEdit = (CPWL_Edit*)pWnd; + pEdit->SetCaret(pEdit->GetCaret()); + } + } + //CPDF_Point ptNew = m_pContents->GetScrollPos(); + //m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y); +} + +FX_BOOL CPWL_Note::ResetScrollBar() +{ + FX_BOOL bScrollChanged = FALSE; + + if (ScrollBarShouldVisible()) + { + if (!m_pContentsBar->IsVisible()) + { + m_pContentsBar->SetVisible(TRUE); + if (m_pContentsBar->IsVisible()) + { + m_pContentsBar->InvalidateRect(NULL); + bScrollChanged = TRUE; + } + } + } + else + { + if (m_pContentsBar->IsVisible()) + { + m_pContentsBar->SetVisible(FALSE); + m_pContentsBar->InvalidateRect(NULL); + + bScrollChanged = TRUE; + } + } + + if (bScrollChanged) + { + CPDF_Rect rcNote = this->GetClientRect(); + CPDF_Rect rcContents = m_pContents->GetWindowRect(); + rcContents.right = rcNote.right - 3.0f; + if (m_pContentsBar->IsVisible()) + rcContents.right -= PWL_SCROLLBAR_WIDTH; + m_pContents->Move(rcContents, TRUE, TRUE); + m_pContents->SetScrollPos(CPDF_Point(0.0f,0.0f)); + m_pContents->InvalidateRect(NULL); + } + + return bScrollChanged; +} + +FX_BOOL CPWL_Note::ScrollBarShouldVisible() +{ + CPDF_Rect rcContentsFact = m_pContents->GetScrollArea(); + CPDF_Rect rcContentsClient = m_pContents->GetClientRect(); + + return rcContentsFact.Height() > rcContentsClient.Height(); +} + +void CPWL_Note::SetOptionsText(const CFX_WideString& sText) +{ + if (m_pOptions) + m_pOptions->SetText(sText); + + RePosNoteChildren(); +} + +void CPWL_Note::RePosNoteChildren() +{ + if (m_bResizing) return; + + m_bResizing = TRUE; + + if (this->IsValid()) + { + ASSERT(m_pSubject != NULL); + ASSERT(m_pDateTime != NULL); + ASSERT(m_pContents != NULL); + ASSERT(m_pAuthor != NULL); + ASSERT(m_pCloseBox != NULL); + ASSERT(m_pIcon != NULL); + ASSERT(m_pLBBox != NULL); + ASSERT(m_pRBBox != NULL); + ASSERT(m_pContentsBar != NULL); + ASSERT(m_pOptions != NULL); + + CPDF_Rect rcClient = GetClientRect(); + + CPDF_Rect rcIcon = rcClient; + rcIcon.top -= 2.0f; + rcIcon.right = rcIcon.left + 14.0f; + rcIcon.bottom = rcIcon.top - 14.0f; + rcIcon.Normalize(); + m_pIcon->Move(rcIcon, TRUE, FALSE); + m_pIcon->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcIcon)); + + CPDF_Rect rcCloseBox = rcClient; + rcCloseBox.right -= 1.0f; + rcCloseBox.top -= 1.0f; + rcCloseBox.left = rcCloseBox.right - 14.0f; + rcCloseBox.bottom = rcCloseBox.top - 14.0f; + rcCloseBox.Normalize(); + m_pCloseBox->Move(rcCloseBox, TRUE, FALSE); + m_pCloseBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcCloseBox)); + + CPDF_Rect rcDate = rcClient; + rcDate.right = rcCloseBox.left - POPUP_ITEM_TEXT_INDENT; + rcDate.left = PWL_MAX(rcDate.right - m_pDateTime->GetContentRect().Width() - 1.0f, rcIcon.right + 1.0f); + rcDate.top = rcClient.top - 2.0f; + rcDate.bottom = rcDate.top - m_pDateTime->GetContentRect().Height(); + rcDate.Normalize(); + m_pDateTime->Move(rcDate, TRUE, FALSE); + m_pDateTime->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcDate)); + + CPDF_Rect rcSubject = rcClient; + rcSubject.top = rcClient.top - 2.0f; + rcSubject.left = rcIcon.right + POPUP_ITEM_TEXT_INDENT; + rcSubject.right = PWL_MIN(rcSubject.left + m_pSubject->GetContentRect().Width() + 1.0f, rcDate.left - 1.0f); + rcSubject.bottom = rcSubject.top - m_pSubject->GetContentRect().Height(); + rcSubject.Normalize(); + m_pSubject->Move(rcSubject, TRUE, FALSE); + m_pSubject->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcSubject)); + + CPDF_Rect rcOptions = rcClient; + rcOptions.left = PWL_MAX(rcOptions.right - m_pOptions->GetContentRect().Width(), rcIcon.right + 1.0f); + rcOptions.top = rcSubject.bottom - 4.0f; + rcOptions.bottom = rcOptions.top - m_pOptions->GetContentRect().Height(); + rcOptions.Normalize(); + m_pOptions->Move(rcOptions, TRUE, FALSE); + m_pOptions->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcOptions)); + + CPDF_Rect rcAuthor = rcClient; + rcAuthor.top = rcSubject.bottom - 4.0f; + rcAuthor.left = rcSubject.left; + rcAuthor.right = PWL_MIN(rcSubject.left + m_pAuthor->GetContentRect().Width() + 1.0f, rcOptions.left - 1.0f); + rcAuthor.bottom = rcAuthor.top - m_pAuthor->GetContentRect().Height(); + rcAuthor.Normalize(); + m_pAuthor->Move(rcAuthor, TRUE, FALSE); + m_pAuthor->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcAuthor)); + + CPDF_Rect rcLBBox = rcClient; + rcLBBox.top = rcLBBox.bottom + 7.0f; + rcLBBox.right = rcLBBox.left + 7.0f; + rcLBBox.Normalize(); + m_pLBBox->Move(rcLBBox, TRUE, FALSE); + m_pLBBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcLBBox)); + + CPDF_Rect rcRBBox = rcClient; + rcRBBox.top = rcRBBox.bottom + 7.0f; + rcRBBox.left = rcRBBox.right - 7.0f; + rcRBBox.Normalize(); + m_pRBBox->Move(rcRBBox, TRUE, FALSE); + m_pRBBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcRBBox)); + + CPDF_Rect rcContents = rcClient; + rcContents.top = rcAuthor.bottom - POPUP_ITEM_HEAD_BOTTOM; + rcContents.left += 3.0f; + rcContents.right -= 3.0f; + if (m_pContentsBar->IsVisible()) + rcContents.right -= PWL_SCROLLBAR_WIDTH; + rcContents.bottom += 14.0f; + rcContents.Normalize(); + m_pContents->Move(rcContents, FALSE, FALSE); + m_pContents->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcContents)); + + CPDF_Rect rcContentsBar = rcContents; + rcContentsBar.right = rcClient.right - 3.0f; + rcContentsBar.left = rcContentsBar.right - PWL_SCROLLBAR_WIDTH; + rcContentsBar.Normalize(); + m_pContentsBar->Move(rcContentsBar, TRUE, FALSE); + + m_rcCaption = rcClient; + m_rcCaption.bottom = rcContents.top; + } + + m_bResizing = FALSE; +} + +//0-normal / 1-caption / 2-leftbottom corner / 3-rightbottom corner / 4-close / 5-options +FX_INT32 CPWL_Note::NoteHitTest(const CPDF_Point& point) const +{ + ASSERT(m_pSubject != NULL); + ASSERT(m_pDateTime != NULL); + ASSERT(m_pContents != NULL); + ASSERT(m_pAuthor != NULL); + ASSERT(m_pIcon != NULL); + ASSERT(m_pContentsBar != NULL); + + ASSERT(m_pCloseBox != NULL); + ASSERT(m_pLBBox != NULL); + ASSERT(m_pRBBox != NULL); + ASSERT(m_pOptions != NULL); + + GetClientRect(); + + if (m_pSubject->WndHitTest(m_pSubject->ParentToChild(point))) return 1; + if (m_pDateTime->WndHitTest(m_pDateTime->ParentToChild(point))) return 1; + if (m_pAuthor->WndHitTest(m_pAuthor->ParentToChild(point))) return 1; + if (m_pIcon->WndHitTest(m_pIcon->ParentToChild(point))) return 1; + + if (m_pContents->WndHitTest(m_pContents->ParentToChild(point))) return 0; + if (m_pContentsBar->WndHitTest(m_pContentsBar->ParentToChild(point))) return 0; + + if (m_pCloseBox->WndHitTest(m_pCloseBox->ParentToChild(point))) return 4; + if (m_pLBBox->WndHitTest(m_pLBBox->ParentToChild(point))) return 2; + if (m_pRBBox->WndHitTest(m_pRBBox->ParentToChild(point))) return 3; + if (m_pOptions->WndHitTest(m_pOptions->ParentToChild(point))) return 5; + + return 1; +} + +void CPWL_Note::CreateChildWnd(const PWL_CREATEPARAM & cp) +{ + CPWL_NoteItem::CreateChildWnd(cp); + + CPWL_Color sTextColor; + + if (CPWL_Utils::IsBlackOrWhite(this->GetBackgroundColor())) + sTextColor = PWL_DEFAULT_WHITECOLOR; + else + sTextColor = PWL_DEFAULT_BLACKCOLOR; + + m_pAuthor = new CPWL_Label; + PWL_CREATEPARAM acp = cp; + acp.pParentWnd = this; + acp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_LEFT | PES_TOP; + acp.sTextColor = sTextColor; + m_pAuthor->Create(acp); + + m_pCloseBox = new CPWL_Note_CloseBox; + PWL_CREATEPARAM ccp = cp; + ccp.pParentWnd = this; + ccp.dwBorderWidth = 2; + ccp.nBorderStyle = PBS_BEVELED; + ccp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER; + ccp.sTextColor = sTextColor; + m_pCloseBox->Create(ccp); + + m_pIcon = new CPWL_Note_Icon; + PWL_CREATEPARAM icp = cp; + icp.pParentWnd = this; + icp.dwFlags = PWS_VISIBLE | PWS_CHILD; + m_pIcon->Create(icp); + + m_pOptions = new CPWL_Note_Options; + PWL_CREATEPARAM ocp = cp; + ocp.pParentWnd = this; + ocp.dwFlags = PWS_CHILD | PWS_VISIBLE; + ocp.sTextColor = sTextColor; + m_pOptions->Create(ocp); + + m_pLBBox = new CPWL_Note_LBBox; + PWL_CREATEPARAM lcp = cp; + lcp.pParentWnd = this; + lcp.dwFlags = PWS_VISIBLE | PWS_CHILD; + lcp.eCursorType = FXCT_NESW; + lcp.sTextColor = sTextColor; + m_pLBBox->Create(lcp); + + m_pRBBox = new CPWL_Note_RBBox; + PWL_CREATEPARAM rcp = cp; + rcp.pParentWnd = this; + rcp.dwFlags = PWS_VISIBLE | PWS_CHILD; + rcp.eCursorType = FXCT_NWSE; + rcp.sTextColor = sTextColor; + m_pRBBox->Create(rcp); + + m_pContentsBar = new CPWL_ScrollBar(SBT_VSCROLL); + PWL_CREATEPARAM scp = cp; + scp.pParentWnd = this; + scp.sBackgroundColor = CPWL_Color(COLORTYPE_RGB, 240/255.0f, 240/255.0f, 240/255.0f); + scp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_BACKGROUND; + m_pContentsBar->Create(scp); + m_pContentsBar->SetNotifyForever(TRUE); +} + +void CPWL_Note::SetSubjectName(const CFX_WideString& sName) +{ + CPWL_NoteItem::SetSubjectName(sName); + RePosChildWnd(); +} + +void CPWL_Note::SetAuthorName(const CFX_WideString& sName) +{ + if (m_pAuthor) + { + m_pAuthor->SetText(sName); + RePosChildWnd(); + } + + if (IPWL_NoteNotify* pNotify = GetNoteNotify()) + { + pNotify->OnSetAuthorName(this); + } +} + +CFX_WideString CPWL_Note::GetAuthorName() const +{ + if (m_pAuthor) + return m_pAuthor->GetText(); + + return L""; +} + +FX_BOOL CPWL_Note::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag) +{ + CPDF_Point ptScroll = m_pContents->GetScrollPos(); + CPDF_Rect rcScroll = m_pContents->GetScrollArea(); + CPDF_Rect rcContents = m_pContents->GetClientRect(); + + if (rcScroll.top - rcScroll.bottom > rcContents.Height()) + { + CPDF_Point ptNew = ptScroll; + + if (zDelta > 0) + ptNew.y += 30; + else + ptNew.y -= 30; + + if (ptNew.y > rcScroll.top) + ptNew.y = rcScroll.top; + if (ptNew.y < rcScroll.bottom + rcContents.Height()) + ptNew.y = rcScroll.bottom + rcContents.Height(); + if (ptNew.y < rcScroll.bottom) + ptNew.y = rcScroll.bottom; + + if (ptNew.y != ptScroll.y) + { + m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); + m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&ptNew.y); + m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y); + + return TRUE; + } + } + + return FALSE; +} + +void CPWL_Note::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam) +{ + switch (msg) + { + case PNM_NOTEEDITCHANGED: + { + CPDF_Rect rcScroll = m_pContents->GetScrollArea(); + + + PWL_SCROLL_INFO sInfo; + sInfo.fContentMin = rcScroll.bottom; + sInfo.fContentMax = rcScroll.top; + sInfo.fPlateWidth = m_pContents->GetClientRect().Height(); + sInfo.fSmallStep = 13.0f; + sInfo.fBigStep = sInfo.fPlateWidth; + + if (FXSYS_memcmp(&m_OldScrollInfo, &sInfo, sizeof(PWL_SCROLL_INFO)) != 0) + { + FX_BOOL bScrollChanged = FALSE; + + if (lParam < 3) //·ÀÖ¹ËÀÑ»· mantis:15759 + { + bScrollChanged = ResetScrollBar(); + if (bScrollChanged) + { + lParam++; + m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); + this->OnNotify(this, PNM_NOTEEDITCHANGED, 0, lParam); + } + } + + if (!bScrollChanged) + { + if (m_pContentsBar->IsVisible()) + { + m_pContentsBar->OnNotify(pWnd, PNM_SETSCROLLINFO, SBT_VSCROLL, (FX_INTPTR)&sInfo); + m_OldScrollInfo = sInfo; + + CPDF_Point ptScroll = m_pContents->GetScrollPos(); + CPDF_Point ptOld = ptScroll; + + if (ptScroll.y > sInfo.fContentMax) + ptScroll.y = sInfo.fContentMax; + if (ptScroll.y < sInfo.fContentMin + sInfo.fPlateWidth) + ptScroll.y = sInfo.fContentMin + sInfo.fPlateWidth; + if (ptScroll.y < sInfo.fContentMin) + ptScroll.y = sInfo.fContentMin; + + if (ptOld.y != ptScroll.y) + { + m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y); + m_pContentsBar->InvalidateRect(NULL); + m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y); + } + } + } + } + } + + m_pContents->InvalidateRect(NULL); + + return; + case PNM_SCROLLWINDOW: + if (m_pContents) + m_pContents->OnNotify(pWnd, msg, wParam, lParam); + return; + case PNM_SETSCROLLPOS: + if (m_pContentsBar) + m_pContentsBar->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam); + return; + } + + if (msg == PNM_SETCARETINFO && IsValid()) + { + if (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam) + { + if (m_pContents) + { + CPDF_Rect rcClient = m_pContents->GetClientRect(); + if (pInfo->ptHead.y > rcClient.top) + { + CPDF_Point pt = m_pContents->OutToIn(pInfo->ptHead); + m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&pt.y); + + CPDF_Point ptScroll = m_pContents->GetScrollPos(); + m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y); + + return; + } + + if (pInfo->ptFoot.y < rcClient.bottom) + { + CPDF_Point pt = m_pContents->OutToIn(pInfo->ptFoot); + pt.y += rcClient.Height(); + m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&pt.y); + + CPDF_Point ptScroll = m_pContents->GetScrollPos(); + m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y); + + return; + } + } + } + } + + CPWL_NoteItem::OnNotify(pWnd, msg, wParam, lParam); +} + +void CPWL_Note::SetBkColor(const CPWL_Color& color) +{ + CPWL_NoteItem::SetBkColor(color); + + CPWL_Color sBK = color; + CPWL_Color sTextColor; + if (CPWL_Utils::IsBlackOrWhite(sBK)) + sTextColor = PWL_DEFAULT_WHITECOLOR; + else + sTextColor = PWL_DEFAULT_BLACKCOLOR; + + if (m_pCloseBox) + m_pCloseBox->SetTextColor(sTextColor); + if (m_pAuthor) + m_pAuthor->SetTextColor(sTextColor); + if (m_pOptions) + m_pOptions->SetTextColor(sTextColor); + if (m_pLBBox) + m_pLBBox->SetTextColor(sTextColor); + if (m_pRBBox) + m_pRBBox->SetTextColor(sTextColor); +} + +FX_BOOL CPWL_Note::OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag) +{ + if (m_pOptions->WndHitTest(m_pOptions->ParentToChild(point))) + { + if (IPWL_NoteNotify* pNotify = this->GetNoteNotify()) + { + FX_INT32 x, y; + PWLtoWnd(point, x, y); + if (IFX_SystemHandler* pSH = GetSystemHandler()) + pSH->ClientToScreen(GetAttachedHWnd(), x, y); + this->KillFocus(); + pNotify->OnPopupMenu(x, y); + + return TRUE; + } + } + + return CPWL_Wnd::OnLButtonDown(point,nFlag); +} + +FX_BOOL CPWL_Note::OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag) +{ + return CPWL_Wnd::OnRButtonUp(point,nFlag); +} + +const CPWL_Note* CPWL_Note::GetNote() const +{ + return this; +} + +IPWL_NoteNotify* CPWL_Note::GetNoteNotify() const +{ + if (m_bEnalbleNotify) + return m_pNoteNotify; + + return NULL; +} + +void CPWL_Note::SetIconType(FX_INT32 nType) +{ + if (m_pIcon) + m_pIcon->SetIconType(nType); +} + +void CPWL_Note::EnableModify(FX_BOOL bEnabled) +{ + m_pContents->EnableModify(bEnabled); +} + +void CPWL_Note::EnableRead(FX_BOOL bEnabled) +{ + m_pContents->EnableRead(bEnabled); +} + +CFX_WideString CPWL_Note::GetReplyString() const +{ + return m_sReplyString; +} + +void CPWL_Note::SetReplyString(const CFX_WideString& string) +{ + m_sReplyString = string; +} + diff --git a/fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp b/fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp index d51de4db75..772e184902 100644 --- a/fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp @@ -1,1353 +1,1353 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_ScrollBar.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-
-#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
-#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb))
-
-
-/* ------------------------------- PWL_FLOATRANGE ------------------------------- */
-
-PWL_FLOATRANGE::PWL_FLOATRANGE()
-{
- Default();
-}
-
-PWL_FLOATRANGE::PWL_FLOATRANGE(FX_FLOAT min,FX_FLOAT max)
-{
- Set(min,max);
-}
-
-void PWL_FLOATRANGE::Default()
-{
- fMin = 0;
- fMax = 0;
-}
-
-void PWL_FLOATRANGE::Set(FX_FLOAT min,FX_FLOAT max)
-{
- if (min > max)
- {
- fMin = max;
- fMax = min;
- }
- else
- {
- fMin = min;
- fMax = max;
- }
-}
-
-FX_BOOL PWL_FLOATRANGE::In(FX_FLOAT x) const
-{
- return (IsFloatBigger(x,fMin) || IsFloatEqual(x, fMin)) &&
- (IsFloatSmaller(x, fMax) || IsFloatEqual(x, fMax));
-}
-
-FX_FLOAT PWL_FLOATRANGE::GetWidth() const
-{
- return fMax - fMin;
-}
-
-/* ------------------------------- PWL_SCROLL_PRIVATEDATA ------------------------------- */
-
-PWL_SCROLL_PRIVATEDATA::PWL_SCROLL_PRIVATEDATA()
-{
- Default();
-}
-
-void PWL_SCROLL_PRIVATEDATA::Default()
-{
- ScrollRange.Default();
- fScrollPos = ScrollRange.fMin;
- fClientWidth = 0;
- fBigStep = 10;
- fSmallStep = 1;
-}
-
-void PWL_SCROLL_PRIVATEDATA::SetScrollRange(FX_FLOAT min,FX_FLOAT max)
-{
- ScrollRange.Set(min,max);
-
- if (IsFloatSmaller(fScrollPos, ScrollRange.fMin))
- fScrollPos = ScrollRange.fMin;
- if (IsFloatBigger(fScrollPos, ScrollRange.fMax))
- fScrollPos = ScrollRange.fMax;
-}
-
-void PWL_SCROLL_PRIVATEDATA::SetClientWidth(FX_FLOAT width)
-{
- fClientWidth = width;
-}
-
-void PWL_SCROLL_PRIVATEDATA::SetSmallStep(FX_FLOAT step)
-{
- fSmallStep = step;
-}
-
-void PWL_SCROLL_PRIVATEDATA::SetBigStep(FX_FLOAT step)
-{
- fBigStep = step;
-}
-
-FX_BOOL PWL_SCROLL_PRIVATEDATA::SetPos(FX_FLOAT pos)
-{
- if (ScrollRange.In(pos))
- {
- fScrollPos = pos;
- return TRUE;
- }
- return FALSE;
-}
-
-void PWL_SCROLL_PRIVATEDATA::AddSmall()
-{
- if (!SetPos(fScrollPos + fSmallStep))
- SetPos(ScrollRange.fMax);
-}
-
-void PWL_SCROLL_PRIVATEDATA::SubSmall()
-{
- if (!SetPos(fScrollPos - fSmallStep))
- SetPos(ScrollRange.fMin);
-}
-
-void PWL_SCROLL_PRIVATEDATA::AddBig()
-{
- if (!SetPos(fScrollPos + fBigStep))
- SetPos(ScrollRange.fMax);
-}
-
-void PWL_SCROLL_PRIVATEDATA::SubBig()
-{
- if (!SetPos(fScrollPos - fBigStep))
- SetPos(ScrollRange.fMin);
-}
-
-/* ------------------------------- CPWL_SBButton ------------------------------- */
-
-CPWL_SBButton::CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType,PWL_SBBUTTON_TYPE eButtonType)
-{
- m_eScrollBarType = eScrollBarType;
- m_eSBButtonType = eButtonType;
-
- m_bMouseDown = FALSE;
-}
-
-CPWL_SBButton::~CPWL_SBButton()
-{
-
-}
-
-CFX_ByteString CPWL_SBButton::GetClassName() const
-{
- return "CPWL_SBButton";
-}
-
-void CPWL_SBButton::OnCreate(PWL_CREATEPARAM & cp)
-{
- cp.eCursorType = FXCT_ARROW;
-}
-
-void CPWL_SBButton::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
-{
- CPWL_Wnd::GetThisAppearanceStream(sAppStream);
-
- if (!IsVisible()) return;
-
- CFX_ByteTextBuf sButton;
-
- CPDF_Rect rectWnd = GetWindowRect();
-
- if (rectWnd.IsEmpty()) return;
-
- sAppStream << "q\n";
-
- CPDF_Point ptCenter = this->GetCenterPoint();
-
- switch (this->m_eScrollBarType)
- {
- case SBT_HSCROLL:
- switch (this->m_eSBButtonType)
- {
- case PSBT_MIN:
- {
- CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);
- CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);
- CPDF_Point pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN);
-
- if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
- rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )
- {
- sButton << "0 g\n";
- sButton << pt1.x << " " << pt1.y << " m\n";
- sButton << pt2.x << " " << pt2.y << " l\n";
- sButton << pt3.x << " " << pt3.y << " l\n";
- sButton << pt1.x << " " << pt1.y << " l f\n";
-
- sAppStream << sButton;
- }
- }
- break;
- case PSBT_MAX:
- {
- CPDF_Point pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);
- CPDF_Point pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);
- CPDF_Point pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN);
-
- if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
- rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )
- {
- sButton << "0 g\n";
- sButton << pt1.x << " " << pt1.y << " m\n";
- sButton << pt2.x << " " << pt2.y << " l\n";
- sButton << pt3.x << " " << pt3.y << " l\n";
- sButton << pt1.x << " " << pt1.y << " l f\n";
-
- sAppStream << sButton;
- }
- }
- break;
- default:
- break;
- }
- break;
- case SBT_VSCROLL:
- switch(this->m_eSBButtonType)
- {
- case PSBT_MIN:
- {
- CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
- CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
- CPDF_Point pt3(ptCenter.x,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
-
- if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
- rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )
- {
- sButton << "0 g\n";
- sButton << pt1.x << " " << pt1.y << " m\n";
- sButton << pt2.x << " " << pt2.y << " l\n";
- sButton << pt3.x << " " << pt3.y << " l\n";
- sButton << pt1.x << " " << pt1.y << " l f\n";
-
- sAppStream << sButton;
- }
- }
- break;
- case PSBT_MAX:
- {
- CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
- CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
- CPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
-
- if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
- rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )
- {
- sButton << "0 g\n";
- sButton << pt1.x << " " << pt1.y << " m\n";
- sButton << pt2.x << " " << pt2.y << " l\n";
- sButton << pt3.x << " " << pt3.y << " l\n";
- sButton << pt1.x << " " << pt1.y << " l f\n";
-
- sAppStream << sButton;
- }
- }
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
-
- sAppStream << "Q\n";
-}
-
-void CPWL_SBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- if (!IsVisible()) return;
-
- CPDF_Rect rectWnd = GetWindowRect();
- if (rectWnd.IsEmpty()) return;
-
- CPDF_Point ptCenter = this->GetCenterPoint();
- FX_INT32 nTransparancy = this->GetTransparency();
-
- switch (this->m_eScrollBarType)
- {
- case SBT_HSCROLL:
- CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
- switch (this->m_eSBButtonType)
- {
- case PSBT_MIN:
- {
- CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);
- CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);
- CPDF_Point pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN);
-
- if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
- rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )
- {
- CFX_PathData path;
-
- path.SetPointCount(4);
- path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);
- path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);
- path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);
- path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);
-
- pDevice->DrawPath(&path, pUser2Device, NULL,
- CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR,nTransparancy),
- 0, FXFILL_ALTERNATE);
- }
- }
- break;
- case PSBT_MAX:
- {
- CPDF_Point pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);
- CPDF_Point pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);
- CPDF_Point pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN);
-
- if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
- rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )
- {
- CFX_PathData path;
-
- path.SetPointCount(4);
- path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);
- path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);
- path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);
- path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);
-
- pDevice->DrawPath(&path, pUser2Device, NULL,
- CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR,nTransparancy),
- 0, FXFILL_ALTERNATE);
- }
- }
- break;
- default:
- break;
- }
- break;
- case SBT_VSCROLL:
- switch(this->m_eSBButtonType)
- {
- case PSBT_MIN:
- {
- //draw border
- CPDF_Rect rcDraw = rectWnd;
- CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
- ArgbEncode(nTransparancy,100,100,100),0.0f);
-
- //draw inner border
- rcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f);
- CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
- ArgbEncode(nTransparancy,255,255,255),1.0f);
-
- //draw background
-
- rcDraw = CPWL_Utils::DeflateRect(rectWnd,1.0f);
-
- if (this->IsEnabled())
- CPWL_Utils::DrawShadow(pDevice, pUser2Device, TRUE, FALSE, rcDraw, nTransparancy, 80, 220);
- else
- CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, ArgbEncode(255,255,255,255));
-
- //draw arrow
-
- if (rectWnd.top - rectWnd.bottom > 6.0f )
- {
- FX_FLOAT fX = rectWnd.left + 1.5f;
- FX_FLOAT fY = rectWnd.bottom;
- CPDF_Point pts[7] = {
- CPDF_Point(fX+2.5f, fY+4.0f),
- CPDF_Point(fX+2.5f, fY+3.0f),
- CPDF_Point(fX+4.5f, fY+5.0f),
- CPDF_Point(fX+6.5f, fY+3.0f),
- CPDF_Point(fX+6.5f, fY+4.0f),
- CPDF_Point(fX+4.5f, fY+6.0f),
- CPDF_Point(fX+2.5f, fY+4.0f)};
-
-
- if (this->IsEnabled())
- CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7, ArgbEncode(nTransparancy,255,255,255));
- else
- CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7,
- CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_HEAVYGRAYCOLOR,255));
- }
- }
- break;
- case PSBT_MAX:
- {
- //draw border
- CPDF_Rect rcDraw = rectWnd;
- CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
- ArgbEncode(nTransparancy,100,100,100),0.0f);
-
- //draw inner border
- rcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f);
- CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
- ArgbEncode(nTransparancy,255,255,255),1.0f);
-
- //draw background
- rcDraw = CPWL_Utils::DeflateRect(rectWnd,1.0f);
- if (this->IsEnabled())
- CPWL_Utils::DrawShadow(pDevice, pUser2Device, TRUE, FALSE, rcDraw, nTransparancy, 80, 220);
- else
- CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, ArgbEncode(255,255,255,255));
-
- //draw arrow
-
- if (rectWnd.top - rectWnd.bottom > 6.0f )
- {
- FX_FLOAT fX = rectWnd.left + 1.5f;
- FX_FLOAT fY = rectWnd.bottom;
-
- CPDF_Point pts[7] = {
- CPDF_Point(fX+2.5f, fY+5.0f),
- CPDF_Point(fX+2.5f, fY+6.0f),
- CPDF_Point(fX+4.5f, fY+4.0f),
- CPDF_Point(fX+6.5f, fY+6.0f),
- CPDF_Point(fX+6.5f, fY+5.0f),
- CPDF_Point(fX+4.5f, fY+3.0f),
- CPDF_Point(fX+2.5f, fY+5.0f)};
-
-
- if (this->IsEnabled())
- CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7, ArgbEncode(nTransparancy,255,255,255));
- else
- CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7,
- CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_HEAVYGRAYCOLOR,255));
- }
- }
- break;
- case PSBT_POS:
- {
- //CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
-
- //draw border
- CPDF_Rect rcDraw = rectWnd;
- CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
- ArgbEncode(nTransparancy,100,100,100),0.0f);
-
- //draw inner border
- rcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f);
- CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
- ArgbEncode(nTransparancy,255,255,255),1.0f);
-
- if (this->IsEnabled())
- {
- //draw shadow effect
-
- CPDF_Point ptTop = CPDF_Point(rectWnd.left,rectWnd.top-1.0f);
- CPDF_Point ptBottom = CPDF_Point(rectWnd.left,rectWnd.bottom+1.0f);
-
- ptTop.x += 1.5f;
- ptBottom.x += 1.5f;
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
- ArgbEncode(nTransparancy,210,210,210),1.0f);
-
- ptTop.x += 1.0f;
- ptBottom.x += 1.0f;
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
- ArgbEncode(nTransparancy,220,220,220),1.0f);
-
- ptTop.x += 1.0f;
- ptBottom.x += 1.0f;
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
- ArgbEncode(nTransparancy,240,240,240),1.0f);
-
- ptTop.x += 1.0f;
- ptBottom.x += 1.0f;
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
- ArgbEncode(nTransparancy,240,240,240),1.0f);
-
- ptTop.x += 1.0f;
- ptBottom.x += 1.0f;
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
- ArgbEncode(nTransparancy,210,210,210),1.0f);
-
- ptTop.x += 1.0f;
- ptBottom.x += 1.0f;
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
- ArgbEncode(nTransparancy,180,180,180),1.0f);
-
- ptTop.x += 1.0f;
- ptBottom.x += 1.0f;
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
- ArgbEncode(nTransparancy,150,150,150),1.0f);
-
- ptTop.x += 1.0f;
- ptBottom.x += 1.0f;
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
- ArgbEncode(nTransparancy,150,150,150),1.0f);
-
- ptTop.x += 1.0f;
- ptBottom.x += 1.0f;
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
- ArgbEncode(nTransparancy,180,180,180),1.0f);
-
- ptTop.x += 1.0f;
- ptBottom.x += 1.0f;
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
- ArgbEncode(nTransparancy,210,210,210),1.0f);
- }
- else
- {
- CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, ArgbEncode(255,255,255,255));
- }
-
- //draw friction
-
- if (rectWnd.Height() > 8.0f)
- {
- FX_COLORREF crStroke = ArgbEncode(nTransparancy,120,120,120);
- if (!this->IsEnabled())
- crStroke = CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_HEAVYGRAYCOLOR,255);
-
- FX_FLOAT nFrictionWidth = 5.0f;
- FX_FLOAT nFrictionHeight = 5.5f;
-
- CPDF_Point ptLeft = CPDF_Point(ptCenter.x - nFrictionWidth / 2.0f, ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
- CPDF_Point ptRight = CPDF_Point(ptCenter.x + nFrictionWidth / 2.0f, ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
- crStroke,1.0f);
-
- ptLeft.y += 2.0f;
- ptRight.y += 2.0f;
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
- crStroke,1.0f);
-
- ptLeft.y += 2.0f;
- ptRight.y += 2.0f;
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
- crStroke,1.0f);
-
- /*
- ptLeft.y += 1.5f;
- ptRight.y += 1.5f;
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
- ArgbEncode(nTransparancy,150,150,150),1.0f);
- */
- }
- }
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
-}
-
-FX_BOOL CPWL_SBButton::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonDown(point,nFlag);
-
- if (CPWL_Wnd * pParent = GetParentWindow())
- pParent->OnNotify(this,PNM_LBUTTONDOWN,0,(FX_INTPTR)&point);
-
- m_bMouseDown = TRUE;
- SetCapture();
-
- return TRUE;
-}
-
-FX_BOOL CPWL_SBButton::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonUp(point,nFlag);
-
- if (CPWL_Wnd * pParent = GetParentWindow())
- pParent->OnNotify(this,PNM_LBUTTONUP,0,(FX_INTPTR)&point);
-
- m_bMouseDown = FALSE;
- ReleaseCapture();
-
- return TRUE;
-}
-
-FX_BOOL CPWL_SBButton::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnMouseMove(point,nFlag);
-
- if (CPWL_Wnd * pParent = GetParentWindow())
- {
- pParent->OnNotify(this,PNM_MOUSEMOVE,0,(FX_INTPTR)&point);
-
- /*
- if (m_bMouseDown && (m_eSBButtonType == PSBT_MIN || m_eSBButtonType == PSBT_MAX))
- {
- if (!pParent->OnNotify(this,PNM_LBUTTONDOWN,nFlags,(FX_INTPTR)&point))
- return FALSE;
- }
- */
- }
-
- return TRUE;
-}
-
-/* ------------------------------- CPWL_ScrollBar ---------------------------------- */
-
-CPWL_ScrollBar::CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType):
- m_sbType(sbType),
- m_pMinButton(NULL),
- m_pMaxButton(NULL),
- m_pPosButton(NULL),
- m_bMouseDown(FALSE),
- m_bMinOrMax(FALSE),
- m_bNotifyForever(TRUE)
-{
-}
-
-CPWL_ScrollBar::~CPWL_ScrollBar()
-{
-}
-
-CFX_ByteString CPWL_ScrollBar::GetClassName() const
-{
- return "CPWL_ScrollBar";
-}
-
-void CPWL_ScrollBar::OnCreate(PWL_CREATEPARAM & cp)
-{
- cp.eCursorType = FXCT_ARROW;
-}
-
-void CPWL_ScrollBar::RePosChildWnd()
-{
- CPDF_Rect rcClient = this->GetClientRect();
-
-/*
- switch(m_sbType)
- {
- case SBT_HSCROLL:
- if (rcClient.right - rcClient.left < PWL_SCROLLBAR_WIDTH ||
- rcClient.top - rcClient.bottom < PWL_SCROLLBAR_WIDTH)
- {
- SetVisible(FALSE);
- }
- break;
- case SBT_VSCROLL:
- if (rcClient.right - rcClient.left < PWL_SCROLLBAR_WIDTH ||
- rcClient.top - rcClient.bottom < PWL_SCROLLBAR_WIDTH)
- {
- SetVisible(FALSE);
- }
- break;
- }
-*/
- CPDF_Rect rcMinButton,rcMaxButton;
-
- FX_FLOAT fBWidth = 0;
-
- switch (m_sbType)
- {
- case SBT_HSCROLL:
- if (rcClient.right - rcClient.left > PWL_SCROLLBAR_BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2)
- {
- rcMinButton = CPDF_Rect(rcClient.left,rcClient.bottom,
- rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.top);
- rcMaxButton = CPDF_Rect(rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.bottom,
- rcClient.right,rcClient.top);
- }
- else
- {
- fBWidth = (rcClient.right - rcClient.left - PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) / 2;
-
- if (fBWidth > 0)
- {
- rcMinButton = CPDF_Rect(rcClient.left,rcClient.bottom,
- rcClient.left + fBWidth,rcClient.top);
- rcMaxButton = CPDF_Rect(rcClient.right - fBWidth,rcClient.bottom,
- rcClient.right,rcClient.top);
- }
- else SetVisible(FALSE);
- }
- break;
- case SBT_VSCROLL:
- if (IsFloatBigger(rcClient.top - rcClient.bottom, PWL_SCROLLBAR_BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2))
- {
- rcMinButton = CPDF_Rect(rcClient.left,rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH,
- rcClient.right,rcClient.top);
- rcMaxButton = CPDF_Rect(rcClient.left,rcClient.bottom,
- rcClient.right,rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH);
- }
- else
- {
- fBWidth = (rcClient.top - rcClient.bottom - PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) / 2;
-
- if (IsFloatBigger(fBWidth, 0))
- {
- rcMinButton = CPDF_Rect(rcClient.left,rcClient.top - fBWidth,
- rcClient.right,rcClient.top);
- rcMaxButton = CPDF_Rect(rcClient.left,rcClient.bottom,
- rcClient.right,rcClient.bottom + fBWidth);
- }
- else SetVisible(FALSE);
- }
- break;
- }
-
-// if (IsVisible())
- {
- if (m_pMinButton)
- m_pMinButton->Move(rcMinButton,TRUE,FALSE);
-
- if (m_pMaxButton)
- m_pMaxButton->Move(rcMaxButton,TRUE,FALSE);
-
- MovePosButton(FALSE);
- }
-}
-
-void CPWL_ScrollBar::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
-{
- CPDF_Rect rectWnd = GetWindowRect();
-
- if (IsVisible() && !rectWnd.IsEmpty())
- {
- CFX_ByteTextBuf sButton;
-
- sButton << "q\n";
- sButton << "0 w\n" << CPWL_Utils::GetColorAppStream(GetBackgroundColor(),TRUE);
- sButton << rectWnd.left << " " << rectWnd.bottom << " "
- << rectWnd.right - rectWnd.left << " " << rectWnd.top - rectWnd.bottom << " re b Q\n";
-
- sAppStream << sButton;
- }
-}
-
-void CPWL_ScrollBar::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
-// CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
- CPDF_Rect rectWnd = GetWindowRect();
-
- if (IsVisible() && !rectWnd.IsEmpty())
- {
- CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rectWnd, this->GetBackgroundColor(), GetTransparency());
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device,
- CPDF_Point(rectWnd.left+2.0f,rectWnd.top-2.0f), CPDF_Point(rectWnd.left+2.0f,rectWnd.bottom+2.0f),
- ArgbEncode(this->GetTransparency(),100,100,100),1.0f);
-
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device,
- CPDF_Point(rectWnd.right-2.0f,rectWnd.top-2.0f), CPDF_Point(rectWnd.right-2.0f,rectWnd.bottom+2.0f),
- ArgbEncode(this->GetTransparency(),100,100,100),1.0f);
- }
-}
-
-FX_BOOL CPWL_ScrollBar::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonDown(point,nFlag);
-
- //SetFocus();
-
- if (HasFlag(PWS_AUTOTRANSPARENT))
- {
- if (GetTransparency() != 255)
- {
- SetTransparency(255);
- InvalidateRect();
- }
- }
-
- CPDF_Rect rcMinArea,rcMaxArea;
-
- if (m_pPosButton && m_pPosButton->IsVisible())
- {
- CPDF_Rect rcClient = this->GetClientRect();
- CPDF_Rect rcPosButton = m_pPosButton->GetWindowRect();
-
- switch (m_sbType)
- {
- case SBT_HSCROLL:
- rcMinArea = CPDF_Rect(rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.bottom,
- rcPosButton.left,rcClient.top);
- rcMaxArea = CPDF_Rect(rcPosButton.right,rcClient.bottom,
- rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.top);
-
- break;
- case SBT_VSCROLL:
- rcMinArea = CPDF_Rect(rcClient.left,rcPosButton.top,
- rcClient.right,rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH);
- rcMaxArea = CPDF_Rect(rcClient.left,rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH,
- rcClient.right,rcPosButton.bottom);
- break;
- }
-
- rcMinArea.Normalize();
- rcMaxArea.Normalize();
-
- if (rcMinArea.Contains(point.x,point.y))
- {
- m_sData.SubBig();
- MovePosButton(TRUE);
- NotifyScrollWindow();
- }
-
- if (rcMaxArea.Contains(point.x,point.y))
- {
- m_sData.AddBig();
- MovePosButton(TRUE);
- NotifyScrollWindow();
- }
- }
-
- return TRUE;
-}
-
-FX_BOOL CPWL_ScrollBar::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
-{
- CPWL_Wnd::OnLButtonUp(point,nFlag);
-
- if (HasFlag(PWS_AUTOTRANSPARENT))
- {
- if (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY)
- {
- SetTransparency(PWL_SCROLLBAR_TRANSPARANCY);
- InvalidateRect();
- }
- }
-
- EndTimer();
- m_bMouseDown = FALSE;
-
- return TRUE;
-}
-
-void CPWL_ScrollBar::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
-{
- CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
-
- switch (msg)
- {
- case PNM_LBUTTONDOWN:
- if (pWnd == m_pMinButton)
- {
- OnMinButtonLBDown(*(CPDF_Point*)lParam);
- }
-
- if (pWnd == m_pMaxButton)
- {
- OnMaxButtonLBDown(*(CPDF_Point*)lParam);
- }
-
- if (pWnd == m_pPosButton)
- {
- OnPosButtonLBDown(*(CPDF_Point*)lParam);
- }
- break;
- case PNM_LBUTTONUP:
- if (pWnd == m_pMinButton)
- {
- OnMinButtonLBUp(*(CPDF_Point*)lParam);
- }
-
- if (pWnd == m_pMaxButton)
- {
- OnMaxButtonLBUp(*(CPDF_Point*)lParam);
- }
-
- if (pWnd == m_pPosButton)
- {
- OnPosButtonLBUp(*(CPDF_Point*)lParam);
- }
- break;
- case PNM_MOUSEMOVE:
- if (pWnd == m_pMinButton)
- {
- OnMinButtonMouseMove(*(CPDF_Point*)lParam);
- }
-
- if (pWnd == m_pMaxButton)
- {
- OnMaxButtonMouseMove(*(CPDF_Point*)lParam);
- }
-
- if (pWnd == m_pPosButton)
- {
- OnPosButtonMouseMove(*(CPDF_Point*)lParam);
- }
- break;
- case PNM_SETSCROLLINFO:
- {
- if (PWL_SCROLL_INFO * pInfo = (PWL_SCROLL_INFO*)lParam)
- {
- if (FXSYS_memcmp(&m_OriginInfo, pInfo, sizeof(PWL_SCROLL_INFO)) != 0)
- {
- m_OriginInfo = *pInfo;
- FX_FLOAT fMax = pInfo->fContentMax - pInfo->fContentMin - pInfo->fPlateWidth;
- fMax = fMax > 0.0f ? fMax : 0.0f;
- this->SetScrollRange(0,fMax, pInfo->fPlateWidth);
- this->SetScrollStep(pInfo->fBigStep,pInfo->fSmallStep);
- }
- }
- }
- break;
- case PNM_SETSCROLLPOS:
- {
- FX_FLOAT fPos = *(FX_FLOAT*)lParam;
- switch (this->m_sbType)
- {
- case SBT_HSCROLL:
- fPos = fPos - m_OriginInfo.fContentMin;
- break;
- case SBT_VSCROLL:
- fPos = m_OriginInfo.fContentMax - fPos;
- break;
- }
- this->SetScrollPos(fPos);
- }
- break;
- }
-}
-
-void CPWL_ScrollBar::CreateButtons(const PWL_CREATEPARAM & cp)
-{
- PWL_CREATEPARAM scp = cp;
- scp.pParentWnd = this;
- scp.dwBorderWidth = 2;
- scp.nBorderStyle = PBS_BEVELED;
-
- scp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PWS_NOREFRESHCLIP;
-
- if (!m_pMinButton)
- {
- m_pMinButton = new CPWL_SBButton(m_sbType,PSBT_MIN);
- m_pMinButton->Create(scp);
- }
-
- if (!m_pMaxButton)
- {
- m_pMaxButton = new CPWL_SBButton(m_sbType,PSBT_MAX);
- m_pMaxButton->Create(scp);
- }
-
- if (!m_pPosButton)
- {
- m_pPosButton = new CPWL_SBButton(m_sbType,PSBT_POS);
- m_pPosButton->SetVisible(FALSE);
- m_pPosButton->Create(scp);
- }
-}
-
-FX_FLOAT CPWL_ScrollBar::GetScrollBarWidth() const
-{
- if (!IsVisible()) return 0;
-
- return PWL_SCROLLBAR_WIDTH;
-}
-
-void CPWL_ScrollBar::SetScrollRange(FX_FLOAT fMin,FX_FLOAT fMax,FX_FLOAT fClientWidth)
-{
- if (m_pPosButton)
- {
- m_sData.SetScrollRange(fMin,fMax);
- m_sData.SetClientWidth(fClientWidth);
-
- if (IsFloatSmaller(m_sData.ScrollRange.GetWidth(), 0.0f))
- {
- m_pPosButton->SetVisible(FALSE);
- }
- else
- {
- m_pPosButton->SetVisible(TRUE);
- MovePosButton(TRUE);
- }
- }
-}
-
-void CPWL_ScrollBar::SetScrollPos(FX_FLOAT fPos)
-{
- FX_FLOAT fOldPos = m_sData.fScrollPos;
-
- m_sData.SetPos(fPos);
-
- if (!IsFloatEqual(m_sData.fScrollPos, fOldPos))
- MovePosButton(TRUE);
-}
-
-void CPWL_ScrollBar::SetScrollStep(FX_FLOAT fBigStep,FX_FLOAT fSmallStep)
-{
- m_sData.SetBigStep(fBigStep);
- m_sData.SetSmallStep(fSmallStep);
-}
-
-void CPWL_ScrollBar::MovePosButton(FX_BOOL bRefresh)
-{
- ASSERT (m_pPosButton != NULL);
- ASSERT (m_pMinButton != NULL);
- ASSERT (m_pMaxButton != NULL);
-
- if (m_pPosButton->IsVisible())
- {
-
-
-
-
- CPDF_Rect rcClient;
- CPDF_Rect rcPosArea,rcPosButton;
-
- rcClient = this->GetClientRect();
- rcPosArea = GetScrollArea();
-
- FX_FLOAT fLeft,fRight,fTop,fBottom;
-
- switch (m_sbType)
- {
- case SBT_HSCROLL:
- fLeft = TrueToFace(m_sData.fScrollPos);
- fRight = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth);
-
- if (fRight - fLeft < PWL_SCROLLBAR_POSBUTTON_MINWIDTH)
- fRight = fLeft + PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
-
- if (fRight > rcPosArea.right)
- {
- fRight = rcPosArea.right;
- fLeft = fRight - PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
- }
-
- rcPosButton = CPDF_Rect(fLeft ,
- rcPosArea.bottom,
- fRight ,
- rcPosArea.top);
-
- break;
- case SBT_VSCROLL:
- fBottom = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth);
- fTop = TrueToFace(m_sData.fScrollPos);
-
- if (IsFloatSmaller(fTop - fBottom, PWL_SCROLLBAR_POSBUTTON_MINWIDTH))
- fBottom = fTop - PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
-
- if (IsFloatSmaller(fBottom, rcPosArea.bottom))
- {
- fBottom = rcPosArea.bottom;
- fTop = fBottom + PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
- }
-
- rcPosButton = CPDF_Rect(rcPosArea.left,
- fBottom,
- rcPosArea.right,
- fTop);
-
- break;
- }
-
- m_pPosButton->Move(rcPosButton,TRUE,bRefresh);
- }
-}
-
-void CPWL_ScrollBar::OnMinButtonLBDown(const CPDF_Point & point)
-{
- m_sData.SubSmall();
- MovePosButton(TRUE);
- NotifyScrollWindow();
-
- m_bMinOrMax = TRUE;
-
- EndTimer();
- BeginTimer(100);
-}
-
-void CPWL_ScrollBar::OnMinButtonLBUp(const CPDF_Point & point)
-{
-}
-
-void CPWL_ScrollBar::OnMinButtonMouseMove(const CPDF_Point & point)
-{
-}
-
-void CPWL_ScrollBar::OnMaxButtonLBDown(const CPDF_Point & point)
-{
- m_sData.AddSmall();
- MovePosButton(TRUE);
- NotifyScrollWindow();
-
- m_bMinOrMax = FALSE;
-
- EndTimer();
- BeginTimer(100);
-}
-
-void CPWL_ScrollBar::OnMaxButtonLBUp(const CPDF_Point & point)
-{
-}
-
-void CPWL_ScrollBar::OnMaxButtonMouseMove(const CPDF_Point & point)
-{
-}
-
-void CPWL_ScrollBar::OnPosButtonLBDown(const CPDF_Point & point)
-{
- m_bMouseDown = TRUE;
-
- if (m_pPosButton)
- {
- CPDF_Rect rcPosButton = m_pPosButton->GetWindowRect();
-
- switch(m_sbType)
- {
- case SBT_HSCROLL:
- m_nOldPos = point.x;
- m_fOldPosButton = rcPosButton.left;
- break;
- case SBT_VSCROLL:
- m_nOldPos = point.y;
- m_fOldPosButton = rcPosButton.top;
- break;
- }
- }
-}
-
-void CPWL_ScrollBar::OnPosButtonLBUp(const CPDF_Point & point)
-{
- if (m_bMouseDown)
- {
- if (!m_bNotifyForever)
- NotifyScrollWindow();
- }
- m_bMouseDown = FALSE;
-}
-
-void CPWL_ScrollBar::OnPosButtonMouseMove(const CPDF_Point & point)
-{
- FX_FLOAT fOldScrollPos = m_sData.fScrollPos;
-
- FX_FLOAT fNewPos = 0;
-
- switch (m_sbType)
- {
- case SBT_HSCROLL:
- if (FXSYS_fabs(point.x - m_nOldPos) < 1) return;
- fNewPos = FaceToTrue(m_fOldPosButton + point.x - m_nOldPos);
- break;
- case SBT_VSCROLL:
- if (FXSYS_fabs(point.y - m_nOldPos) < 1) return;
- fNewPos = FaceToTrue(m_fOldPosButton + point.y - m_nOldPos);
- break;
- }
-
- if (m_bMouseDown)
- {
- switch (m_sbType)
- {
- case SBT_HSCROLL:
-
- if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin))
- {
- fNewPos = m_sData.ScrollRange.fMin;
- }
-
- if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax))
- {
- fNewPos = m_sData.ScrollRange.fMax;
- }
-
- m_sData.SetPos(fNewPos);
-
- break;
- case SBT_VSCROLL:
-
- if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin))
- {
- fNewPos = m_sData.ScrollRange.fMin;
- }
-
- if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax))
- {
- fNewPos = m_sData.ScrollRange.fMax;
- }
-
- m_sData.SetPos(fNewPos);
-
- break;
- }
-
- if (!IsFloatEqual(fOldScrollPos, m_sData.fScrollPos))
- {
- MovePosButton(TRUE);
-
- if (m_bNotifyForever)
- NotifyScrollWindow();
- }
- }
-}
-
-void CPWL_ScrollBar::NotifyScrollWindow()
-{
- if (CPWL_Wnd * pParent = this->GetParentWindow())
- {
- FX_FLOAT fPos;
- switch (this->m_sbType)
- {
- case SBT_HSCROLL:
- fPos = m_OriginInfo.fContentMin + m_sData.fScrollPos;
- break;
- case SBT_VSCROLL:
- fPos = m_OriginInfo.fContentMax - m_sData.fScrollPos;
- break;
- }
- pParent->OnNotify(this,PNM_SCROLLWINDOW,(FX_INTPTR)m_sbType,(FX_INTPTR)&fPos);
- }
-}
-
-CPDF_Rect CPWL_ScrollBar::GetScrollArea() const
-{
- CPDF_Rect rcClient = GetClientRect();
- CPDF_Rect rcArea;
-
- if (!m_pMinButton || !m_pMaxButton)return rcClient;
-
- CPDF_Rect rcMin = m_pMinButton->GetWindowRect();
- CPDF_Rect rcMax = m_pMaxButton->GetWindowRect();
-
- FX_FLOAT fMinWidth = rcMin.right - rcMin.left;
- FX_FLOAT fMinHeight = rcMin.top - rcMin.bottom;
- FX_FLOAT fMaxWidth = rcMax.right - rcMax.left;
- FX_FLOAT fMaxHeight = rcMax.top - rcMax.bottom;
-
- switch(m_sbType)
- {
- case SBT_HSCROLL:
- if (rcClient.right - rcClient.left > fMinWidth + fMaxWidth + 2)
- {
- rcArea = CPDF_Rect(rcClient.left + fMinWidth + 1,rcClient.bottom,
- rcClient.right - fMaxWidth - 1,rcClient.top);
- }
- else
- {
- rcArea = CPDF_Rect(rcClient.left + fMinWidth + 1,rcClient.bottom,
- rcClient.left + fMinWidth + 1,rcClient.top);
- }
- break;
- case SBT_VSCROLL:
- if (rcClient.top - rcClient.bottom > fMinHeight + fMaxHeight + 2)
- {
- rcArea = CPDF_Rect(rcClient.left,rcClient.bottom + fMinHeight + 1,
- rcClient.right,rcClient.top - fMaxHeight - 1);
- }
- else
- {
- rcArea = CPDF_Rect(rcClient.left,rcClient.bottom + fMinHeight + 1,
- rcClient.right,rcClient.bottom + fMinHeight + 1);
- }
- break;
- }
-
- rcArea.Normalize();
-
- return rcArea;
-}
-
-FX_FLOAT CPWL_ScrollBar::TrueToFace(FX_FLOAT fTrue)
-{
- CPDF_Rect rcPosArea;
- rcPosArea = GetScrollArea();
-
- FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth;
- fFactWidth = fFactWidth == 0 ? 1 : fFactWidth;
-
- FX_FLOAT fFace = 0;
-
- switch(m_sbType)
- {
- case SBT_HSCROLL:
- fFace = rcPosArea.left + fTrue * (rcPosArea.right - rcPosArea.left) / fFactWidth;
- break;
- case SBT_VSCROLL:
- fFace = rcPosArea.top - fTrue * (rcPosArea.top - rcPosArea.bottom) / fFactWidth;
- break;
- }
-
- return fFace;
-}
-
-FX_FLOAT CPWL_ScrollBar::FaceToTrue(FX_FLOAT fFace)
-{
- CPDF_Rect rcPosArea;
- rcPosArea = GetScrollArea();
-
- FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth;
- fFactWidth = fFactWidth == 0 ? 1 : fFactWidth;
-
- FX_FLOAT fTrue = 0;
-
- switch(m_sbType)
- {
- case SBT_HSCROLL:
- fTrue = (fFace - rcPosArea.left) * fFactWidth / (rcPosArea.right - rcPosArea.left);
- break;
- case SBT_VSCROLL:
- fTrue = (rcPosArea.top - fFace) * fFactWidth / (rcPosArea.top - rcPosArea.bottom);
- break;
- }
-
- return fTrue;
-}
-
-void CPWL_ScrollBar::CreateChildWnd(const PWL_CREATEPARAM & cp)
-{
- CreateButtons(cp);
-}
-
-void CPWL_ScrollBar::TimerProc()
-{
- PWL_SCROLL_PRIVATEDATA sTemp = m_sData;
-
- if (m_bMinOrMax)m_sData.SubSmall();
- else m_sData.AddSmall();
-
- if (FXSYS_memcmp(&m_sData, &sTemp, sizeof(PWL_SCROLL_PRIVATEDATA)) != 0)
- {
- MovePosButton(TRUE);
- NotifyScrollWindow();
- }
-}
-
-/*
-void CPWL_ScrollBar::OnSetFocus()
-{
- if (GetTransparency() != 255)
- {
- SetTransparency(255);
- InvalidateRect();
- }
-}
-
-void CPWL_ScrollBar::OnKillFocus()
-{
- if (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY)
- {
- SetTransparency(PWL_SCROLLBAR_TRANSPARANCY);
- InvalidateRect();
- }
-}
-*/
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_ScrollBar.h" +#include "../../include/pdfwindow/PWL_Utils.h" + +#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) +#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) +#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) +#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb)) + + +/* ------------------------------- PWL_FLOATRANGE ------------------------------- */ + +PWL_FLOATRANGE::PWL_FLOATRANGE() +{ + Default(); +} + +PWL_FLOATRANGE::PWL_FLOATRANGE(FX_FLOAT min,FX_FLOAT max) +{ + Set(min,max); +} + +void PWL_FLOATRANGE::Default() +{ + fMin = 0; + fMax = 0; +} + +void PWL_FLOATRANGE::Set(FX_FLOAT min,FX_FLOAT max) +{ + if (min > max) + { + fMin = max; + fMax = min; + } + else + { + fMin = min; + fMax = max; + } +} + +FX_BOOL PWL_FLOATRANGE::In(FX_FLOAT x) const +{ + return (IsFloatBigger(x,fMin) || IsFloatEqual(x, fMin)) && + (IsFloatSmaller(x, fMax) || IsFloatEqual(x, fMax)); +} + +FX_FLOAT PWL_FLOATRANGE::GetWidth() const +{ + return fMax - fMin; +} + +/* ------------------------------- PWL_SCROLL_PRIVATEDATA ------------------------------- */ + +PWL_SCROLL_PRIVATEDATA::PWL_SCROLL_PRIVATEDATA() +{ + Default(); +} + +void PWL_SCROLL_PRIVATEDATA::Default() +{ + ScrollRange.Default(); + fScrollPos = ScrollRange.fMin; + fClientWidth = 0; + fBigStep = 10; + fSmallStep = 1; +} + +void PWL_SCROLL_PRIVATEDATA::SetScrollRange(FX_FLOAT min,FX_FLOAT max) +{ + ScrollRange.Set(min,max); + + if (IsFloatSmaller(fScrollPos, ScrollRange.fMin)) + fScrollPos = ScrollRange.fMin; + if (IsFloatBigger(fScrollPos, ScrollRange.fMax)) + fScrollPos = ScrollRange.fMax; +} + +void PWL_SCROLL_PRIVATEDATA::SetClientWidth(FX_FLOAT width) +{ + fClientWidth = width; +} + +void PWL_SCROLL_PRIVATEDATA::SetSmallStep(FX_FLOAT step) +{ + fSmallStep = step; +} + +void PWL_SCROLL_PRIVATEDATA::SetBigStep(FX_FLOAT step) +{ + fBigStep = step; +} + +FX_BOOL PWL_SCROLL_PRIVATEDATA::SetPos(FX_FLOAT pos) +{ + if (ScrollRange.In(pos)) + { + fScrollPos = pos; + return TRUE; + } + return FALSE; +} + +void PWL_SCROLL_PRIVATEDATA::AddSmall() +{ + if (!SetPos(fScrollPos + fSmallStep)) + SetPos(ScrollRange.fMax); +} + +void PWL_SCROLL_PRIVATEDATA::SubSmall() +{ + if (!SetPos(fScrollPos - fSmallStep)) + SetPos(ScrollRange.fMin); +} + +void PWL_SCROLL_PRIVATEDATA::AddBig() +{ + if (!SetPos(fScrollPos + fBigStep)) + SetPos(ScrollRange.fMax); +} + +void PWL_SCROLL_PRIVATEDATA::SubBig() +{ + if (!SetPos(fScrollPos - fBigStep)) + SetPos(ScrollRange.fMin); +} + +/* ------------------------------- CPWL_SBButton ------------------------------- */ + +CPWL_SBButton::CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType,PWL_SBBUTTON_TYPE eButtonType) +{ + m_eScrollBarType = eScrollBarType; + m_eSBButtonType = eButtonType; + + m_bMouseDown = FALSE; +} + +CPWL_SBButton::~CPWL_SBButton() +{ + +} + +CFX_ByteString CPWL_SBButton::GetClassName() const +{ + return "CPWL_SBButton"; +} + +void CPWL_SBButton::OnCreate(PWL_CREATEPARAM & cp) +{ + cp.eCursorType = FXCT_ARROW; +} + +void CPWL_SBButton::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream) +{ + CPWL_Wnd::GetThisAppearanceStream(sAppStream); + + if (!IsVisible()) return; + + CFX_ByteTextBuf sButton; + + CPDF_Rect rectWnd = GetWindowRect(); + + if (rectWnd.IsEmpty()) return; + + sAppStream << "q\n"; + + CPDF_Point ptCenter = this->GetCenterPoint(); + + switch (this->m_eScrollBarType) + { + case SBT_HSCROLL: + switch (this->m_eSBButtonType) + { + case PSBT_MIN: + { + CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y); + CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN); + CPDF_Point pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN); + + if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && + rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN ) + { + sButton << "0 g\n"; + sButton << pt1.x << " " << pt1.y << " m\n"; + sButton << pt2.x << " " << pt2.y << " l\n"; + sButton << pt3.x << " " << pt3.y << " l\n"; + sButton << pt1.x << " " << pt1.y << " l f\n"; + + sAppStream << sButton; + } + } + break; + case PSBT_MAX: + { + CPDF_Point pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y); + CPDF_Point pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN); + CPDF_Point pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN); + + if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && + rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN ) + { + sButton << "0 g\n"; + sButton << pt1.x << " " << pt1.y << " m\n"; + sButton << pt2.x << " " << pt2.y << " l\n"; + sButton << pt3.x << " " << pt3.y << " l\n"; + sButton << pt1.x << " " << pt1.y << " l f\n"; + + sAppStream << sButton; + } + } + break; + default: + break; + } + break; + case SBT_VSCROLL: + switch(this->m_eSBButtonType) + { + case PSBT_MIN: + { + CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f); + CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f); + CPDF_Point pt3(ptCenter.x,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f); + + if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && + rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN ) + { + sButton << "0 g\n"; + sButton << pt1.x << " " << pt1.y << " m\n"; + sButton << pt2.x << " " << pt2.y << " l\n"; + sButton << pt3.x << " " << pt3.y << " l\n"; + sButton << pt1.x << " " << pt1.y << " l f\n"; + + sAppStream << sButton; + } + } + break; + case PSBT_MAX: + { + CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f); + CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f); + CPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f); + + if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && + rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN ) + { + sButton << "0 g\n"; + sButton << pt1.x << " " << pt1.y << " m\n"; + sButton << pt2.x << " " << pt2.y << " l\n"; + sButton << pt3.x << " " << pt3.y << " l\n"; + sButton << pt1.x << " " << pt1.y << " l f\n"; + + sAppStream << sButton; + } + } + break; + default: + break; + } + break; + default: + break; + } + + sAppStream << "Q\n"; +} + +void CPWL_SBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + if (!IsVisible()) return; + + CPDF_Rect rectWnd = GetWindowRect(); + if (rectWnd.IsEmpty()) return; + + CPDF_Point ptCenter = this->GetCenterPoint(); + FX_INT32 nTransparancy = this->GetTransparency(); + + switch (this->m_eScrollBarType) + { + case SBT_HSCROLL: + CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device); + switch (this->m_eSBButtonType) + { + case PSBT_MIN: + { + CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y); + CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN); + CPDF_Point pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN); + + if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && + rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN ) + { + CFX_PathData path; + + path.SetPointCount(4); + path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO); + path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO); + path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO); + path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO); + + pDevice->DrawPath(&path, pUser2Device, NULL, + CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR,nTransparancy), + 0, FXFILL_ALTERNATE); + } + } + break; + case PSBT_MAX: + { + CPDF_Point pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y); + CPDF_Point pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN); + CPDF_Point pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN); + + if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && + rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN ) + { + CFX_PathData path; + + path.SetPointCount(4); + path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO); + path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO); + path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO); + path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO); + + pDevice->DrawPath(&path, pUser2Device, NULL, + CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR,nTransparancy), + 0, FXFILL_ALTERNATE); + } + } + break; + default: + break; + } + break; + case SBT_VSCROLL: + switch(this->m_eSBButtonType) + { + case PSBT_MIN: + { + //draw border + CPDF_Rect rcDraw = rectWnd; + CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(nTransparancy,100,100,100),0.0f); + + //draw inner border + rcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f); + CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(nTransparancy,255,255,255),1.0f); + + //draw background + + rcDraw = CPWL_Utils::DeflateRect(rectWnd,1.0f); + + if (this->IsEnabled()) + CPWL_Utils::DrawShadow(pDevice, pUser2Device, TRUE, FALSE, rcDraw, nTransparancy, 80, 220); + else + CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, ArgbEncode(255,255,255,255)); + + //draw arrow + + if (rectWnd.top - rectWnd.bottom > 6.0f ) + { + FX_FLOAT fX = rectWnd.left + 1.5f; + FX_FLOAT fY = rectWnd.bottom; + CPDF_Point pts[7] = { + CPDF_Point(fX+2.5f, fY+4.0f), + CPDF_Point(fX+2.5f, fY+3.0f), + CPDF_Point(fX+4.5f, fY+5.0f), + CPDF_Point(fX+6.5f, fY+3.0f), + CPDF_Point(fX+6.5f, fY+4.0f), + CPDF_Point(fX+4.5f, fY+6.0f), + CPDF_Point(fX+2.5f, fY+4.0f)}; + + + if (this->IsEnabled()) + CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7, ArgbEncode(nTransparancy,255,255,255)); + else + CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7, + CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_HEAVYGRAYCOLOR,255)); + } + } + break; + case PSBT_MAX: + { + //draw border + CPDF_Rect rcDraw = rectWnd; + CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(nTransparancy,100,100,100),0.0f); + + //draw inner border + rcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f); + CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(nTransparancy,255,255,255),1.0f); + + //draw background + rcDraw = CPWL_Utils::DeflateRect(rectWnd,1.0f); + if (this->IsEnabled()) + CPWL_Utils::DrawShadow(pDevice, pUser2Device, TRUE, FALSE, rcDraw, nTransparancy, 80, 220); + else + CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, ArgbEncode(255,255,255,255)); + + //draw arrow + + if (rectWnd.top - rectWnd.bottom > 6.0f ) + { + FX_FLOAT fX = rectWnd.left + 1.5f; + FX_FLOAT fY = rectWnd.bottom; + + CPDF_Point pts[7] = { + CPDF_Point(fX+2.5f, fY+5.0f), + CPDF_Point(fX+2.5f, fY+6.0f), + CPDF_Point(fX+4.5f, fY+4.0f), + CPDF_Point(fX+6.5f, fY+6.0f), + CPDF_Point(fX+6.5f, fY+5.0f), + CPDF_Point(fX+4.5f, fY+3.0f), + CPDF_Point(fX+2.5f, fY+5.0f)}; + + + if (this->IsEnabled()) + CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7, ArgbEncode(nTransparancy,255,255,255)); + else + CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7, + CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_HEAVYGRAYCOLOR,255)); + } + } + break; + case PSBT_POS: + { + //CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device); + + //draw border + CPDF_Rect rcDraw = rectWnd; + CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(nTransparancy,100,100,100),0.0f); + + //draw inner border + rcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f); + CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(nTransparancy,255,255,255),1.0f); + + if (this->IsEnabled()) + { + //draw shadow effect + + CPDF_Point ptTop = CPDF_Point(rectWnd.left,rectWnd.top-1.0f); + CPDF_Point ptBottom = CPDF_Point(rectWnd.left,rectWnd.bottom+1.0f); + + ptTop.x += 1.5f; + ptBottom.x += 1.5f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparancy,210,210,210),1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparancy,220,220,220),1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparancy,240,240,240),1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparancy,240,240,240),1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparancy,210,210,210),1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparancy,180,180,180),1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparancy,150,150,150),1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparancy,150,150,150),1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparancy,180,180,180),1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparancy,210,210,210),1.0f); + } + else + { + CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, ArgbEncode(255,255,255,255)); + } + + //draw friction + + if (rectWnd.Height() > 8.0f) + { + FX_COLORREF crStroke = ArgbEncode(nTransparancy,120,120,120); + if (!this->IsEnabled()) + crStroke = CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_HEAVYGRAYCOLOR,255); + + FX_FLOAT nFrictionWidth = 5.0f; + FX_FLOAT nFrictionHeight = 5.5f; + + CPDF_Point ptLeft = CPDF_Point(ptCenter.x - nFrictionWidth / 2.0f, ptCenter.y - nFrictionHeight / 2.0f + 0.5f); + CPDF_Point ptRight = CPDF_Point(ptCenter.x + nFrictionWidth / 2.0f, ptCenter.y - nFrictionHeight / 2.0f + 0.5f); + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, + crStroke,1.0f); + + ptLeft.y += 2.0f; + ptRight.y += 2.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, + crStroke,1.0f); + + ptLeft.y += 2.0f; + ptRight.y += 2.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, + crStroke,1.0f); + + /* + ptLeft.y += 1.5f; + ptRight.y += 1.5f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, + ArgbEncode(nTransparancy,150,150,150),1.0f); + */ + } + } + break; + default: + break; + } + break; + default: + break; + } +} + +FX_BOOL CPWL_SBButton::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonDown(point,nFlag); + + if (CPWL_Wnd * pParent = GetParentWindow()) + pParent->OnNotify(this,PNM_LBUTTONDOWN,0,(FX_INTPTR)&point); + + m_bMouseDown = TRUE; + SetCapture(); + + return TRUE; +} + +FX_BOOL CPWL_SBButton::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonUp(point,nFlag); + + if (CPWL_Wnd * pParent = GetParentWindow()) + pParent->OnNotify(this,PNM_LBUTTONUP,0,(FX_INTPTR)&point); + + m_bMouseDown = FALSE; + ReleaseCapture(); + + return TRUE; +} + +FX_BOOL CPWL_SBButton::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnMouseMove(point,nFlag); + + if (CPWL_Wnd * pParent = GetParentWindow()) + { + pParent->OnNotify(this,PNM_MOUSEMOVE,0,(FX_INTPTR)&point); + + /* + if (m_bMouseDown && (m_eSBButtonType == PSBT_MIN || m_eSBButtonType == PSBT_MAX)) + { + if (!pParent->OnNotify(this,PNM_LBUTTONDOWN,nFlags,(FX_INTPTR)&point)) + return FALSE; + } + */ + } + + return TRUE; +} + +/* ------------------------------- CPWL_ScrollBar ---------------------------------- */ + +CPWL_ScrollBar::CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType): + m_sbType(sbType), + m_pMinButton(NULL), + m_pMaxButton(NULL), + m_pPosButton(NULL), + m_bMouseDown(FALSE), + m_bMinOrMax(FALSE), + m_bNotifyForever(TRUE) +{ +} + +CPWL_ScrollBar::~CPWL_ScrollBar() +{ +} + +CFX_ByteString CPWL_ScrollBar::GetClassName() const +{ + return "CPWL_ScrollBar"; +} + +void CPWL_ScrollBar::OnCreate(PWL_CREATEPARAM & cp) +{ + cp.eCursorType = FXCT_ARROW; +} + +void CPWL_ScrollBar::RePosChildWnd() +{ + CPDF_Rect rcClient = this->GetClientRect(); + +/* + switch(m_sbType) + { + case SBT_HSCROLL: + if (rcClient.right - rcClient.left < PWL_SCROLLBAR_WIDTH || + rcClient.top - rcClient.bottom < PWL_SCROLLBAR_WIDTH) + { + SetVisible(FALSE); + } + break; + case SBT_VSCROLL: + if (rcClient.right - rcClient.left < PWL_SCROLLBAR_WIDTH || + rcClient.top - rcClient.bottom < PWL_SCROLLBAR_WIDTH) + { + SetVisible(FALSE); + } + break; + } +*/ + CPDF_Rect rcMinButton,rcMaxButton; + + FX_FLOAT fBWidth = 0; + + switch (m_sbType) + { + case SBT_HSCROLL: + if (rcClient.right - rcClient.left > PWL_SCROLLBAR_BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2) + { + rcMinButton = CPDF_Rect(rcClient.left,rcClient.bottom, + rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.top); + rcMaxButton = CPDF_Rect(rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.bottom, + rcClient.right,rcClient.top); + } + else + { + fBWidth = (rcClient.right - rcClient.left - PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) / 2; + + if (fBWidth > 0) + { + rcMinButton = CPDF_Rect(rcClient.left,rcClient.bottom, + rcClient.left + fBWidth,rcClient.top); + rcMaxButton = CPDF_Rect(rcClient.right - fBWidth,rcClient.bottom, + rcClient.right,rcClient.top); + } + else SetVisible(FALSE); + } + break; + case SBT_VSCROLL: + if (IsFloatBigger(rcClient.top - rcClient.bottom, PWL_SCROLLBAR_BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2)) + { + rcMinButton = CPDF_Rect(rcClient.left,rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH, + rcClient.right,rcClient.top); + rcMaxButton = CPDF_Rect(rcClient.left,rcClient.bottom, + rcClient.right,rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH); + } + else + { + fBWidth = (rcClient.top - rcClient.bottom - PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) / 2; + + if (IsFloatBigger(fBWidth, 0)) + { + rcMinButton = CPDF_Rect(rcClient.left,rcClient.top - fBWidth, + rcClient.right,rcClient.top); + rcMaxButton = CPDF_Rect(rcClient.left,rcClient.bottom, + rcClient.right,rcClient.bottom + fBWidth); + } + else SetVisible(FALSE); + } + break; + } + +// if (IsVisible()) + { + if (m_pMinButton) + m_pMinButton->Move(rcMinButton,TRUE,FALSE); + + if (m_pMaxButton) + m_pMaxButton->Move(rcMaxButton,TRUE,FALSE); + + MovePosButton(FALSE); + } +} + +void CPWL_ScrollBar::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream) +{ + CPDF_Rect rectWnd = GetWindowRect(); + + if (IsVisible() && !rectWnd.IsEmpty()) + { + CFX_ByteTextBuf sButton; + + sButton << "q\n"; + sButton << "0 w\n" << CPWL_Utils::GetColorAppStream(GetBackgroundColor(),TRUE); + sButton << rectWnd.left << " " << rectWnd.bottom << " " + << rectWnd.right - rectWnd.left << " " << rectWnd.top - rectWnd.bottom << " re b Q\n"; + + sAppStream << sButton; + } +} + +void CPWL_ScrollBar::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ +// CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device); + CPDF_Rect rectWnd = GetWindowRect(); + + if (IsVisible() && !rectWnd.IsEmpty()) + { + CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rectWnd, this->GetBackgroundColor(), GetTransparency()); + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, + CPDF_Point(rectWnd.left+2.0f,rectWnd.top-2.0f), CPDF_Point(rectWnd.left+2.0f,rectWnd.bottom+2.0f), + ArgbEncode(this->GetTransparency(),100,100,100),1.0f); + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, + CPDF_Point(rectWnd.right-2.0f,rectWnd.top-2.0f), CPDF_Point(rectWnd.right-2.0f,rectWnd.bottom+2.0f), + ArgbEncode(this->GetTransparency(),100,100,100),1.0f); + } +} + +FX_BOOL CPWL_ScrollBar::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonDown(point,nFlag); + + //SetFocus(); + + if (HasFlag(PWS_AUTOTRANSPARENT)) + { + if (GetTransparency() != 255) + { + SetTransparency(255); + InvalidateRect(); + } + } + + CPDF_Rect rcMinArea,rcMaxArea; + + if (m_pPosButton && m_pPosButton->IsVisible()) + { + CPDF_Rect rcClient = this->GetClientRect(); + CPDF_Rect rcPosButton = m_pPosButton->GetWindowRect(); + + switch (m_sbType) + { + case SBT_HSCROLL: + rcMinArea = CPDF_Rect(rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.bottom, + rcPosButton.left,rcClient.top); + rcMaxArea = CPDF_Rect(rcPosButton.right,rcClient.bottom, + rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.top); + + break; + case SBT_VSCROLL: + rcMinArea = CPDF_Rect(rcClient.left,rcPosButton.top, + rcClient.right,rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH); + rcMaxArea = CPDF_Rect(rcClient.left,rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH, + rcClient.right,rcPosButton.bottom); + break; + } + + rcMinArea.Normalize(); + rcMaxArea.Normalize(); + + if (rcMinArea.Contains(point.x,point.y)) + { + m_sData.SubBig(); + MovePosButton(TRUE); + NotifyScrollWindow(); + } + + if (rcMaxArea.Contains(point.x,point.y)) + { + m_sData.AddBig(); + MovePosButton(TRUE); + NotifyScrollWindow(); + } + } + + return TRUE; +} + +FX_BOOL CPWL_ScrollBar::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag) +{ + CPWL_Wnd::OnLButtonUp(point,nFlag); + + if (HasFlag(PWS_AUTOTRANSPARENT)) + { + if (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY) + { + SetTransparency(PWL_SCROLLBAR_TRANSPARANCY); + InvalidateRect(); + } + } + + EndTimer(); + m_bMouseDown = FALSE; + + return TRUE; +} + +void CPWL_ScrollBar::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam) +{ + CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam); + + switch (msg) + { + case PNM_LBUTTONDOWN: + if (pWnd == m_pMinButton) + { + OnMinButtonLBDown(*(CPDF_Point*)lParam); + } + + if (pWnd == m_pMaxButton) + { + OnMaxButtonLBDown(*(CPDF_Point*)lParam); + } + + if (pWnd == m_pPosButton) + { + OnPosButtonLBDown(*(CPDF_Point*)lParam); + } + break; + case PNM_LBUTTONUP: + if (pWnd == m_pMinButton) + { + OnMinButtonLBUp(*(CPDF_Point*)lParam); + } + + if (pWnd == m_pMaxButton) + { + OnMaxButtonLBUp(*(CPDF_Point*)lParam); + } + + if (pWnd == m_pPosButton) + { + OnPosButtonLBUp(*(CPDF_Point*)lParam); + } + break; + case PNM_MOUSEMOVE: + if (pWnd == m_pMinButton) + { + OnMinButtonMouseMove(*(CPDF_Point*)lParam); + } + + if (pWnd == m_pMaxButton) + { + OnMaxButtonMouseMove(*(CPDF_Point*)lParam); + } + + if (pWnd == m_pPosButton) + { + OnPosButtonMouseMove(*(CPDF_Point*)lParam); + } + break; + case PNM_SETSCROLLINFO: + { + if (PWL_SCROLL_INFO * pInfo = (PWL_SCROLL_INFO*)lParam) + { + if (FXSYS_memcmp(&m_OriginInfo, pInfo, sizeof(PWL_SCROLL_INFO)) != 0) + { + m_OriginInfo = *pInfo; + FX_FLOAT fMax = pInfo->fContentMax - pInfo->fContentMin - pInfo->fPlateWidth; + fMax = fMax > 0.0f ? fMax : 0.0f; + this->SetScrollRange(0,fMax, pInfo->fPlateWidth); + this->SetScrollStep(pInfo->fBigStep,pInfo->fSmallStep); + } + } + } + break; + case PNM_SETSCROLLPOS: + { + FX_FLOAT fPos = *(FX_FLOAT*)lParam; + switch (this->m_sbType) + { + case SBT_HSCROLL: + fPos = fPos - m_OriginInfo.fContentMin; + break; + case SBT_VSCROLL: + fPos = m_OriginInfo.fContentMax - fPos; + break; + } + this->SetScrollPos(fPos); + } + break; + } +} + +void CPWL_ScrollBar::CreateButtons(const PWL_CREATEPARAM & cp) +{ + PWL_CREATEPARAM scp = cp; + scp.pParentWnd = this; + scp.dwBorderWidth = 2; + scp.nBorderStyle = PBS_BEVELED; + + scp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PWS_NOREFRESHCLIP; + + if (!m_pMinButton) + { + m_pMinButton = new CPWL_SBButton(m_sbType,PSBT_MIN); + m_pMinButton->Create(scp); + } + + if (!m_pMaxButton) + { + m_pMaxButton = new CPWL_SBButton(m_sbType,PSBT_MAX); + m_pMaxButton->Create(scp); + } + + if (!m_pPosButton) + { + m_pPosButton = new CPWL_SBButton(m_sbType,PSBT_POS); + m_pPosButton->SetVisible(FALSE); + m_pPosButton->Create(scp); + } +} + +FX_FLOAT CPWL_ScrollBar::GetScrollBarWidth() const +{ + if (!IsVisible()) return 0; + + return PWL_SCROLLBAR_WIDTH; +} + +void CPWL_ScrollBar::SetScrollRange(FX_FLOAT fMin,FX_FLOAT fMax,FX_FLOAT fClientWidth) +{ + if (m_pPosButton) + { + m_sData.SetScrollRange(fMin,fMax); + m_sData.SetClientWidth(fClientWidth); + + if (IsFloatSmaller(m_sData.ScrollRange.GetWidth(), 0.0f)) + { + m_pPosButton->SetVisible(FALSE); + } + else + { + m_pPosButton->SetVisible(TRUE); + MovePosButton(TRUE); + } + } +} + +void CPWL_ScrollBar::SetScrollPos(FX_FLOAT fPos) +{ + FX_FLOAT fOldPos = m_sData.fScrollPos; + + m_sData.SetPos(fPos); + + if (!IsFloatEqual(m_sData.fScrollPos, fOldPos)) + MovePosButton(TRUE); +} + +void CPWL_ScrollBar::SetScrollStep(FX_FLOAT fBigStep,FX_FLOAT fSmallStep) +{ + m_sData.SetBigStep(fBigStep); + m_sData.SetSmallStep(fSmallStep); +} + +void CPWL_ScrollBar::MovePosButton(FX_BOOL bRefresh) +{ + ASSERT (m_pPosButton != NULL); + ASSERT (m_pMinButton != NULL); + ASSERT (m_pMaxButton != NULL); + + if (m_pPosButton->IsVisible()) + { + + + + + CPDF_Rect rcClient; + CPDF_Rect rcPosArea,rcPosButton; + + rcClient = this->GetClientRect(); + rcPosArea = GetScrollArea(); + + FX_FLOAT fLeft,fRight,fTop,fBottom; + + switch (m_sbType) + { + case SBT_HSCROLL: + fLeft = TrueToFace(m_sData.fScrollPos); + fRight = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth); + + if (fRight - fLeft < PWL_SCROLLBAR_POSBUTTON_MINWIDTH) + fRight = fLeft + PWL_SCROLLBAR_POSBUTTON_MINWIDTH; + + if (fRight > rcPosArea.right) + { + fRight = rcPosArea.right; + fLeft = fRight - PWL_SCROLLBAR_POSBUTTON_MINWIDTH; + } + + rcPosButton = CPDF_Rect(fLeft , + rcPosArea.bottom, + fRight , + rcPosArea.top); + + break; + case SBT_VSCROLL: + fBottom = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth); + fTop = TrueToFace(m_sData.fScrollPos); + + if (IsFloatSmaller(fTop - fBottom, PWL_SCROLLBAR_POSBUTTON_MINWIDTH)) + fBottom = fTop - PWL_SCROLLBAR_POSBUTTON_MINWIDTH; + + if (IsFloatSmaller(fBottom, rcPosArea.bottom)) + { + fBottom = rcPosArea.bottom; + fTop = fBottom + PWL_SCROLLBAR_POSBUTTON_MINWIDTH; + } + + rcPosButton = CPDF_Rect(rcPosArea.left, + fBottom, + rcPosArea.right, + fTop); + + break; + } + + m_pPosButton->Move(rcPosButton,TRUE,bRefresh); + } +} + +void CPWL_ScrollBar::OnMinButtonLBDown(const CPDF_Point & point) +{ + m_sData.SubSmall(); + MovePosButton(TRUE); + NotifyScrollWindow(); + + m_bMinOrMax = TRUE; + + EndTimer(); + BeginTimer(100); +} + +void CPWL_ScrollBar::OnMinButtonLBUp(const CPDF_Point & point) +{ +} + +void CPWL_ScrollBar::OnMinButtonMouseMove(const CPDF_Point & point) +{ +} + +void CPWL_ScrollBar::OnMaxButtonLBDown(const CPDF_Point & point) +{ + m_sData.AddSmall(); + MovePosButton(TRUE); + NotifyScrollWindow(); + + m_bMinOrMax = FALSE; + + EndTimer(); + BeginTimer(100); +} + +void CPWL_ScrollBar::OnMaxButtonLBUp(const CPDF_Point & point) +{ +} + +void CPWL_ScrollBar::OnMaxButtonMouseMove(const CPDF_Point & point) +{ +} + +void CPWL_ScrollBar::OnPosButtonLBDown(const CPDF_Point & point) +{ + m_bMouseDown = TRUE; + + if (m_pPosButton) + { + CPDF_Rect rcPosButton = m_pPosButton->GetWindowRect(); + + switch(m_sbType) + { + case SBT_HSCROLL: + m_nOldPos = point.x; + m_fOldPosButton = rcPosButton.left; + break; + case SBT_VSCROLL: + m_nOldPos = point.y; + m_fOldPosButton = rcPosButton.top; + break; + } + } +} + +void CPWL_ScrollBar::OnPosButtonLBUp(const CPDF_Point & point) +{ + if (m_bMouseDown) + { + if (!m_bNotifyForever) + NotifyScrollWindow(); + } + m_bMouseDown = FALSE; +} + +void CPWL_ScrollBar::OnPosButtonMouseMove(const CPDF_Point & point) +{ + FX_FLOAT fOldScrollPos = m_sData.fScrollPos; + + FX_FLOAT fNewPos = 0; + + switch (m_sbType) + { + case SBT_HSCROLL: + if (FXSYS_fabs(point.x - m_nOldPos) < 1) return; + fNewPos = FaceToTrue(m_fOldPosButton + point.x - m_nOldPos); + break; + case SBT_VSCROLL: + if (FXSYS_fabs(point.y - m_nOldPos) < 1) return; + fNewPos = FaceToTrue(m_fOldPosButton + point.y - m_nOldPos); + break; + } + + if (m_bMouseDown) + { + switch (m_sbType) + { + case SBT_HSCROLL: + + if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) + { + fNewPos = m_sData.ScrollRange.fMin; + } + + if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) + { + fNewPos = m_sData.ScrollRange.fMax; + } + + m_sData.SetPos(fNewPos); + + break; + case SBT_VSCROLL: + + if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) + { + fNewPos = m_sData.ScrollRange.fMin; + } + + if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) + { + fNewPos = m_sData.ScrollRange.fMax; + } + + m_sData.SetPos(fNewPos); + + break; + } + + if (!IsFloatEqual(fOldScrollPos, m_sData.fScrollPos)) + { + MovePosButton(TRUE); + + if (m_bNotifyForever) + NotifyScrollWindow(); + } + } +} + +void CPWL_ScrollBar::NotifyScrollWindow() +{ + if (CPWL_Wnd * pParent = this->GetParentWindow()) + { + FX_FLOAT fPos; + switch (this->m_sbType) + { + case SBT_HSCROLL: + fPos = m_OriginInfo.fContentMin + m_sData.fScrollPos; + break; + case SBT_VSCROLL: + fPos = m_OriginInfo.fContentMax - m_sData.fScrollPos; + break; + } + pParent->OnNotify(this,PNM_SCROLLWINDOW,(FX_INTPTR)m_sbType,(FX_INTPTR)&fPos); + } +} + +CPDF_Rect CPWL_ScrollBar::GetScrollArea() const +{ + CPDF_Rect rcClient = GetClientRect(); + CPDF_Rect rcArea; + + if (!m_pMinButton || !m_pMaxButton)return rcClient; + + CPDF_Rect rcMin = m_pMinButton->GetWindowRect(); + CPDF_Rect rcMax = m_pMaxButton->GetWindowRect(); + + FX_FLOAT fMinWidth = rcMin.right - rcMin.left; + FX_FLOAT fMinHeight = rcMin.top - rcMin.bottom; + FX_FLOAT fMaxWidth = rcMax.right - rcMax.left; + FX_FLOAT fMaxHeight = rcMax.top - rcMax.bottom; + + switch(m_sbType) + { + case SBT_HSCROLL: + if (rcClient.right - rcClient.left > fMinWidth + fMaxWidth + 2) + { + rcArea = CPDF_Rect(rcClient.left + fMinWidth + 1,rcClient.bottom, + rcClient.right - fMaxWidth - 1,rcClient.top); + } + else + { + rcArea = CPDF_Rect(rcClient.left + fMinWidth + 1,rcClient.bottom, + rcClient.left + fMinWidth + 1,rcClient.top); + } + break; + case SBT_VSCROLL: + if (rcClient.top - rcClient.bottom > fMinHeight + fMaxHeight + 2) + { + rcArea = CPDF_Rect(rcClient.left,rcClient.bottom + fMinHeight + 1, + rcClient.right,rcClient.top - fMaxHeight - 1); + } + else + { + rcArea = CPDF_Rect(rcClient.left,rcClient.bottom + fMinHeight + 1, + rcClient.right,rcClient.bottom + fMinHeight + 1); + } + break; + } + + rcArea.Normalize(); + + return rcArea; +} + +FX_FLOAT CPWL_ScrollBar::TrueToFace(FX_FLOAT fTrue) +{ + CPDF_Rect rcPosArea; + rcPosArea = GetScrollArea(); + + FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth; + fFactWidth = fFactWidth == 0 ? 1 : fFactWidth; + + FX_FLOAT fFace = 0; + + switch(m_sbType) + { + case SBT_HSCROLL: + fFace = rcPosArea.left + fTrue * (rcPosArea.right - rcPosArea.left) / fFactWidth; + break; + case SBT_VSCROLL: + fFace = rcPosArea.top - fTrue * (rcPosArea.top - rcPosArea.bottom) / fFactWidth; + break; + } + + return fFace; +} + +FX_FLOAT CPWL_ScrollBar::FaceToTrue(FX_FLOAT fFace) +{ + CPDF_Rect rcPosArea; + rcPosArea = GetScrollArea(); + + FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth; + fFactWidth = fFactWidth == 0 ? 1 : fFactWidth; + + FX_FLOAT fTrue = 0; + + switch(m_sbType) + { + case SBT_HSCROLL: + fTrue = (fFace - rcPosArea.left) * fFactWidth / (rcPosArea.right - rcPosArea.left); + break; + case SBT_VSCROLL: + fTrue = (rcPosArea.top - fFace) * fFactWidth / (rcPosArea.top - rcPosArea.bottom); + break; + } + + return fTrue; +} + +void CPWL_ScrollBar::CreateChildWnd(const PWL_CREATEPARAM & cp) +{ + CreateButtons(cp); +} + +void CPWL_ScrollBar::TimerProc() +{ + PWL_SCROLL_PRIVATEDATA sTemp = m_sData; + + if (m_bMinOrMax)m_sData.SubSmall(); + else m_sData.AddSmall(); + + if (FXSYS_memcmp(&m_sData, &sTemp, sizeof(PWL_SCROLL_PRIVATEDATA)) != 0) + { + MovePosButton(TRUE); + NotifyScrollWindow(); + } +} + +/* +void CPWL_ScrollBar::OnSetFocus() +{ + if (GetTransparency() != 255) + { + SetTransparency(255); + InvalidateRect(); + } +} + +void CPWL_ScrollBar::OnKillFocus() +{ + if (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY) + { + SetTransparency(PWL_SCROLLBAR_TRANSPARANCY); + InvalidateRect(); + } +} +*/ + diff --git a/fpdfsdk/src/pdfwindow/PWL_Signature.cpp b/fpdfsdk/src/pdfwindow/PWL_Signature.cpp index 36297f3d92..5d79ce9cab 100644 --- a/fpdfsdk/src/pdfwindow/PWL_Signature.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_Signature.cpp @@ -1,220 +1,220 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_Icon.h"
-#include "../../include/pdfwindow/PWL_Signature.h"
-#include "../../include/pdfwindow/PWL_Label.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-
-/* --------------------------------- CPWL_Signature_Image --------------------------------- */
-
-CPWL_Signature_Image::CPWL_Signature_Image() : m_pImage(NULL)
-{
-}
-
-CPWL_Signature_Image::~CPWL_Signature_Image()
-{
-}
-
-void CPWL_Signature_Image::SetImage(CFX_DIBSource* pImage)
-{
- m_pImage = pImage;
-}
-
-CFX_DIBSource* CPWL_Signature_Image::GetImage()
-{
- return m_pImage;
-}
-
-void CPWL_Signature_Image::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
-
- if (m_pImage)
- {
- CPDF_Rect rcClient = GetClientRect();
-
- FX_FLOAT x, y;
- pUser2Device->Transform(rcClient.left, rcClient.top, x, y);
-
- pDevice->StretchDIBits(m_pImage, (FX_INT32)x, (FX_INT32)y,
- (FX_INT32)rcClient.Width(), (FX_INT32)rcClient.Height());
- }
-}
-
-void CPWL_Signature_Image::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
-{
- sAppStream << CPWL_Image::GetImageAppStream();
-}
-
-void CPWL_Signature_Image::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale)
-{
- FX_FLOAT fImageW, fImageH;
-
- GetImageSize(fImageW, fImageH);
-
- CPDF_Rect rcClient = GetClientRect();
-
- fHScale = rcClient.Width() / fImageW;
- fVScale = rcClient.Height() / fImageH;
-}
-
-/* --------------------------------- CPWL_Signature --------------------------------- */
-
-CPWL_Signature::CPWL_Signature() :
- m_pText(NULL),
- m_pDescription(NULL),
- m_pImage(NULL),
- m_bTextExist(TRUE),
- m_bImageExist(FALSE),
- m_bFlagExist(TRUE)
-{
-}
-
-CPWL_Signature::~CPWL_Signature()
-{
-}
-
-void CPWL_Signature::SetTextFlag(FX_BOOL bTextExist)
-{
- m_bTextExist = bTextExist;
-
- RePosChildWnd();
-}
-
-void CPWL_Signature::SetImageFlag(FX_BOOL bImageExist)
-{
- m_bImageExist = bImageExist;
-
- RePosChildWnd();
-}
-
-void CPWL_Signature::SetFoxitFlag(FX_BOOL bFlagExist)
-{
- m_bFlagExist = bFlagExist;
-}
-
-void CPWL_Signature::SetText(FX_LPCWSTR sText)
-{
- m_pText->SetText(sText);
-
- RePosChildWnd();
-}
-
-void CPWL_Signature::SetDescription(FX_LPCWSTR string)
-{
- m_pDescription->SetText(string);
-
- RePosChildWnd();
-}
-
-void CPWL_Signature::SetImage(CFX_DIBSource* pImage)
-{
- m_pImage->SetImage(pImage);
-
- RePosChildWnd();
-}
-
-void CPWL_Signature::SetImageStream(CPDF_Stream * pStream, FX_LPCSTR sImageAlias)
-{
- m_pImage->SetPDFStream(pStream);
- m_pImage->SetImageAlias(sImageAlias);
-
- RePosChildWnd();
-}
-
-void CPWL_Signature::RePosChildWnd()
-{
- CPDF_Rect rcClient = GetClientRect();
-
- CPDF_Rect rcText = rcClient;
- CPDF_Rect rcDescription = rcClient;
-
- FX_BOOL bTextVisible = m_bTextExist && m_pText->GetText().GetLength() > 0;
-
- if ((bTextVisible || m_bImageExist) &&
- m_pDescription->GetText().GetLength() > 0)
- {
- if (rcClient.Width() >= rcClient.Height())
- {
- rcText.right = rcText.left + rcClient.Width() / 2.0f;
- rcDescription.left = rcDescription.right - rcClient.Width() / 2.0f;
- }
- else
- {
- rcText.bottom = rcText.top - rcClient.Height() / 2.0f;
- rcDescription.top = rcDescription.bottom + rcClient.Height() / 2.0f;
- }
- }
-
- m_pText->SetVisible(bTextVisible);
- m_pImage->SetVisible(m_bImageExist);
-
- m_pText->Move(rcText, TRUE, FALSE);
- m_pImage->Move(rcText, TRUE, FALSE);
- m_pDescription->Move(rcDescription, TRUE, FALSE);
-}
-
-void CPWL_Signature::CreateChildWnd(const PWL_CREATEPARAM & cp)
-{
- m_pImage = new CPWL_Signature_Image;
- PWL_CREATEPARAM icp = cp;
- icp.pParentWnd = this;
- icp.dwFlags = PWS_CHILD | PWS_VISIBLE;
- icp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);
- m_pImage->Create(icp);
-
- m_pText = new CPWL_Label;
- PWL_CREATEPARAM acp = cp;
- acp.pParentWnd = this;
- acp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_AUTOFONTSIZE | PES_MULTILINE | PES_AUTORETURN | PES_MIDDLE | PES_CENTER;
- acp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);
- m_pText->Create(acp);
-
- m_pDescription = new CPWL_Label;
- PWL_CREATEPARAM dcp = cp;
- dcp.pParentWnd = this;
- dcp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_AUTOFONTSIZE | PES_MULTILINE | PES_AUTORETURN | PES_LEFT | PES_CENTER;
- dcp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);
- m_pDescription->Create(dcp);
-}
-
-void CPWL_Signature::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
-
- if (m_bFlagExist)
- CPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, PWL_ICONTYPE_FOXIT, CPWL_Utils::GetCenterSquare(GetClientRect()),
- CPWL_Color(COLORTYPE_RGB,0.91f,0.855f,0.92f), CPWL_Color(COLORTYPE_TRANSPARENT), 255);
-
- /*
- CPDF_Rect rcClient = GetClientRect();
-
- CFX_PathData path;
-
- path.SetPointCount(2);
- path.SetPoint(0, rcClient.left, (rcClient.top + rcClient.bottom) * 0.5f, FXPT_MOVETO);
- path.SetPoint(1, rcClient.right, (rcClient.top + rcClient.bottom) * 0.5f, FXPT_LINETO);
-
- CFX_GraphStateData gsd;
- gsd.SetDashCount(2);
- gsd.m_DashArray[0] = 6.0f;
- gsd.m_DashArray[1] = 6.0f;
- gsd.m_DashPhase = 0;
-
- gsd.m_LineWidth = 10.0f;
- pDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255,255,0,0), FXFILL_ALTERNATE);
- */
-}
-
-void CPWL_Signature::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
-{
- CPWL_Wnd::GetThisAppearanceStream(sAppStream);
-}
-
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_Icon.h" +#include "../../include/pdfwindow/PWL_Signature.h" +#include "../../include/pdfwindow/PWL_Label.h" +#include "../../include/pdfwindow/PWL_Utils.h" + +/* --------------------------------- CPWL_Signature_Image --------------------------------- */ + +CPWL_Signature_Image::CPWL_Signature_Image() : m_pImage(NULL) +{ +} + +CPWL_Signature_Image::~CPWL_Signature_Image() +{ +} + +void CPWL_Signature_Image::SetImage(CFX_DIBSource* pImage) +{ + m_pImage = pImage; +} + +CFX_DIBSource* CPWL_Signature_Image::GetImage() +{ + return m_pImage; +} + +void CPWL_Signature_Image::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); + + if (m_pImage) + { + CPDF_Rect rcClient = GetClientRect(); + + FX_FLOAT x, y; + pUser2Device->Transform(rcClient.left, rcClient.top, x, y); + + pDevice->StretchDIBits(m_pImage, (FX_INT32)x, (FX_INT32)y, + (FX_INT32)rcClient.Width(), (FX_INT32)rcClient.Height()); + } +} + +void CPWL_Signature_Image::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream) +{ + sAppStream << CPWL_Image::GetImageAppStream(); +} + +void CPWL_Signature_Image::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale) +{ + FX_FLOAT fImageW, fImageH; + + GetImageSize(fImageW, fImageH); + + CPDF_Rect rcClient = GetClientRect(); + + fHScale = rcClient.Width() / fImageW; + fVScale = rcClient.Height() / fImageH; +} + +/* --------------------------------- CPWL_Signature --------------------------------- */ + +CPWL_Signature::CPWL_Signature() : + m_pText(NULL), + m_pDescription(NULL), + m_pImage(NULL), + m_bTextExist(TRUE), + m_bImageExist(FALSE), + m_bFlagExist(TRUE) +{ +} + +CPWL_Signature::~CPWL_Signature() +{ +} + +void CPWL_Signature::SetTextFlag(FX_BOOL bTextExist) +{ + m_bTextExist = bTextExist; + + RePosChildWnd(); +} + +void CPWL_Signature::SetImageFlag(FX_BOOL bImageExist) +{ + m_bImageExist = bImageExist; + + RePosChildWnd(); +} + +void CPWL_Signature::SetFoxitFlag(FX_BOOL bFlagExist) +{ + m_bFlagExist = bFlagExist; +} + +void CPWL_Signature::SetText(FX_LPCWSTR sText) +{ + m_pText->SetText(sText); + + RePosChildWnd(); +} + +void CPWL_Signature::SetDescription(FX_LPCWSTR string) +{ + m_pDescription->SetText(string); + + RePosChildWnd(); +} + +void CPWL_Signature::SetImage(CFX_DIBSource* pImage) +{ + m_pImage->SetImage(pImage); + + RePosChildWnd(); +} + +void CPWL_Signature::SetImageStream(CPDF_Stream * pStream, FX_LPCSTR sImageAlias) +{ + m_pImage->SetPDFStream(pStream); + m_pImage->SetImageAlias(sImageAlias); + + RePosChildWnd(); +} + +void CPWL_Signature::RePosChildWnd() +{ + CPDF_Rect rcClient = GetClientRect(); + + CPDF_Rect rcText = rcClient; + CPDF_Rect rcDescription = rcClient; + + FX_BOOL bTextVisible = m_bTextExist && m_pText->GetText().GetLength() > 0; + + if ((bTextVisible || m_bImageExist) && + m_pDescription->GetText().GetLength() > 0) + { + if (rcClient.Width() >= rcClient.Height()) + { + rcText.right = rcText.left + rcClient.Width() / 2.0f; + rcDescription.left = rcDescription.right - rcClient.Width() / 2.0f; + } + else + { + rcText.bottom = rcText.top - rcClient.Height() / 2.0f; + rcDescription.top = rcDescription.bottom + rcClient.Height() / 2.0f; + } + } + + m_pText->SetVisible(bTextVisible); + m_pImage->SetVisible(m_bImageExist); + + m_pText->Move(rcText, TRUE, FALSE); + m_pImage->Move(rcText, TRUE, FALSE); + m_pDescription->Move(rcDescription, TRUE, FALSE); +} + +void CPWL_Signature::CreateChildWnd(const PWL_CREATEPARAM & cp) +{ + m_pImage = new CPWL_Signature_Image; + PWL_CREATEPARAM icp = cp; + icp.pParentWnd = this; + icp.dwFlags = PWS_CHILD | PWS_VISIBLE; + icp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0); + m_pImage->Create(icp); + + m_pText = new CPWL_Label; + PWL_CREATEPARAM acp = cp; + acp.pParentWnd = this; + acp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_AUTOFONTSIZE | PES_MULTILINE | PES_AUTORETURN | PES_MIDDLE | PES_CENTER; + acp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0); + m_pText->Create(acp); + + m_pDescription = new CPWL_Label; + PWL_CREATEPARAM dcp = cp; + dcp.pParentWnd = this; + dcp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_AUTOFONTSIZE | PES_MULTILINE | PES_AUTORETURN | PES_LEFT | PES_CENTER; + dcp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0); + m_pDescription->Create(dcp); +} + +void CPWL_Signature::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); + + if (m_bFlagExist) + CPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, PWL_ICONTYPE_FOXIT, CPWL_Utils::GetCenterSquare(GetClientRect()), + CPWL_Color(COLORTYPE_RGB,0.91f,0.855f,0.92f), CPWL_Color(COLORTYPE_TRANSPARENT), 255); + + /* + CPDF_Rect rcClient = GetClientRect(); + + CFX_PathData path; + + path.SetPointCount(2); + path.SetPoint(0, rcClient.left, (rcClient.top + rcClient.bottom) * 0.5f, FXPT_MOVETO); + path.SetPoint(1, rcClient.right, (rcClient.top + rcClient.bottom) * 0.5f, FXPT_LINETO); + + CFX_GraphStateData gsd; + gsd.SetDashCount(2); + gsd.m_DashArray[0] = 6.0f; + gsd.m_DashArray[1] = 6.0f; + gsd.m_DashPhase = 0; + + gsd.m_LineWidth = 10.0f; + pDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255,255,0,0), FXFILL_ALTERNATE); + */ +} + +void CPWL_Signature::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream) +{ + CPWL_Wnd::GetThisAppearanceStream(sAppStream); +} + + diff --git a/fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp b/fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp index aabf503f98..287fec1a55 100644 --- a/fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp @@ -1,110 +1,110 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_Button.h"
-#include "../../include/pdfwindow/PWL_SpecialButton.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-
-/* --------------------------- CPWL_PushButton ---------------------------- */
-
-CPWL_PushButton::CPWL_PushButton()
-{
-}
-
-CPWL_PushButton::~CPWL_PushButton()
-{
-}
-
-CFX_ByteString CPWL_PushButton::GetClassName() const
-{
- return "CPWL_PushButton";
-}
-
-CPDF_Rect CPWL_PushButton::GetFocusRect() const
-{
- return CPWL_Utils::DeflateRect(this->GetWindowRect(),(FX_FLOAT)GetBorderWidth());
-}
-
-/* --------------------------- CPWL_CheckBox ---------------------------- */
-
-CPWL_CheckBox::CPWL_CheckBox() : m_bChecked(FALSE)
-{
-}
-
-CPWL_CheckBox::~CPWL_CheckBox()
-{
-}
-
-CFX_ByteString CPWL_CheckBox::GetClassName() const
-{
- return "CPWL_CheckBox";
-}
-
-void CPWL_CheckBox::SetCheck(FX_BOOL bCheck)
-{
- m_bChecked = bCheck;
-}
-
-FX_BOOL CPWL_CheckBox::IsChecked() const
-{
- return m_bChecked;
-}
-
-FX_BOOL CPWL_CheckBox::OnLButtonUp(const CPDF_Point & point)
-{
- if (IsReadOnly()) return FALSE;
-
- SetCheck(!IsChecked());
- return TRUE;
-}
-
-FX_BOOL CPWL_CheckBox::OnChar(FX_WORD nChar)
-{
- SetCheck(!IsChecked());
- return TRUE;
-}
-
-/* --------------------------- CPWL_RadioButton ---------------------------- */
-
-CPWL_RadioButton::CPWL_RadioButton() : m_bChecked(FALSE)
-{
-}
-
-CPWL_RadioButton::~CPWL_RadioButton()
-{
-}
-
-CFX_ByteString CPWL_RadioButton::GetClassName() const
-{
- return "CPWL_RadioButton";
-}
-
-FX_BOOL CPWL_RadioButton::OnLButtonUp(const CPDF_Point & point)
-{
- if (IsReadOnly()) return FALSE;
-
- SetCheck(TRUE);
- return TRUE;
-}
-
-void CPWL_RadioButton::SetCheck(FX_BOOL bCheck)
-{
- m_bChecked = bCheck;
-}
-
-FX_BOOL CPWL_RadioButton::IsChecked() const
-{
- return m_bChecked;
-}
-
-FX_BOOL CPWL_RadioButton::OnChar(FX_WORD nChar)
-{
- SetCheck(TRUE);
- return TRUE;
-}
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_Button.h" +#include "../../include/pdfwindow/PWL_SpecialButton.h" +#include "../../include/pdfwindow/PWL_Utils.h" + +/* --------------------------- CPWL_PushButton ---------------------------- */ + +CPWL_PushButton::CPWL_PushButton() +{ +} + +CPWL_PushButton::~CPWL_PushButton() +{ +} + +CFX_ByteString CPWL_PushButton::GetClassName() const +{ + return "CPWL_PushButton"; +} + +CPDF_Rect CPWL_PushButton::GetFocusRect() const +{ + return CPWL_Utils::DeflateRect(this->GetWindowRect(),(FX_FLOAT)GetBorderWidth()); +} + +/* --------------------------- CPWL_CheckBox ---------------------------- */ + +CPWL_CheckBox::CPWL_CheckBox() : m_bChecked(FALSE) +{ +} + +CPWL_CheckBox::~CPWL_CheckBox() +{ +} + +CFX_ByteString CPWL_CheckBox::GetClassName() const +{ + return "CPWL_CheckBox"; +} + +void CPWL_CheckBox::SetCheck(FX_BOOL bCheck) +{ + m_bChecked = bCheck; +} + +FX_BOOL CPWL_CheckBox::IsChecked() const +{ + return m_bChecked; +} + +FX_BOOL CPWL_CheckBox::OnLButtonUp(const CPDF_Point & point) +{ + if (IsReadOnly()) return FALSE; + + SetCheck(!IsChecked()); + return TRUE; +} + +FX_BOOL CPWL_CheckBox::OnChar(FX_WORD nChar) +{ + SetCheck(!IsChecked()); + return TRUE; +} + +/* --------------------------- CPWL_RadioButton ---------------------------- */ + +CPWL_RadioButton::CPWL_RadioButton() : m_bChecked(FALSE) +{ +} + +CPWL_RadioButton::~CPWL_RadioButton() +{ +} + +CFX_ByteString CPWL_RadioButton::GetClassName() const +{ + return "CPWL_RadioButton"; +} + +FX_BOOL CPWL_RadioButton::OnLButtonUp(const CPDF_Point & point) +{ + if (IsReadOnly()) return FALSE; + + SetCheck(TRUE); + return TRUE; +} + +void CPWL_RadioButton::SetCheck(FX_BOOL bCheck) +{ + m_bChecked = bCheck; +} + +FX_BOOL CPWL_RadioButton::IsChecked() const +{ + return m_bChecked; +} + +FX_BOOL CPWL_RadioButton::OnChar(FX_WORD nChar) +{ + SetCheck(TRUE); + return TRUE; +} + diff --git a/fpdfsdk/src/pdfwindow/PWL_Utils.cpp b/fpdfsdk/src/pdfwindow/PWL_Utils.cpp index aec1d4db45..1de6b56d5e 100644 --- a/fpdfsdk/src/pdfwindow/PWL_Utils.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_Utils.cpp @@ -1,2844 +1,2844 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-#include "../../include/pdfwindow/PWL_Icon.h"
-
-#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
-#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb))
-
-/* ---------------------------- CPWL_Utils ------------------------------ */
-
-CFX_ByteString CPWL_Utils::GetAppStreamFromArray(const CPWL_PathData* pPathData, FX_INT32 nCount)
-{
- CFX_ByteTextBuf csAP;
-
- for (FX_INT32 i=0; i<nCount; i++)
- {
- switch (pPathData[i].type)
- {
- case PWLPT_MOVETO:
- csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " m\n";
- break;
- case PWLPT_LINETO:
- csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " l\n";
- break;
- case PWLPT_BEZIERTO:
- csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " "
- << pPathData[i+1].point.x << " " << pPathData[i+1].point.y << " "
- << pPathData[i+2].point.x << " " << pPathData[i+2].point.y << " c\n";
-
- i += 2;
- break;
- default:
- break;
- }
- }
-
- return csAP.GetByteString();
-}
-
-void CPWL_Utils::GetPathDataFromArray(CFX_PathData& path, const CPWL_PathData* pPathData, FX_INT32 nCount)
-{
- path.SetPointCount(nCount);
-
- for (FX_INT32 i=0; i<nCount; i++)
- {
- switch (pPathData[i].type)
- {
- case PWLPT_MOVETO:
- path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_MOVETO);
- break;
- case PWLPT_LINETO:
- path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_LINETO);
- break;
- case PWLPT_BEZIERTO:
- path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_BEZIERTO);
- break;
- default:
- break;
- }
- }
-}
-
-
-CPDF_Rect CPWL_Utils::MaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2)
-{
- CPDF_Rect rcRet;
-
- rcRet.left = PWL_MIN(rect1.left,rect2.left);
- rcRet.bottom = PWL_MIN(rect1.bottom,rect2.bottom);
- rcRet.right = PWL_MAX(rect1.right,rect2.right);
- rcRet.top = PWL_MAX(rect1.top,rect2.top);
-
- return rcRet;
-}
-
-CPDF_Rect CPWL_Utils::OffsetRect(const CPDF_Rect & rect,FX_FLOAT x,FX_FLOAT y)
-{
- return CPDF_Rect(rect.left + x,rect.bottom + y,
- rect.right + x,rect.top + y);
-}
-
-FX_BOOL CPWL_Utils::ContainsRect(const CPDF_Rect& rcParent, const CPDF_Rect& rcChild)
-{
- return rcChild.left >= rcParent.left && rcChild.bottom >= rcParent.bottom &&
- rcChild.right <= rcParent.right && rcChild.top <= rcParent.top;
-}
-
-FX_BOOL CPWL_Utils::IntersectRect(const CPDF_Rect& rect1, const CPDF_Rect& rect2)
-{
- FX_FLOAT left = rect1.left > rect2.left ? rect1.left : rect2.left;
- FX_FLOAT right = rect1.right < rect2.right ? rect1.right : rect2.right;
- FX_FLOAT bottom = rect1.bottom > rect2.bottom ? rect1.bottom : rect2.bottom;
- FX_FLOAT top = rect1.top < rect2.top ? rect1.top : rect2.top;
-
- return left < right && bottom < top;
-}
-
-CPDF_Point CPWL_Utils::OffsetPoint(const CPDF_Point& point,FX_FLOAT x,FX_FLOAT y)
-{
- return CPDF_Point(point.x + x,point.y + y);
-}
-
-CPVT_WordRange CPWL_Utils::OverlapWordRange(const CPVT_WordRange & wr1, const CPVT_WordRange & wr2)
-{
- CPVT_WordRange wrRet;
-
- if (wr2.EndPos.WordCmp(wr1.BeginPos) < 0 || wr2.BeginPos.WordCmp(wr1.EndPos) > 0) return wrRet;
- if (wr1.EndPos.WordCmp(wr2.BeginPos) < 0 || wr1.BeginPos.WordCmp(wr2.EndPos) > 0) return wrRet;
-
- if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0)
- {
- wrRet.BeginPos = wr2.BeginPos;
- }
- else
- {
- wrRet.BeginPos = wr1.BeginPos;
- }
-
- if (wr1.EndPos.WordCmp(wr2.EndPos) < 0)
- {
- wrRet.EndPos = wr1.EndPos;
- }
- else
- {
- wrRet.EndPos = wr2.EndPos;
- }
-
- return wrRet;
-}
-
-CFX_ByteString CPWL_Utils::GetAP_Check(const CPDF_Rect & crBBox)
-{
- CFX_ByteTextBuf csAP;
-
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- const FX_INT32 num = 8;
-
- CPWL_Point pts[num*3] =
- {
- //1
- CPWL_Point(0.28f, 0.52f),
- CPWL_Point(0.27f, 0.48f),
- CPWL_Point(0.29f, 0.40f),
-
- //2
- CPWL_Point(0.30f, 0.33f),
- CPWL_Point(0.31f, 0.29f),
- CPWL_Point(0.31f, 0.28f),
-
- //3
- CPWL_Point(0.39f, 0.28f),
- CPWL_Point(0.49f, 0.29f),
- CPWL_Point(0.77f, 0.67f),
-
- //4
- CPWL_Point(0.76f, 0.68f),
- CPWL_Point(0.78f, 0.69f),
- CPWL_Point(0.76f, 0.75f),
-
- //5
- CPWL_Point(0.76f, 0.75f),
- CPWL_Point(0.73f, 0.80f),
- CPWL_Point(0.68f, 0.75f),
-
- //6
- CPWL_Point(0.68f, 0.74f),
- CPWL_Point(0.68f, 0.74f),
- CPWL_Point(0.44f, 0.47f),
-
- //7
- CPWL_Point(0.43f, 0.47f),
- CPWL_Point(0.40f, 0.47f),
- CPWL_Point(0.41f, 0.58f),
-
- //8
- CPWL_Point(0.40f, 0.60f),
- CPWL_Point(0.28f, 0.66f),
- CPWL_Point(0.30f, 0.56f)
- };
-
- for (FX_INT32 j=0; j<num*3; j++)
- {
- pts[j].x *= fWidth;
- pts[j].x += crBBox.left;
-
- pts[j].y *= fHeight;
- pts[j].y += crBBox.bottom;
- }
-
- csAP << pts[0].x << " " << pts[0].y << " m\n";
-
- for (FX_INT32 i=0; i<num; i++)
- {
- FX_INT32 nCur = i*3;
- FX_INT32 n1 = i*3 + 1;
- FX_INT32 n2 = i*3 + 2;
- FX_INT32 nNext = (i < num-1 ? (i+1)*3 : 0);
-
- FX_FLOAT px1 = pts[n1].x - pts[nCur].x;
- FX_FLOAT py1 = pts[n1].y - pts[nCur].y;
- FX_FLOAT px2 = pts[n2].x - pts[nNext].x;
- FX_FLOAT py2 = pts[n2].y - pts[nNext].y;
-
- csAP << pts[nCur].x + px1 * PWL_BEZIER << " " << pts[nCur].y + py1 * PWL_BEZIER << " "
- << pts[nNext].x + px2 * PWL_BEZIER << " " << pts[nNext].y + py2 * PWL_BEZIER << " "
- << pts[nNext].x << " " << pts[nNext].y << " c\n";
- }
-
- return csAP.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetAP_Circle(const CPDF_Rect & crBBox)
-{
- CFX_ByteTextBuf csAP;
-
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPDF_Point pt1(crBBox.left,crBBox.bottom + fHeight / 2);
- CPDF_Point pt2(crBBox.left + fWidth / 2,crBBox.top);
- CPDF_Point pt3(crBBox.right,crBBox.bottom + fHeight / 2);
- CPDF_Point pt4(crBBox.left + fWidth / 2,crBBox.bottom);
-
- csAP << pt1.x << " " << pt1.y << " m\n";
-
- FX_FLOAT px = pt2.x - pt1.x;
- FX_FLOAT py = pt2.y - pt1.y;
-
- csAP << pt1.x << " " << pt1.y + py * PWL_BEZIER << " "
- << pt2.x - px * PWL_BEZIER << " " << pt2.y << " "
- << pt2.x << " " << pt2.y << " c\n";
-
- px = pt3.x - pt2.x;
- py = pt2.y - pt3.y;
-
- csAP << pt2.x + px * PWL_BEZIER << " " << pt2.y << " "
- << pt3.x << " " << pt3.y + py * PWL_BEZIER << " "
- << pt3.x << " " << pt3.y << " c\n";
-
- px = pt3.x - pt4.x;
- py = pt3.y - pt4.y;
-
- csAP << pt3.x << " " << pt3.y - py * PWL_BEZIER << " "
- << pt4.x + px * PWL_BEZIER << " " << pt4.y << " "
- << pt4.x << " " << pt4.y << " c\n";
-
- px = pt4.x - pt1.x;
- py = pt1.y - pt4.y;
-
- csAP << pt4.x - px * PWL_BEZIER << " " << pt4.y << " "
- << pt1.x << " " << pt1.y - py * PWL_BEZIER << " "
- << pt1.x << " " << pt1.y << " c\n";
-
- return csAP.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetAP_Cross(const CPDF_Rect & crBBox)
-{
- CFX_ByteTextBuf csAP;
-
- csAP << crBBox.left << " " << crBBox.top << " m\n";
- csAP << crBBox.right << " " << crBBox.bottom << " l\n";
- csAP << crBBox.left << " " << crBBox.bottom << " m\n";
- csAP << crBBox.right << " " << crBBox.top << " l\n";
-
- return csAP.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetAP_Diamond(const CPDF_Rect & crBBox)
-{
- CFX_ByteTextBuf csAP;
-
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPDF_Point pt1(crBBox.left,crBBox.bottom + fHeight / 2);
- CPDF_Point pt2(crBBox.left + fWidth / 2,crBBox.top);
- CPDF_Point pt3(crBBox.right,crBBox.bottom + fHeight / 2);
- CPDF_Point pt4(crBBox.left + fWidth / 2,crBBox.bottom);
-
- csAP << pt1.x << " " << pt1.y << " m\n";
- csAP << pt2.x << " " << pt2.y << " l\n";
- csAP << pt3.x << " " << pt3.y << " l\n";
- csAP << pt4.x << " " << pt4.y << " l\n";
- csAP << pt1.x << " " << pt1.y << " l\n";
-
- return csAP.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetAP_Square(const CPDF_Rect & crBBox)
-{
- CFX_ByteTextBuf csAP;
-
- csAP << crBBox.left << " " << crBBox.top << " m\n";
- csAP << crBBox.right << " " << crBBox.top << " l\n";
- csAP << crBBox.right << " " << crBBox.bottom << " l\n";
- csAP << crBBox.left << " " << crBBox.bottom << " l\n";
- csAP << crBBox.left << " " << crBBox.top << " l\n";
-
- return csAP.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetAP_Star(const CPDF_Rect & crBBox)
-{
- CFX_ByteTextBuf csAP;
-
- FX_FLOAT fRadius = (crBBox.top - crBBox.bottom)/(1+(FX_FLOAT)cos(PWL_PI/5.0f));
- CPDF_Point ptCenter = CPDF_Point((crBBox.left + crBBox.right) / 2.0f,(crBBox.top + crBBox.bottom) / 2.0f);
-
- FX_FLOAT px[5],py[5];
-
- FX_FLOAT fAngel = PWL_PI/10.0f;
-
- for (FX_INT32 i=0; i<5; i++)
- {
- px[i] = ptCenter.x + fRadius * (FX_FLOAT)cos(fAngel);
- py[i] = ptCenter.y + fRadius * (FX_FLOAT)sin(fAngel);
-
- fAngel += PWL_PI * 2 / 5.0f;
- }
-
- csAP << px[0] << " " << py[0] << " m\n";
-
- FX_INT32 nNext = 0;
- for (FX_INT32 j=0; j<5; j++)
- {
- nNext += 2;
- if (nNext >= 5) nNext -= 5;
- csAP << px[nNext] << " " << py[nNext] << " l\n";
- }
-
- return csAP.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetAP_HalfCircle(const CPDF_Rect & crBBox,FX_FLOAT fRotate)
-{
- CFX_ByteTextBuf csAP;
-
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPDF_Point pt1(-fWidth/2,0);
- CPDF_Point pt2(0,fHeight/2);
- CPDF_Point pt3(fWidth/2,0);
-
- FX_FLOAT px,py;
-
- csAP << cos(fRotate) << " " << sin(fRotate) << " " << -sin(fRotate) << " " << cos(fRotate) << " "
- << crBBox.left + fWidth / 2 << " " << crBBox.bottom + fHeight / 2 << " cm\n";
-
-
- csAP << pt1.x << " " << pt1.y << " m\n";
-
- px = pt2.x - pt1.x;
- py = pt2.y - pt1.y;
-
- csAP << pt1.x << " " << pt1.y + py * PWL_BEZIER << " "
- << pt2.x - px * PWL_BEZIER << " " << pt2.y << " "
- << pt2.x << " " << pt2.y << " c\n";
-
- px = pt3.x - pt2.x;
- py = pt2.y - pt3.y;
-
- csAP << pt2.x + px * PWL_BEZIER << " " << pt2.y << " "
- << pt3.x << " " << pt3.y + py * PWL_BEZIER << " "
- << pt3.x << " " << pt3.y << " c\n";
-
- return csAP.GetByteString();
-}
-
-
-CPDF_Rect CPWL_Utils::InflateRect(const CPDF_Rect & rcRect, FX_FLOAT fSize)
-{
- if (rcRect.IsEmpty()) return rcRect;
-
- CPDF_Rect rcNew(rcRect.left - fSize,
- rcRect.bottom - fSize,
- rcRect.right + fSize,
- rcRect.top + fSize);
- rcNew.Normalize();
- return rcNew;
-}
-
-CPDF_Rect CPWL_Utils::DeflateRect(const CPDF_Rect & rcRect, FX_FLOAT fSize)
-{
- if (rcRect.IsEmpty()) return rcRect;
-
- CPDF_Rect rcNew(rcRect.left + fSize,
- rcRect.bottom + fSize,
- rcRect.right - fSize,
- rcRect.top - fSize);
- rcNew.Normalize();
- return rcNew;
-}
-
-CPDF_Rect CPWL_Utils::ScaleRect(const CPDF_Rect & rcRect,FX_FLOAT fScale)
-{
- FX_FLOAT fHalfWidth = (rcRect.right - rcRect.left) / 2.0f;
- FX_FLOAT fHalfHeight = (rcRect.top - rcRect.bottom) / 2.0f;
-
- CPDF_Point ptCenter = CPDF_Point((rcRect.left + rcRect.right) / 2,(rcRect.top + rcRect.bottom) / 2);
-
- return CPDF_Rect(ptCenter.x - fHalfWidth * fScale,
- ptCenter.y - fHalfHeight * fScale,
- ptCenter.x + fHalfWidth * fScale,
- ptCenter.y + fHalfHeight * fScale);
-}
-
-CFX_ByteString CPWL_Utils::GetRectFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color)
-{
- CFX_ByteTextBuf sAppStream;
-
- CFX_ByteString sColor = GetColorAppStream(color,TRUE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << "q\n" << sColor;
- sAppStream << rect.left << " " << rect.bottom << " "
- << rect.right - rect.left << " " << rect.top - rect.bottom << " re f\nQ\n";
- }
-
- return sAppStream.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetCircleFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color)
-{
- CFX_ByteTextBuf sAppStream;
-
- CFX_ByteString sColor = GetColorAppStream(color,TRUE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << "q\n" << sColor << CPWL_Utils::GetAP_Circle(rect) << "f\nQ\n";
- }
-
- return sAppStream.GetByteString();
-}
-
-CPDF_Rect CPWL_Utils::GetCenterSquare(const CPDF_Rect & rect)
-{
- FX_FLOAT fWidth = rect.right - rect.left;
- FX_FLOAT fHeight = rect.top - rect.bottom;
-
- FX_FLOAT fCenterX = (rect.left + rect.right)/2.0f;
- FX_FLOAT fCenterY = (rect.top + rect.bottom)/2.0f;
-
- FX_FLOAT fRadius = (fWidth > fHeight) ? fHeight / 2 : fWidth / 2;
-
- return CPDF_Rect(fCenterX - fRadius,fCenterY - fRadius,fCenterX + fRadius,fCenterY + fRadius);
-}
-
-CFX_ByteString CPWL_Utils::GetEditAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, const CPVT_WordRange * pRange,
- FX_BOOL bContinuous, FX_WORD SubWord)
-{
- return IFX_Edit::GetEditAppearanceStream(pEdit,ptOffset,pRange,bContinuous,SubWord);
-}
-
-CFX_ByteString CPWL_Utils::GetEditSelAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset,
- const CPVT_WordRange * pRange)
-{
- return IFX_Edit::GetSelectAppearanceStream(pEdit,ptOffset,pRange);
-}
-
-static CFX_ByteString GetSquigglyAppearanceStream(FX_FLOAT fStartX, FX_FLOAT fEndX, FX_FLOAT fY, FX_FLOAT fStep)
-{
- CFX_ByteTextBuf sRet;
-
- sRet << "0 w\n" << fStartX << " " << fY << " m\n";
-
- FX_FLOAT fx;
- FX_INT32 i;
-
- for (i=1,fx=fStartX+fStep; fx<fEndX; fx+=fStep,i++)
- {
- sRet << fx << " " << fY + (i&1)*fStep << " l\n";
- }
-
- sRet << "S\n";
-
- return sRet.GetByteString();
-}
-
-static CFX_ByteString GetWordSpellCheckAppearanceStream(IFX_Edit_Iterator* pIterator, const CPDF_Point & ptOffset,
- const CPVT_WordRange & wrWord)
-{
- CFX_ByteTextBuf sRet;
-
- FX_FLOAT fStartX = 0.0f;
- FX_FLOAT fEndX = 0.0f;
- FX_FLOAT fY = 0.0f;
- FX_FLOAT fStep = 0.0f;
-
- FX_BOOL bBreak = FALSE;
-
- if (pIterator)
- {
- pIterator->SetAt(wrWord.BeginPos);
-
- do
- {
- CPVT_WordPlace place = pIterator->GetAt();
-
- CPVT_Line line;
- if (pIterator->GetLine(line))
- {
- fY = line.ptLine.y;
- fStep = (line.fLineAscent - line.fLineDescent) / 16.0f;
- }
-
- if (place.LineCmp(wrWord.BeginPos) == 0)
- {
- pIterator->SetAt(wrWord.BeginPos);
- CPVT_Word word;
- if (pIterator->GetWord(word))
- {
- fStartX = word.ptWord.x;
- }
- }
- else
- {
- fStartX = line.ptLine.x;
- }
-
- if (place.LineCmp(wrWord.EndPos) == 0)
- {
- pIterator->SetAt(wrWord.EndPos);
- CPVT_Word word;
- if (pIterator->GetWord(word))
- {
- fEndX = word.ptWord.x + word.fWidth;
- }
-
- bBreak = TRUE;
- }
- else
- {
- fEndX = line.ptLine.x + line.fLineWidth;
- }
-
- sRet << GetSquigglyAppearanceStream(fStartX + ptOffset.x, fEndX + ptOffset.x, fY + ptOffset.y,fStep);
-
- if (bBreak) break;
- }
- while (pIterator->NextLine());
- }
-
- return sRet.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetSpellCheckAppStream(IFX_Edit* pEdit, IPWL_SpellCheck* pSpellCheck, const CPDF_Point & ptOffset,
- const CPVT_WordRange * pRange)
-{
- ASSERT(pEdit != NULL);
- ASSERT(pSpellCheck != NULL);
-
- CFX_ByteTextBuf sRet;
-
- if (pRange && pRange->IsExist())
- {
- if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
- {
- pIterator->SetAt(pRange->BeginPos);
-
- FX_BOOL bLatinWord = FALSE;
- CPVT_WordPlace wpWordStart;
- CFX_ByteString sWord;
-
- CPVT_WordPlace oldplace;
- while (pIterator->NextWord())
- {
- CPVT_WordPlace place = pIterator->GetAt();
- if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
-
- CPVT_Word word;
- if (pIterator->GetWord(word))
- {
- if (FX_EDIT_ISLATINWORD(word.Word))
- {
- if (!bLatinWord)
- {
- wpWordStart = place;
- bLatinWord = TRUE;
- }
-
- sWord += (char)word.Word;
- oldplace = place;
- }
- else
- {
- if (bLatinWord)
- {
- if (!pSpellCheck->CheckWord(sWord))
- {
- sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));
- pIterator->SetAt(place);
- }
- bLatinWord = FALSE;
- }
-
- sWord.Empty();
- }
- }
- else
- {
- if (bLatinWord)
- {
- if (!pSpellCheck->CheckWord(sWord))
- sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));
- bLatinWord = FALSE;
- sWord.Empty();
- }
- }
- }
-
- if (bLatinWord)
- {
- if (!pSpellCheck->CheckWord(sWord))
- sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));
-
- bLatinWord = FALSE;
- sWord.Empty();
- }
- }
- }
-
- return sRet.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetTextAppStream(const CPDF_Rect & rcBBox,IFX_Edit_FontMap * pFontMap,
- const CFX_WideString & sText, FX_INT32 nAlignmentH, FX_INT32 nAlignmentV,
- FX_FLOAT fFontSize, FX_BOOL bMultiLine, FX_BOOL bAutoReturn, const CPWL_Color & crText)
-{
- CFX_ByteTextBuf sRet;
-
- if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
- {
- pEdit->SetFontMap(pFontMap);
-
- pEdit->SetPlateRect(rcBBox);
- pEdit->SetAlignmentH(nAlignmentH);
- pEdit->SetAlignmentV(nAlignmentV);
- pEdit->SetMultiLine(bMultiLine);
- pEdit->SetAutoReturn(bAutoReturn);
- if (IsFloatZero(fFontSize))
- pEdit->SetAutoFontSize(TRUE);
- else
- pEdit->SetFontSize(fFontSize);
- pEdit->Initialize();
-
- pEdit->SetText(sText);
-
- CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit, CPDF_Point(0.0f,0.0f));
- if (sEdit.GetLength() > 0)
- {
- sRet << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n";
- }
-
- IFX_Edit::DelEdit(pEdit);
- }
-
- return sRet.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetPushButtonAppStream(const CPDF_Rect & rcBBox,
- IFX_Edit_FontMap * pFontMap,
- CPDF_Stream * pIconStream,
- CPDF_IconFit & IconFit,
- const CFX_WideString & sLabel,
- const CPWL_Color & crText,
- FX_FLOAT fFontSize,
- FX_INT32 nLayOut)
-{
- const FX_FLOAT fAutoFontScale = 1.0f / 3.0f;
-
- if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
- {
- pEdit->SetFontMap(pFontMap);
-
- pEdit->SetAlignmentH(1);
- pEdit->SetAlignmentV(1);
- pEdit->SetMultiLine(FALSE);
- pEdit->SetAutoReturn(FALSE);
- if (IsFloatZero(fFontSize))
- pEdit->SetAutoFontSize(TRUE);
- else
- pEdit->SetFontSize(fFontSize);
- pEdit->Initialize();
- pEdit->SetText(sLabel);
-
- CPDF_Rect rcLabelContent = pEdit->GetContentRect();
-
- CPWL_Icon Icon;
- PWL_CREATEPARAM cp;
- cp.dwFlags = PWS_VISIBLE;
- Icon.Create(cp);
- Icon.SetIconFit(&IconFit);
- Icon.SetPDFStream(pIconStream);
-
- CPDF_Rect rcLabel = CPDF_Rect(0,0,0,0);
- CPDF_Rect rcIcon = CPDF_Rect(0,0,0,0);
- FX_FLOAT fWidth = 0.0f;
- FX_FLOAT fHeight = 0.0f;
-
- switch (nLayOut)
- {
- case PPBL_LABEL:
- rcLabel = rcBBox;
- rcIcon = CPDF_Rect(0,0,0,0);
- break;
- case PPBL_ICON:
- rcIcon = rcBBox;
- rcLabel = CPDF_Rect(0,0,0,0);
- break;
- case PPBL_ICONTOPLABELBOTTOM:
-
- if (pIconStream)
- {
- if (IsFloatZero(fFontSize))
- {
- fHeight = rcBBox.top - rcBBox.bottom;
- rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcBBox.bottom + fHeight * fAutoFontScale);
- rcIcon = CPDF_Rect(rcBBox.left,rcLabel.top,rcBBox.right,rcBBox.top);
- }
- else
- {
- fHeight = rcLabelContent.Height();
-
- if (rcBBox.bottom + fHeight > rcBBox.top)
- {
- rcIcon = CPDF_Rect(0,0,0,0);
- rcLabel = rcBBox;
- }
- else
- {
- rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcBBox.bottom + fHeight);
- rcIcon = CPDF_Rect(rcBBox.left,rcLabel.top,rcBBox.right,rcBBox.top);
- }
- }
- }
- else
- {
- rcLabel = rcBBox;
- rcIcon = CPDF_Rect(0,0,0,0);
- }
-
- break;
- case PPBL_LABELTOPICONBOTTOM:
-
- if (pIconStream)
- {
- if (IsFloatZero(fFontSize))
- {
- fHeight = rcBBox.top - rcBBox.bottom;
- rcLabel = CPDF_Rect(rcBBox.left,rcBBox.top - fHeight * fAutoFontScale ,rcBBox.right,rcBBox.top);
- rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcLabel.bottom);
- }
- else
- {
- fHeight = rcLabelContent.Height();
-
- if (rcBBox.bottom + fHeight > rcBBox.top)
- {
- rcIcon = CPDF_Rect(0,0,0,0);
- rcLabel = rcBBox;
- }
- else
- {
- rcLabel = CPDF_Rect(rcBBox.left,rcBBox.top - fHeight,rcBBox.right,rcBBox.top);
- rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcLabel.bottom);
- }
- }
- }
- else
- {
- rcLabel = rcBBox;
- rcIcon = CPDF_Rect(0,0,0,0);
- }
-
- break;
- case PPBL_ICONLEFTLABELRIGHT:
-
- if (pIconStream)
- {
- if (IsFloatZero(fFontSize))
- {
- fWidth = rcBBox.right - rcBBox.left;
- rcLabel = CPDF_Rect(rcBBox.right - fWidth * fAutoFontScale,rcBBox.bottom,rcBBox.right,rcBBox.top);
- rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);
-
- if (rcLabelContent.Width() < fWidth * fAutoFontScale)
- {
- }
- else
- {
- if (rcLabelContent.Width() < fWidth)
- {
- rcLabel = CPDF_Rect(rcBBox.right - rcLabelContent.Width(),rcBBox.bottom,rcBBox.right,rcBBox.top);
- rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);
- }
- else
- {
- rcLabel = rcBBox;
- rcIcon = CPDF_Rect(0,0,0,0);
- }
- }
- }
- else
- {
- fWidth = rcLabelContent.Width();
-
- if (rcBBox.left + fWidth > rcBBox.right)
- {
- rcLabel = rcBBox;
- rcIcon = CPDF_Rect(0,0,0,0);
- }
- else
- {
- rcLabel = CPDF_Rect(rcBBox.right - fWidth,rcBBox.bottom,rcBBox.right,rcBBox.top);
- rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);
- }
- }
- }
- else
- {
- rcLabel = rcBBox;
- rcIcon = CPDF_Rect(0,0,0,0);
- }
-
- break;
- case PPBL_LABELLEFTICONRIGHT:
-
- if (pIconStream)
- {
- if (IsFloatZero(fFontSize))
- {
- fWidth = rcBBox.right - rcBBox.left;
- rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + fWidth * fAutoFontScale,rcBBox.top);
- rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);
-
- if (rcLabelContent.Width() < fWidth * fAutoFontScale)
- {
- }
- else
- {
- if (rcLabelContent.Width() < fWidth)
- {
- rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + rcLabelContent.Width(),rcBBox.top);
- rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);
- }
- else
- {
- rcLabel = rcBBox;
- rcIcon = CPDF_Rect(0,0,0,0);
- }
- }
- }
- else
- {
- fWidth = rcLabelContent.Width();
-
- if (rcBBox.left + fWidth > rcBBox.right)
- {
- rcLabel = rcBBox;
- rcIcon = CPDF_Rect(0,0,0,0);
- }
- else
- {
- rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + fWidth,rcBBox.top);
- rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);
- }
- }
- }
- else
- {
- rcLabel = rcBBox;
- rcIcon = CPDF_Rect(0,0,0,0);
- }
-
- break;
- case PPBL_LABELOVERICON:
- rcLabel = rcBBox;
- rcIcon = rcBBox;
- break;
- }
-
- CFX_ByteTextBuf sAppStream,sTemp;
-
- if (!rcIcon.IsEmpty())
- {
- Icon.Move(rcIcon, FALSE, FALSE);
- sTemp << Icon.GetImageAppStream();
- }
-
- Icon.Destroy();
-
- if (!rcLabel.IsEmpty())
- {
- pEdit->SetPlateRect(rcLabel);
- CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,0.0f));
- if (sEdit.GetLength() > 0)
- {
- sTemp << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n";
- }
- }
-
- IFX_Edit::DelEdit(pEdit);
-
- if (sTemp.GetSize() > 0)
- {
- sAppStream << "q\n" << rcBBox.left << " " << rcBBox.bottom << " "
- << rcBBox.right - rcBBox.left << " " << rcBBox.top - rcBBox.bottom << " re W n\n";
- sAppStream << sTemp << "Q\n";
- }
-
- return sAppStream.GetByteString();
- }
-
- return "";
-}
-
-CFX_ByteString CPWL_Utils::GetColorAppStream(const CPWL_Color & color,const FX_BOOL & bFillOrStroke)
-{
- CFX_ByteTextBuf sColorStream;
-
- switch (color.nColorType)
- {
- case COLORTYPE_RGB:
- sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " "
- << (bFillOrStroke ? "rg" : "RG") << "\n";
- break;
- case COLORTYPE_GRAY:
- sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") << "\n";
- break;
- case COLORTYPE_CMYK:
- sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " << color.fColor4 << " "
- << (bFillOrStroke ? "k" : "K") << "\n";
- break;
- }
-
- return sColorStream.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth,
- const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
- FX_INT32 nStyle, const CPWL_Dash & dash)
-{
- CFX_ByteTextBuf sAppStream;
- CFX_ByteString sColor;
-
- FX_FLOAT fLeft = rect.left;
- FX_FLOAT fRight = rect.right;
- FX_FLOAT fTop = rect.top;
- FX_FLOAT fBottom = rect.bottom;
-
- if (fWidth > 0.0f)
- {
- FX_FLOAT fHalfWidth = fWidth / 2.0f;
-
- sAppStream << "q\n";
-
- switch (nStyle)
- {
- default:
- case PBS_SOLID:
- sColor = CPWL_Utils::GetColorAppStream(color,TRUE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << sColor;
- sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n";
- sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " "
- << fRight - fLeft - fWidth * 2 << " " << fTop - fBottom - fWidth * 2 << " re\n";
- sAppStream << "f*\n";
- }
- break;
- case PBS_DASH:
- sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << sColor;
- sAppStream << fWidth << " w" << " [" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n";
- sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " m\n";
- sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";
- sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";
- sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 << " l\n";
- sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " l S\n";
- }
- break;
- case PBS_BEVELED:
- case PBS_INSET:
- sColor = CPWL_Utils::GetColorAppStream(crLeftTop,TRUE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << sColor;
- sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " m\n";
- sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth << " l\n";
- sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " l\n";
- sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";
- sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";
- sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l f\n";
- }
-
- sColor = CPWL_Utils::GetColorAppStream(crRightBottom,TRUE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << sColor;
- sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " m\n";
- sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth << " l\n";
- sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " l\n";
- sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";
- sAppStream << fRight - fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";
- sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l f\n";
- }
-
- sColor = CPWL_Utils::GetColorAppStream(color,TRUE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << sColor;
- sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n";
- sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " "
- << fRight - fLeft - fHalfWidth * 2 << " " << fTop - fBottom - fHalfWidth * 2 << " re f*\n";
- }
- break;
- case PBS_UNDERLINED:
- sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << sColor;
- sAppStream << fWidth << " w\n";
- sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n";
- sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n";
- }
- break;
- }
-
- sAppStream << "Q\n";
- }
-
- return sAppStream.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetCircleBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth,
- const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
- FX_INT32 nStyle, const CPWL_Dash & dash)
-{
- CFX_ByteTextBuf sAppStream;
- CFX_ByteString sColor;
-
-
-
-
-
-
- if (fWidth > 0.0f)
- {
- sAppStream << "q\n";
-
- switch (nStyle)
- {
- default:
- case PBS_SOLID:
- case PBS_UNDERLINED:
- {
- sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << "q\n" << fWidth << " w\n" << sColor
- << CPWL_Utils::GetAP_Circle(CPWL_Utils::DeflateRect(rect,fWidth / 2.0f))
- << " S\nQ\n";
- }
- }
- break;
- case PBS_DASH:
- {
- sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << "q\n" << fWidth << " w\n"
- << "[" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n"
- << sColor << CPWL_Utils::GetAP_Circle(CPWL_Utils::DeflateRect(rect,fWidth / 2.0f))
- << " S\nQ\n";
- }
- }
- break;
- case PBS_BEVELED:
- {
- FX_FLOAT fHalfWidth = fWidth / 2.0f;
-
- sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << "q\n" << fHalfWidth << " w\n"
- << sColor << CPWL_Utils::GetAP_Circle(rect)
- << " S\nQ\n";
- }
-
- sColor = CPWL_Utils::GetColorAppStream(crLeftTop,FALSE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << "q\n" << fHalfWidth << " w\n"
- << sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI/4.0f)
- << " S\nQ\n";
- }
-
- sColor = CPWL_Utils::GetColorAppStream(crRightBottom,FALSE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << "q\n" << fHalfWidth << " w\n"
- << sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI*5/4.0f)
- << " S\nQ\n";
- }
- }
- break;
- case PBS_INSET:
- {
- FX_FLOAT fHalfWidth = fWidth / 2.0f;
-
- sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << "q\n" << fHalfWidth << " w\n"
- << sColor << CPWL_Utils::GetAP_Circle(rect)
- << " S\nQ\n";
- }
-
- sColor = CPWL_Utils::GetColorAppStream(crLeftTop,FALSE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << "q\n" << fHalfWidth << " w\n"
- << sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI/4.0f)
- << " S\nQ\n";
- }
-
- sColor = CPWL_Utils::GetColorAppStream(crRightBottom,FALSE);
- if (sColor.GetLength() > 0)
- {
- sAppStream << "q\n" << fHalfWidth << " w\n"
- << sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI*5/4.0f)
- << " S\nQ\n";
- }
- }
- break;
- }
-
- sAppStream << "Q\n";
- }
-
- return sAppStream.GetByteString();
-}
-
-CPWL_Color CPWL_Utils::SubstractColor(const CPWL_Color & sColor,FX_FLOAT fColorSub)
-{
- CPWL_Color sRet;
- sRet.nColorType = sColor.nColorType;
-
- switch (sColor.nColorType)
- {
- case COLORTYPE_TRANSPARENT:
- sRet.nColorType = COLORTYPE_RGB;
- sRet.fColor1 = PWL_MAX(1 - fColorSub,0.0f);
- sRet.fColor2 = PWL_MAX(1 - fColorSub,0.0f);
- sRet.fColor3 = PWL_MAX(1 - fColorSub,0.0f);
- break;
- case COLORTYPE_RGB:
- case COLORTYPE_GRAY:
- case COLORTYPE_CMYK:
- sRet.fColor1 = PWL_MAX(sColor.fColor1 - fColorSub,0.0f);
- sRet.fColor2 = PWL_MAX(sColor.fColor2 - fColorSub,0.0f);
- sRet.fColor3 = PWL_MAX(sColor.fColor3 - fColorSub,0.0f);
- sRet.fColor4 = PWL_MAX(sColor.fColor4 - fColorSub,0.0f);
- break;
- }
-
- return sRet;
-}
-
-CPWL_Color CPWL_Utils::DevideColor(const CPWL_Color & sColor,FX_FLOAT fColorDevide)
-{
- CPWL_Color sRet;
- sRet.nColorType = sColor.nColorType;
-
- switch (sColor.nColorType)
- {
- case COLORTYPE_TRANSPARENT:
- sRet.nColorType = COLORTYPE_RGB;
- sRet.fColor1 = 1 / fColorDevide;
- sRet.fColor2 = 1 / fColorDevide;
- sRet.fColor3 = 1 / fColorDevide;
- break;
- case COLORTYPE_RGB:
- case COLORTYPE_GRAY:
- case COLORTYPE_CMYK:
- sRet = sColor;
- sRet.fColor1 /= fColorDevide;
- sRet.fColor2 /= fColorDevide;
- sRet.fColor3 /= fColorDevide;
- sRet.fColor4 /= fColorDevide;
- break;
- }
-
- return sRet;
-}
-
-CFX_ByteString CPWL_Utils::GetAppStream_Check(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
-{
- CFX_ByteTextBuf sAP;
- sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Check(rcBBox) << "f\nQ\n";
- return sAP.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetAppStream_Circle(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
-{
- CFX_ByteTextBuf sAP;
- sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Circle(rcBBox) << "f\nQ\n";
- return sAP.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetAppStream_Cross(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
-{
- CFX_ByteTextBuf sAP;
- sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,FALSE) << CPWL_Utils::GetAP_Cross(rcBBox) << "S\nQ\n";
- return sAP.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetAppStream_Diamond(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
-{
- CFX_ByteTextBuf sAP;
- sAP << "q\n1 w\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Diamond(rcBBox) << "f\nQ\n";
- return sAP.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetAppStream_Square(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
-{
- CFX_ByteTextBuf sAP;
- sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Square(rcBBox) << "f\nQ\n";
- return sAP.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetAppStream_Star(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
-{
- CFX_ByteTextBuf sAP;
- sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Star(rcBBox) << "f\nQ\n";
- return sAP.GetByteString();
-}
-
-CFX_ByteString CPWL_Utils::GetCheckBoxAppStream(const CPDF_Rect & rcBBox,
- FX_INT32 nStyle,
- const CPWL_Color & crText)
-{
- CPDF_Rect rcCenter = GetCenterSquare(rcBBox);
- switch (nStyle)
- {
- default:
- case PCS_CHECK:
- return GetAppStream_Check(rcCenter,crText);
- case PCS_CIRCLE:
- return GetAppStream_Circle(ScaleRect(rcCenter,2.0f/3.0f),crText);
- case PCS_CROSS:
- return GetAppStream_Cross(rcCenter,crText);
- case PCS_DIAMOND:
- return GetAppStream_Diamond(ScaleRect(rcCenter,2.0f/3.0f),crText);
- case PCS_SQUARE:
- return GetAppStream_Square(ScaleRect(rcCenter,2.0f/3.0f),crText);
- case PCS_STAR:
- return GetAppStream_Star(ScaleRect(rcCenter,2.0f/3.0f),crText);
- }
-}
-
-CFX_ByteString CPWL_Utils::GetRadioButtonAppStream(const CPDF_Rect & rcBBox,
- FX_INT32 nStyle,
- const CPWL_Color & crText)
-{
- CPDF_Rect rcCenter = GetCenterSquare(rcBBox);
- switch (nStyle)
- {
- default:
- case PCS_CHECK:
- return GetAppStream_Check(rcCenter,crText);
- case PCS_CIRCLE:
- return GetAppStream_Circle(ScaleRect(rcCenter,1.0f/2.0f),crText);
- case PCS_CROSS:
- return GetAppStream_Cross(rcCenter,crText);
- case PCS_DIAMOND:
- return GetAppStream_Diamond(ScaleRect(rcCenter,2.0f/3.0f),crText);
- case PCS_SQUARE:
- return GetAppStream_Square(ScaleRect(rcCenter,2.0f/3.0f),crText);
- case PCS_STAR:
- return GetAppStream_Star(ScaleRect(rcCenter,2.0f/3.0f),crText);
- }
-}
-
-CFX_ByteString CPWL_Utils::GetDropButtonAppStream(const CPDF_Rect & rcBBox)
-{
- CFX_ByteTextBuf sAppStream;
-
- if (!rcBBox.IsEmpty())
- {
- sAppStream << "q\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_RGB,220.0f/255.0f,220.0f/255.0f,220.0f/255.0f),TRUE);
- sAppStream << rcBBox.left << " " << rcBBox.bottom << " "
- << rcBBox.right - rcBBox.left << " " << rcBBox.top - rcBBox.bottom << " re f\n";
- sAppStream << "Q\n";
-
- sAppStream << "q\n" <<
- CPWL_Utils::GetBorderAppStream(rcBBox,2,CPWL_Color(COLORTYPE_GRAY,0),CPWL_Color(COLORTYPE_GRAY,1),CPWL_Color(COLORTYPE_GRAY,0.5),PBS_BEVELED,CPWL_Dash(3,0,0))
- << "Q\n";
-
- CPDF_Point ptCenter = CPDF_Point((rcBBox.left + rcBBox.right)/2,(rcBBox.top + rcBBox.bottom)/2);
- if (IsFloatBigger(rcBBox.right - rcBBox.left,6) && IsFloatBigger(rcBBox.top - rcBBox.bottom,6))
- {
- sAppStream << "q\n" << " 0 g\n";
- sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n";
- sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n";
- sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n";
- sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n";
- sAppStream << "Q\n";
- }
- }
-
- return sAppStream.GetByteString();
-}
-
-void CPWL_Utils::ConvertCMYK2GRAY(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dGray)
-{
- if (dC<0 || dC>1 || dM<0 || dM>1 || dY < 0 || dY >1 || dK < 0 || dK >1)
- return;
- dGray = 1.0f - FX_MIN(1.0f,0.3f*dC+0.59f * dM + 0.11f*dY+dK);
-}
-
-void CPWL_Utils::ConvertGRAY2CMYK(FX_FLOAT dGray,FX_FLOAT &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK)
-{
- if (dGray <0 || dGray >1)
- return;
- dC = 0.0f;
- dM = 0.0f;
- dY = 0.0f;
- dK = 1.0f-dGray;
-}
-
-void CPWL_Utils::ConvertGRAY2RGB(FX_FLOAT dGray,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB)
-{
- if (dGray <0 || dGray >1)
- return;
- dR = dGray;
- dG = dGray;
- dB = dGray;
-}
-
-void CPWL_Utils::ConvertRGB2GRAY(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dGray)
-{
- if (dR<0 || dR>1 || dG<0 || dG > 0 || dB < 0 || dB >1)
- return;
- dGray = 0.3f*dR+0.59f*dG+0.11f*dB;
-}
-
-void CPWL_Utils::ConvertCMYK2RGB(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB)
-{
- if (dC <0 || dC>1 || dM < 0 || dM > 1 || dY < 0 || dY > 1 || dK < 0 || dK > 1 )
- return;
- dR = 1.0f - FX_MIN(1.0f, dC + dK);
- dG = 1.0f - FX_MIN(1.0f, dM + dK);
- dB = 1.0f - FX_MIN(1.0f, dY + dK);
-}
-
-void CPWL_Utils::ConvertRGB2CMYK(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK)
-{
- if (dR<0 || dR>1 || dG<0 || dG>1 || dB<0 || dB>1)
- return;
-
- dC = 1.0f - dR;
- dM = 1.0f - dG;
- dY = 1.0f - dB;
- dK = FX_MIN(dC, FX_MIN(dM, dY));
-}
-
-void CPWL_Utils::PWLColorToARGB(const CPWL_Color& color, FX_INT32& alpha, FX_FLOAT& red, FX_FLOAT& green, FX_FLOAT& blue)
-{
- switch (color.nColorType)
- {
- case COLORTYPE_TRANSPARENT:
- {
- alpha = 0;
- }
- break;
- case COLORTYPE_GRAY:
- {
- ConvertGRAY2RGB(color.fColor1, red, green, blue);
- }
- break;
- case COLORTYPE_RGB:
- {
- red = color.fColor1;
- green = color.fColor2;
- blue = color.fColor3;
- }
- break;
- case COLORTYPE_CMYK:
- {
- ConvertCMYK2RGB(color.fColor1, color.fColor2, color.fColor3, color.fColor4,
- red, green, blue);
- }
- break;
- }
-}
-
-FX_COLORREF CPWL_Utils::PWLColorToFXColor(const CPWL_Color& color, FX_INT32 nTransparancy)
-{
- FX_INT32 nAlpha = nTransparancy;
- FX_FLOAT dRed = 0;
- FX_FLOAT dGreen = 0;
- FX_FLOAT dBlue = 0;
-
- PWLColorToARGB(color, nAlpha, dRed, dGreen, dBlue);
-
- return ArgbEncode(nAlpha, (FX_INT32)(dRed*255), (FX_INT32)(dGreen*255), (FX_INT32)(dBlue*255));
-}
-
-void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
- const FX_COLORREF & color)
-{
- CFX_PathData path;
- CPDF_Rect rcTemp(rect);
- path.AppendRect(rcTemp.left,rcTemp.bottom,rcTemp.right,rcTemp.top);
- pDevice->DrawPath(&path, pUser2Device, NULL, color, 0, FXFILL_WINDING);
-}
-
-void CPWL_Utils::DrawFillArea(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
- const CPDF_Point* pPts, FX_INT32 nCount, const FX_COLORREF& color)
-{
- CFX_PathData path;
- path.SetPointCount(nCount);
-
- path.SetPoint(0, pPts[0].x, pPts[0].y, FXPT_MOVETO);
- for (FX_INT32 i=1; i<nCount; i++)
- path.SetPoint(i, pPts[i].x, pPts[i].y, FXPT_LINETO);
-
- pDevice->DrawPath(&path, pUser2Device, NULL, color, 0, FXFILL_ALTERNATE);
-}
-
-void CPWL_Utils::DrawStrokeRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
- const FX_COLORREF & color, FX_FLOAT fWidth)
-{
- CFX_PathData path;
- CPDF_Rect rcTemp(rect);
- path.AppendRect(rcTemp.left,rcTemp.bottom,rcTemp.right,rcTemp.top);
-
- CFX_GraphStateData gsd;
- gsd.m_LineWidth = fWidth;
-
- pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE);
-}
-
-void CPWL_Utils::DrawStrokeLine(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
- const CPDF_Point & ptMoveTo, const CPDF_Point & ptLineTo, const FX_COLORREF & color, FX_FLOAT fWidth)
-{
- CFX_PathData path;
- path.SetPointCount(2);
- path.SetPoint(0, ptMoveTo.x, ptMoveTo.y, FXPT_MOVETO);
- path.SetPoint(1, ptLineTo.x, ptLineTo.y, FXPT_LINETO);
-
- CFX_GraphStateData gsd;
- gsd.m_LineWidth = fWidth;
-
- pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE);
-}
-
-void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
- const CPWL_Color & color, FX_INT32 nTransparancy)
-{
- CPWL_Utils::DrawFillRect(pDevice,pUser2Device,rect,PWLColorToFXColor(color,nTransparancy));
-}
-
-void CPWL_Utils::DrawShadow(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
- FX_BOOL bVertical, FX_BOOL bHorizontal, CPDF_Rect rect,
- FX_INT32 nTransparancy, FX_INT32 nStartGray, FX_INT32 nEndGray)
-{
- FX_FLOAT fStepGray = 1.0f;
-
- if (bVertical)
- {
- fStepGray = (nEndGray - nStartGray) / rect.Height();
-
- for (FX_FLOAT fy=rect.bottom+0.5f; fy<=rect.top-0.5f; fy+=1.0f)
- {
- FX_INT32 nGray = nStartGray + (FX_INT32)(fStepGray * (fy-rect.bottom));
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, CPDF_Point(rect.left, fy),
- CPDF_Point(rect.right, fy), ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f);
- }
- }
-
- if (bHorizontal)
- {
- fStepGray = (nEndGray - nStartGray) / rect.Width();
-
- for (FX_FLOAT fx=rect.left+0.5f; fx<=rect.right-0.5f; fx+=1.0f)
- {
- FX_INT32 nGray = nStartGray + (FX_INT32)(fStepGray * (fx-rect.left));
- CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, CPDF_Point(fx, rect.bottom),
- CPDF_Point(fx, rect.top), ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f);
- }
- }
-}
-
-void CPWL_Utils::DrawBorder(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
- const CPDF_Rect & rect, FX_FLOAT fWidth,
- const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
- FX_INT32 nStyle, const CPWL_Dash & dash, FX_INT32 nTransparancy)
-{
- FX_FLOAT fLeft = rect.left;
- FX_FLOAT fRight = rect.right;
- FX_FLOAT fTop = rect.top;
- FX_FLOAT fBottom = rect.bottom;
-
- if (fWidth > 0.0f)
- {
- FX_FLOAT fHalfWidth = fWidth / 2.0f;
-
- switch (nStyle)
- {
- default:
- case PBS_SOLID:
- {
- CFX_PathData path;
- path.AppendRect(fLeft, fBottom, fRight, fTop);
- path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth, fTop - fWidth);
- pDevice->DrawPath(&path, pUser2Device, NULL, PWLColorToFXColor(color,nTransparancy), 0, FXFILL_ALTERNATE);
- }
- break;
- case PBS_DASH:
- {
- CFX_PathData path;
-
- path.SetPointCount(5);
- path.SetPoint(0, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_MOVETO);
- path.SetPoint(1, fLeft + fWidth / 2.0f, fTop - fWidth / 2.0f, FXPT_LINETO);
- path.SetPoint(2, fRight - fWidth / 2.0f, fTop - fWidth / 2.0f, FXPT_LINETO);
- path.SetPoint(3, fRight - fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_LINETO);
- path.SetPoint(4, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_LINETO);
-
- CFX_GraphStateData gsd;
- gsd.SetDashCount(2);
- gsd.m_DashArray[0] = 3.0f;
- gsd.m_DashArray[1] = 3.0f;
- gsd.m_DashPhase = 0;
-
- gsd.m_LineWidth = fWidth;
- pDevice->DrawPath(&path, pUser2Device, &gsd, 0, PWLColorToFXColor(color,nTransparancy), FXFILL_WINDING);
- }
- break;
- case PBS_BEVELED:
- case PBS_INSET:
- {
- CFX_GraphStateData gsd;
- gsd.m_LineWidth = fHalfWidth;
-
- CFX_PathData pathLT;
-
- pathLT.SetPointCount(7);
- pathLT.SetPoint(0, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_MOVETO);
- pathLT.SetPoint(1, fLeft + fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);
- pathLT.SetPoint(2, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);
- pathLT.SetPoint(3, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO);
- pathLT.SetPoint(4, fLeft + fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO);
- pathLT.SetPoint(5, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO);
- pathLT.SetPoint(6, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO);
-
- pDevice->DrawPath(&pathLT, pUser2Device, &gsd, PWLColorToFXColor(crLeftTop,nTransparancy), 0, FXFILL_ALTERNATE);
-
- CFX_PathData pathRB;
-
- pathRB.SetPointCount(7);
- pathRB.SetPoint(0, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_MOVETO);
- pathRB.SetPoint(1, fRight - fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO);
- pathRB.SetPoint(2, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO);
- pathRB.SetPoint(3, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO);
- pathRB.SetPoint(4, fRight - fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO);
- pathRB.SetPoint(5, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO);
- pathRB.SetPoint(6, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);
-
- pDevice->DrawPath(&pathRB, pUser2Device, &gsd, PWLColorToFXColor(crRightBottom,nTransparancy), 0, FXFILL_ALTERNATE);
-
- CFX_PathData path;
-
- path.AppendRect(fLeft, fBottom, fRight, fTop);
- path.AppendRect(fLeft + fHalfWidth, fBottom + fHalfWidth, fRight - fHalfWidth, fTop - fHalfWidth);
-
- pDevice->DrawPath(&path, pUser2Device, &gsd, PWLColorToFXColor(color,nTransparancy), 0, FXFILL_ALTERNATE);
- }
- break;
- case PBS_UNDERLINED:
- {
- CFX_PathData path;
-
- path.SetPointCount(2);
- path.SetPoint(0, fLeft, fBottom + fWidth / 2, FXPT_MOVETO);
- path.SetPoint(1, fRight, fBottom + fWidth / 2, FXPT_LINETO);
-
- CFX_GraphStateData gsd;
- gsd.m_LineWidth = fWidth;
-
- pDevice->DrawPath(&path, pUser2Device, &gsd,0, PWLColorToFXColor(color,nTransparancy), FXFILL_ALTERNATE);
- }
- break;
- case PBS_SHADOW:
- {
- CFX_PathData path;
- path.AppendRect(fLeft, fBottom, fRight, fTop);
- path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth, fTop - fWidth);
- pDevice->DrawPath(&path, pUser2Device, NULL, PWLColorToFXColor(color,nTransparancy/2), 0, FXFILL_ALTERNATE);
- }
- break;
- }
- }
-}
-
-static void AddSquigglyPath(CFX_PathData & PathData, FX_FLOAT fStartX, FX_FLOAT fEndX, FX_FLOAT fY, FX_FLOAT fStep)
-{
- PathData.AddPointCount(1);
- PathData.SetPoint(PathData.GetPointCount() - 1, fStartX, fY, FXPT_MOVETO);
-
- FX_FLOAT fx;
- FX_INT32 i;
-
- for (i=1,fx=fStartX+fStep; fx<fEndX; fx+=fStep,i++)
- {
- PathData.AddPointCount(1);
- PathData.SetPoint(PathData.GetPointCount() - 1, fx, fY + (i&1)*fStep, FXPT_LINETO);
- }
-}
-
-static void AddSpellCheckObj(CFX_PathData & PathData, IFX_Edit* pEdit, const CPVT_WordRange& wrWord)
-{
- FX_FLOAT fStartX = 0.0f;
- FX_FLOAT fEndX = 0.0f;
- FX_FLOAT fY = 0.0f;
- FX_FLOAT fStep = 0.0f;
-
- FX_BOOL bBreak = FALSE;
-
- if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
- {
- pIterator->SetAt(wrWord.BeginPos);
-
- do
- {
- CPVT_WordPlace place = pIterator->GetAt();
-
- CPVT_Line line;
- if (pIterator->GetLine(line))
- {
- fY = line.ptLine.y;
- fStep = (line.fLineAscent - line.fLineDescent) / 16.0f;
- }
-
- if (place.LineCmp(wrWord.BeginPos) == 0)
- {
- pIterator->SetAt(wrWord.BeginPos);
- CPVT_Word word;
- if (pIterator->GetWord(word))
- {
- fStartX = word.ptWord.x;
- }
- }
- else
- {
- fStartX = line.ptLine.x;
- }
-
- if (place.LineCmp(wrWord.EndPos) == 0)
- {
- pIterator->SetAt(wrWord.EndPos);
- CPVT_Word word;
- if (pIterator->GetWord(word))
- {
- fEndX = word.ptWord.x + word.fWidth;
- }
-
- bBreak = TRUE;
- }
- else
- {
- fEndX = line.ptLine.x + line.fLineWidth;
- }
-
- AddSquigglyPath(PathData, fStartX, fEndX, fY, fStep);
-
- if (bBreak) break;
- }
- while (pIterator->NextLine());
- }
-}
-
-void CPWL_Utils::DrawEditSpellCheck(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,
- const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange,
- IPWL_SpellCheck * pSpellCheck)
-{
- const FX_COLORREF crSpell = ArgbEncode(255,255,0,0);
-
- //for spellcheck
- FX_BOOL bLatinWord = FALSE;
- CPVT_WordPlace wpWordStart;
- CFX_ByteString sLatinWord;
-
- CFX_PathData pathSpell;
-
- pDevice->SaveState();
-
- if (!rcClip.IsEmpty())
- {
- CPDF_Rect rcTemp = rcClip;
- pUser2Device->TransformRect(rcTemp);
- FX_RECT rcDevClip;
- rcDevClip.left = (FX_INT32)rcTemp.left;
- rcDevClip.right = (FX_INT32)rcTemp.right;
- rcDevClip.top = (FX_INT32)rcTemp.top;
- rcDevClip.bottom = (FX_INT32)rcTemp.bottom;
- pDevice->SetClip_Rect(&rcDevClip);
- }
-
- if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
- {
- if (pEdit->GetFontMap())
- {
- if (pRange)
- pIterator->SetAt(pRange->BeginPos);
- else
- pIterator->SetAt(0);
-
- CPVT_WordPlace oldplace;
-
- while (pIterator->NextWord())
- {
- CPVT_WordPlace place = pIterator->GetAt();
- if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
-
- CPVT_Word word;
- if (pIterator->GetWord(word))
- {
- if (FX_EDIT_ISLATINWORD(word.Word))
- {
- if (!bLatinWord)
- {
- wpWordStart = place;
- bLatinWord = TRUE;
- }
-
- sLatinWord += (char)word.Word;
- }
- else
- {
- if (bLatinWord)
- {
- if (!sLatinWord.IsEmpty())
- {
- if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))
- {
- AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));
- pIterator->SetAt(place);
- }
- }
- bLatinWord = FALSE;
- }
-
- sLatinWord.Empty();
- }
-
- oldplace = place;
- }
- else
- {
- if (bLatinWord)
- {
- if (!sLatinWord.IsEmpty())
- {
- if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))
- {
- AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));
- pIterator->SetAt(place);
- }
- }
- bLatinWord = FALSE;
- }
-
- sLatinWord.Empty();
- }
- }
-
- if (!sLatinWord.IsEmpty())
- {
- if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))
- {
- AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));
- }
- }
- }
- }
-
- CFX_GraphStateData gsd;
- gsd.m_LineWidth = 0;
- if (pathSpell.GetPointCount() > 0)
- pDevice->DrawPath(&pathSpell, pUser2Device, &gsd, 0, crSpell, FXFILL_ALTERNATE);
-
- pDevice->RestoreState();
-}
-
-FX_BOOL CPWL_Utils::IsBlackOrWhite(const CPWL_Color& color)
-{
- switch (color.nColorType)
- {
- case COLORTYPE_TRANSPARENT:
- return FALSE;
- case COLORTYPE_GRAY:
- return color.fColor1 < 0.5f;
- case COLORTYPE_RGB:
- return color.fColor1 + color.fColor2 + color.fColor3 < 1.5f;
- case COLORTYPE_CMYK:
- return color.fColor1 + color.fColor2 + color.fColor3 + color.fColor4 > 2.0f;
- }
-
- return TRUE;
-}
-
-CPWL_Color CPWL_Utils::GetReverseColor(const CPWL_Color& color)
-{
- CPWL_Color crRet = color;
-
- switch (color.nColorType)
- {
- case COLORTYPE_GRAY:
- crRet.fColor1 = 1.0f - crRet.fColor1;
- break;
- case COLORTYPE_RGB:
- crRet.fColor1 = 1.0f - crRet.fColor1;
- crRet.fColor2 = 1.0f - crRet.fColor2;
- crRet.fColor3 = 1.0f - crRet.fColor3;
- break;
- case COLORTYPE_CMYK:
- crRet.fColor1 = 1.0f - crRet.fColor1;
- crRet.fColor2 = 1.0f - crRet.fColor2;
- crRet.fColor3 = 1.0f - crRet.fColor3;
- crRet.fColor4 = 1.0f - crRet.fColor4;
- break;
- }
-
- return crRet;
-}
-
-CFX_ByteString CPWL_Utils::GetIconAppStream(FX_INT32 nType, const CPDF_Rect& rect, const CPWL_Color& crFill,
- const CPWL_Color& crStroke)
-{
- CFX_ByteString sAppStream = CPWL_Utils::GetColorAppStream(crStroke, FALSE);
- sAppStream += CPWL_Utils::GetColorAppStream(crFill, TRUE);
-
- CFX_ByteString sPath;
- CFX_PathData path;
-
- switch (nType)
- {
- case PWL_ICONTYPE_CHECKMARK:
- GetGraphics_Checkmark(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_CIRCLE:
- GetGraphics_Circle(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_COMMENT:
- GetGraphics_Comment(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_CROSS:
- GetGraphics_Cross(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_HELP:
- GetGraphics_Help(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_INSERTTEXT:
- GetGraphics_InsertText(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_KEY:
- GetGraphics_Key(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_NEWPARAGRAPH:
- GetGraphics_NewParagraph(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_TEXTNOTE:
- GetGraphics_TextNote(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_PARAGRAPH:
- GetGraphics_Paragraph(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_RIGHTARROW:
- GetGraphics_RightArrow(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_RIGHTPOINTER:
- GetGraphics_RightPointer(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_STAR:
- GetGraphics_Star(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_UPARROW:
- GetGraphics_UpArrow(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_UPLEFTARROW:
- GetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_GRAPH:
- GetGraphics_Graph(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_PAPERCLIP:
- GetGraphics_Paperclip(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_ATTACHMENT:
- GetGraphics_Attachment(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_TAG:
- GetGraphics_Tag(sPath, path, rect, PWLPT_STREAM);
- break;
- case PWL_ICONTYPE_FOXIT:
- GetGraphics_Foxit(sPath, path, rect, PWLPT_STREAM);
- break;
- }
-
- sAppStream += sPath;
- if (crStroke.nColorType != COLORTYPE_TRANSPARENT)
- sAppStream += "B*\n";
- else
- sAppStream += "f*\n";
-
- return sAppStream;
-}
-
-void CPWL_Utils::DrawIconAppStream(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
- FX_INT32 nType, const CPDF_Rect & rect, const CPWL_Color& crFill, const CPWL_Color& crStroke, const FX_INT32 nTransparancy)
-{
- CFX_GraphStateData gsd;
- gsd.m_LineWidth = 1.0f;
-
- CFX_ByteString sPath;
- CFX_PathData path;
-
- switch (nType)
- {
- case PWL_ICONTYPE_CHECKMARK:
- GetGraphics_Checkmark(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_CIRCLE:
- GetGraphics_Circle(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_COMMENT:
- GetGraphics_Comment(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_CROSS:
- GetGraphics_Cross(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_HELP:
- GetGraphics_Help(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_INSERTTEXT:
- GetGraphics_InsertText(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_KEY:
- GetGraphics_Key(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_NEWPARAGRAPH:
- GetGraphics_NewParagraph(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_TEXTNOTE:
- GetGraphics_TextNote(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_PARAGRAPH:
- GetGraphics_Paragraph(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_RIGHTARROW:
- GetGraphics_RightArrow(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_RIGHTPOINTER:
- GetGraphics_RightPointer(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_STAR:
- GetGraphics_Star(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_UPARROW:
- GetGraphics_UpArrow(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_UPLEFTARROW:
- GetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_GRAPH:
- GetGraphics_Graph(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_PAPERCLIP:
- GetGraphics_Paperclip(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_ATTACHMENT:
- GetGraphics_Attachment(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_TAG:
- GetGraphics_Tag(sPath, path, rect, PWLPT_PATHDATA);
- break;
- case PWL_ICONTYPE_FOXIT:
- GetGraphics_Foxit(sPath, path, rect, PWLPT_PATHDATA);
- break;
- default:
- return;
- }
-
- pDevice->DrawPath(&path, pUser2Device, &gsd,
- PWLColorToFXColor(crFill,nTransparancy), PWLColorToFXColor(crStroke,nTransparancy), FXFILL_ALTERNATE);
-}
-
-void CPWL_Utils::GetGraphics_Checkmark(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f, crBBox.bottom + fHeight * 2 / 5.0f),PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f + PWL_BEZIER*(fWidth / 7.0f - fWidth / 15.0f),
- crBBox.bottom + fHeight * 2 / 5.0f + PWL_BEZIER*(fHeight * 2 / 7.0f - fHeight * 2 / 5.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f + PWL_BEZIER*(fWidth / 5.0f - fWidth / 4.5f),
- crBBox.bottom + fHeight / 16.0f + PWL_BEZIER*(fHeight / 5.0f - fHeight / 16.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f, crBBox.bottom + fHeight / 16.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f + PWL_BEZIER*(fWidth / 4.4f - fWidth / 4.5f),
- crBBox.bottom + fHeight / 16.0f - PWL_BEZIER*fHeight / 16.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f + PWL_BEZIER*(fWidth / 4.0f - fWidth / 3.0f),
- crBBox.bottom), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f, crBBox.bottom), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f + PWL_BEZIER*fWidth*(1/7.0f + 2/15.0f),
- crBBox.bottom + PWL_BEZIER*fHeight * 4 / 5.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f + PWL_BEZIER*fWidth*(1/7.0f - 7/15.0f),
- crBBox.bottom + fHeight * 15/16.0f + PWL_BEZIER*(fHeight * 4/5.0f - fHeight * 15/16.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f,crBBox.bottom + fHeight * 15 / 16.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f + PWL_BEZIER*(fWidth * 7 / 15.0f - fWidth * 14 / 15.0f),
- crBBox.bottom + fHeight * 15 / 16.0f + PWL_BEZIER*(fHeight * 8 / 7.0f - fHeight * 15 / 16.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f + PWL_BEZIER*(fWidth / 3.4f - fWidth / 3.6f),
- crBBox.bottom + fHeight / 3.5f + PWL_BEZIER*(fHeight / 3.5f - fHeight / 3.5f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f,crBBox.bottom + fHeight / 3.5f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f,
- crBBox.bottom + fHeight / 3.5f + PWL_BEZIER*(fHeight / 4.0f - fHeight / 3.5f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f + PWL_BEZIER*(fWidth / 3.5f - fWidth / 15.0f),
- crBBox.bottom + fHeight * 2 / 5.0f + PWL_BEZIER*(fHeight * 3.5f / 5.0f - fHeight * 2 / 5.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,crBBox.bottom + fHeight * 2 / 5.0f), PWLPT_BEZIERTO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 16);
- else
- GetPathDataFromArray(path, PathArray, 16);
-}
-
-void CPWL_Utils::GetGraphics_Circle(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f,crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f,
- crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*14/15.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/15.0f), crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f,crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*14/15.0f - fWidth/2.0f), crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*14/15.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight/2.0f - fHeight/15.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*14/15.0f - fWidth/2.0f), crBBox.bottom + fHeight/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/15.0f), crBBox.bottom + fHeight/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight/2.0f - fHeight/15.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f,crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth*3/15.0f), crBBox.top - fHeight*3/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight*3/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*4/5.0f - fWidth/2.0f), crBBox.top - fHeight*3/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*4/5.0f - fWidth/2.0f), crBBox.bottom + fHeight*3/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight*3/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth*4/5.0f - fWidth/2.0f), crBBox.bottom + fHeight*3/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 26);
- else
- GetPathDataFromArray(path, PathArray, 26);
-}
-
-void CPWL_Utils::GetGraphics_Comment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f + PWL_BEZIER*(fHeight/6.0f - fHeight/10.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f - PWL_BEZIER*fWidth/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight/10.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f + PWL_BEZIER*fWidth/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/6 + PWL_BEZIER*(fHeight/6.0f - fHeight/10.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/3.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f + PWL_BEZIER*fHeight/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f + PWL_BEZIER*fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f, crBBox.bottom + fHeight*2/15 + PWL_BEZIER*fHeight*2/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f - PWL_BEZIER*fWidth*2/15.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*6/30.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f + PWL_BEZIER*fWidth/30.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f, crBBox.bottom + fHeight*2/15.0f + PWL_BEZIER*fHeight*2/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f - PWL_BEZIER*fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/3.0f - PWL_BEZIER*fHeight/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/3.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight*8/30.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight*8/30.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15, crBBox.top - fHeight*25/60.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight*25/60.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight*17/30.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*4/15.0f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 30);
- else
- GetPathDataFromArray(path, PathArray, 30);
-}
-
-void CPWL_Utils::GetGraphics_Cross(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
- //FX_FLOAT fcatercorner = (FX_FLOAT)sqrt(fWidth*fWidth + fHeight*fHeight);
- CPWL_Point center_point(crBBox.left + fWidth/2, crBBox.bottom + fHeight/2);
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(center_point.x, center_point.y + fHeight/10.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(center_point.x + fWidth*0.3f, center_point.y + fHeight/10.0f + fWidth*0.3f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f + fWidth*0.3f, center_point.y + fHeight*0.3f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f, center_point.y), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f + fWidth*0.3f, center_point.y - fHeight*0.3f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(center_point.x + fWidth*0.3f, center_point.y - fHeight/10.0f - fHeight*0.3f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(center_point.x, center_point.y - fHeight/10.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(center_point.x - fWidth*0.3f, center_point.y - fHeight/10 - fHeight*0.3f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(center_point.x - fWidth/10.0f - fWidth*0.3f, center_point.y - fHeight*0.3f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(center_point.x - fWidth/10, center_point.y), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(center_point.x - fWidth/10 - fWidth*0.3f, center_point.y + fHeight*0.3f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(center_point.x - fWidth*0.3f, center_point.y + fHeight/10.0f + fHeight*0.3f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(center_point.x, center_point.y + fHeight/10.0f), PWLPT_LINETO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 13);
- else
- GetPathDataFromArray(path, PathArray, 13);
-}
-
-void CPWL_Utils::GetGraphics_Help(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight/60.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/60.0f), crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*fWidth*29/60.0f, crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight/60.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*fHeight*29/60.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*fWidth*29/60.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*fWidth*29/60.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*fHeight*29/60.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.23f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f - PWL_BEZIER*fWidth*0.23f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f + PWL_BEZIER*fWidth*0.23f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.27f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.23f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.27f - fWidth*0.08f*0.2f, crBBox.top - fHeight*0.36f - fHeight*0.15f*0.7f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.35f + fWidth*0.08f*0.2f, crBBox.top - fHeight*0.51f + fHeight*0.15f*0.2f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.35f, crBBox.top - fHeight*0.51f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.35f - fWidth*0.1f*0.5f, crBBox.top - fHeight*0.51f - fHeight*0.15f*0.3f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f - fWidth*0.1f*0.5f, crBBox.top - fHeight*0.68f + fHeight*0.15f*0.5f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.top - fHeight*0.68f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.bottom + fHeight*0.30f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.bottom + fHeight*0.30f - fWidth*0.1f*0.7f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.bottom + fHeight*0.30f - fWidth*0.1f*0.7f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.bottom + fHeight*0.30f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.top - fHeight*0.66f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f - fWidth*0.1f*0.05f, crBBox.top - fHeight*0.66f + fHeight*0.18f*0.5f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f - fWidth*0.1f*0.05f, crBBox.top - fHeight*0.48f - fHeight*0.18f*0.3f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.top - fHeight*0.48f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f + fWidth*0.08f*0.2f, crBBox.top - fHeight*0.48f + fHeight*0.18f*0.2f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.37f - fWidth*0.08f*0.2f, crBBox.top - fHeight*0.36f - fHeight*0.18f*0.7f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.37f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.37f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.13f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f + PWL_BEZIER*fWidth*0.13f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f - PWL_BEZIER*fWidth*0.13f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.13f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f - fWidth*0.1f*0.6f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f - fWidth*0.1f*0.6f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f + PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f - PWL_BEZIER*fWidth*0.095f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f + PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f + PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f - PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f + PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f - PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f - PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f), PWLPT_BEZIERTO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 59);
- else
- GetPathDataFromArray(path, PathArray, 59);
-}
-
-void CPWL_Utils::GetGraphics_InsertText(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.bottom + fHeight/10), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2, crBBox.top - fHeight*2/15), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10, crBBox.bottom + fHeight/10), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.bottom + fHeight/10), PWLPT_LINETO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 4);
- else
- GetPathDataFromArray(path, PathArray, 4);
-}
-
-void CPWL_Utils::GetGraphics_Key(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
- FX_FLOAT k = -fHeight/fWidth;
- CPWL_Point tail;
- CPWL_Point CicleCenter;
- tail.x = crBBox.left + fWidth*0.9f;
- tail.y = k*(tail.x - crBBox.right) + crBBox.bottom;
- CicleCenter.x = crBBox.left + fWidth*0.15f;
- CicleCenter.y = k*(CicleCenter.x - crBBox.right) + crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(tail.x + fWidth/30.0f, -fWidth/30.0f/k + tail.y), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(tail.x + fWidth/30.0f - fWidth*0.18f, -k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f + fWidth*0.07f,
- -fWidth*0.07f/k - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 + fWidth*0.07f,
- -fWidth*0.07f/k - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20,
- -k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15,
- -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 + fWidth*0.07f,
- -fWidth*0.07f/k - k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 - fWidth/20 + fWidth*0.07f,
- -fWidth*0.07f/k + -k*fWidth/20 + -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 - fWidth/20,
- -k*fWidth/20 + -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.45f, -k*fWidth*0.45f - fWidth/30/k + tail.y), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.45f + fWidth*0.2f,
- -fWidth*0.4f/k - k*fWidth*0.45f - fWidth/30/k + tail.y), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.2f, - fWidth*0.1f/k + CicleCenter.y), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth/60.0f, -k*fWidth/60 + CicleCenter.y), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth/60, -k*fWidth/60 + CicleCenter.y), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth*0.22f, fWidth*0.35f/k + CicleCenter.y - fHeight*0.05f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(tail.x - fWidth/30 - fWidth*0.45f - fWidth*0.18f, fWidth*0.05f/k - k*fWidth*0.45f + fWidth/30/k + tail.y - fHeight*0.05f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(tail.x - fWidth/30.0f - fWidth*0.45f, -k*fWidth*0.45f + fWidth/30.0f/k + tail.y), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(tail.x - fWidth/30.0f, fWidth/30.0f/k + tail.y), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(tail.x + fWidth/30, -fWidth/30/k + tail.y), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f, k*fWidth*0.08f + CicleCenter.y), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f + fWidth*0.1f, -fWidth*0.1f/k + k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f + fWidth*0.1f, k*fWidth*0.22f + CicleCenter.y - fWidth*0.1f/k), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f, k*fWidth*0.22f + CicleCenter.y), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f - fWidth*0.1f, fWidth*0.1f/k + k*fWidth*0.22f + CicleCenter.y), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f - fWidth*0.1f, fWidth*0.1f/k + k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f, k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 28);
- else
- GetPathDataFromArray(path, PathArray, 28);
-}
-
-void CPWL_Utils::GetGraphics_NewParagraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/20.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/20.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.top - fHeight*17/30.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.top - fHeight*17/30.0f - fWidth*0.14f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.48f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.48f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.bottom + fWidth*0.24f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/10.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/10.0f + fHeight/7.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.97f, crBBox.bottom + fHeight/10.0f + fHeight/7.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.97f, crBBox.top - fHeight*17/30.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*17/30.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.85f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.85f, crBBox.top - fHeight*17/30.0f - fHeight*0.08f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*17/30.0f - fHeight*0.08f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_LINETO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 28);
- else
- GetPathDataFromArray(path, PathArray, 28);
-}
-
-void CPWL_Utils::GetGraphics_TextNote(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*4/15.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/5.0f, crBBox.top - fHeight*4/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*7/15.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/5.0f, crBBox.top - fHeight*7/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*10/15.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.top - fHeight*10/15.0f), PWLPT_LINETO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 17);
- else
- GetPathDataFromArray(path, PathArray, 17);
-}
-
-void CPWL_Utils::GetGraphics_Paragraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.634f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.634f, crBBox.top - fHeight*2/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.566f, crBBox.top - fHeight*2/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.566f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f - fHeight*0.4f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.2f, crBBox.top - fHeight/15.0f - fHeight*0.4f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.2f, crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 12);
- else
- GetPathDataFromArray(path, PathArray, 12);
-}
-
-void CPWL_Utils::GetGraphics_RightArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/2.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + fWidth/8.0f, crBBox.bottom + fHeight/5.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/5.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f - fWidth*0.15f, crBBox.top - fHeight/2.0f - fWidth/25.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight/2.0f - fWidth/25.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight/2.0f + fWidth/25.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f - fWidth*0.15f, crBBox.top - fHeight/2.0f + fWidth/25.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/5.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + fWidth/8.0f, crBBox.top - fHeight/5.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 10);
- else
- GetPathDataFromArray(path, PathArray, 10);
-}
-
-void CPWL_Utils::GetGraphics_RightPointer(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30.0f, crBBox.top - fHeight/2.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/30.0f, crBBox.bottom + fHeight/6.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*4/15.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/30.0f, crBBox.top - fHeight/6.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 5);
- else
- GetPathDataFromArray(path, PathArray, 5);
-}
-
-void CPWL_Utils::GetGraphics_Star(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fLongRadius = (crBBox.top - crBBox.bottom)/(1+(FX_FLOAT)cos(PWL_PI/5.0f));
- fLongRadius = fLongRadius * 0.7f;
- FX_FLOAT fShortRadius = fLongRadius * 0.55f;
- CPDF_Point ptCenter = CPDF_Point((crBBox.left + crBBox.right) / 2.0f,(crBBox.top + crBBox.bottom) / 2.0f);
-
- FX_FLOAT px1[5], py1[5];
- FX_FLOAT px2[5], py2[5];
-
- FX_FLOAT fAngel = PWL_PI/10.0f;
-
- for (FX_INT32 i=0; i<5; i++)
- {
- px1[i] = ptCenter.x + fLongRadius * (FX_FLOAT)cos(fAngel);
- py1[i] = ptCenter.y + fLongRadius * (FX_FLOAT)sin(fAngel);
-
- fAngel += PWL_PI * 2 / 5.0f;
- }
-
- fAngel = PWL_PI/5.0f + PWL_PI/10.0f;
-
- for (FX_INT32 j=0; j<5; j++)
- {
- px2[j] = ptCenter.x + fShortRadius * (FX_FLOAT)cos(fAngel);
- py2[j] = ptCenter.y + fShortRadius * (FX_FLOAT)sin(fAngel);
-
- fAngel += PWL_PI * 2 / 5.0f;
- }
-
- CPWL_PathData PathArray[11];
- PathArray[0] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_MOVETO);
- PathArray[1] = CPWL_PathData(CPWL_Point(px2[0], py2[0]), PWLPT_LINETO);
-
- for(FX_INT32 k = 0; k < 4; k++)
- {
- PathArray[(k+1)*2] = CPWL_PathData(CPWL_Point(px1[k+1], py1[k+1]), PWLPT_LINETO);
- PathArray[(k+1)*2 + 1] = CPWL_PathData(CPWL_Point(px2[k+1], py2[k+1]), PWLPT_LINETO);
- }
-
- PathArray[10] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_LINETO);
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 11);
- else
- GetPathDataFromArray(path, PathArray, 11);
-}
-
-void CPWL_Utils::GetGraphics_UpArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 8);
- else
- GetPathDataFromArray(path, PathArray, 8);
-}
-
-void CPWL_Utils::GetGraphics_UpLeftArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
- CPWL_Point leftup(crBBox.left, crBBox.top);
- CPWL_Point rightdown(crBBox.right, crBBox.bottom);
- FX_FLOAT k = -fHeight/fWidth;
- CPWL_Point tail;
- tail.x = crBBox.left + fWidth*4/5.0f;
- tail.y = k*(tail.x - crBBox.right) + rightdown.y;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/20.0f, k*(crBBox.left + fWidth/20.0f - rightdown.x) + rightdown.y), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x + fWidth/10.0f + fWidth/5.0f,
- -fWidth/5.0f/k + tail.y - fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x + fWidth/10.0f,
- tail.y - fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(tail.x + fWidth/10.0f, tail.y - fWidth/10.0f/k), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(tail.x - fWidth/10.0f, tail.y + fWidth/10.0f/k), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x - fWidth/10.0f, tail.y + fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x - fWidth/10.0f - fWidth/5.0f,
- fWidth/5.0f/k + tail.y + fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/20.0f, k*(crBBox.left + fWidth/20.0f - rightdown.x) + rightdown.y), PWLPT_LINETO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 8);
- else
- GetPathDataFromArray(path, PathArray, 8);
-}
-
-void CPWL_Utils::GetGraphics_Graph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.top - fWidth*0.15f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.15f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.top - fWidth*0.15f), PWLPT_LINETO),
-
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.top - fWidth*0.45f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.475f, crBBox.top - fWidth*0.45f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.475f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.top - fWidth*0.45f), PWLPT_LINETO),
-
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.05f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*0.05f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.05f), PWLPT_LINETO),
-
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.top - fWidth*0.35f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.925f, crBBox.top - fWidth*0.35f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.925f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.top - fWidth*0.35f), PWLPT_LINETO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 20);
- else
- GetPathDataFromArray(path, PathArray, 20);
-}
-
-void CPWL_Utils::GetGraphics_Paperclip(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.bottom + fHeight*0.25f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.bottom + fHeight*0.25f - fWidth*57/60.0f*0.35f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.bottom + fHeight*0.25f - fWidth*57/60.0f*0.35f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.bottom + fHeight*0.25f), PWLPT_BEZIERTO),
-
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.top - fHeight*0.33f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.top - fHeight*0.33f + fHeight/15*0.5f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.top - fHeight*0.33f + fHeight/15*0.5f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.top - fHeight*0.33f), PWLPT_BEZIERTO),
-
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.bottom + fHeight*0.2f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.bottom + fHeight*0.2f - (fWidth*57/60.0f - fWidth*0.24f)*0.25f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.bottom + fHeight*0.2f - (fWidth*57/60.0f - fWidth*0.24f)*0.25f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.bottom + fHeight*0.2f), PWLPT_BEZIERTO),
-
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.top - fHeight*0.2f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.top - fHeight*0.2f + (fWidth*11/12.0f - fWidth*0.36f)*0.25f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.top - fHeight*0.2f + (fWidth*11/12.0f - fWidth*0.36f)*0.25f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.top - fHeight*0.2f), PWLPT_BEZIERTO),
-
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.bottom + fHeight*0.25f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.bottom + fHeight*0.25f - (fWidth*14/15.0f - fWidth*0.53f)*0.25f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.bottom + fHeight*0.25f - (fWidth*14/15.0f - fWidth*0.53f)*0.25f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.bottom + fHeight*0.25f), PWLPT_BEZIERTO),
-
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.top - fHeight*0.33f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.top - fHeight*0.33f + fWidth*0.12f*0.35f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.top - fHeight*0.33f + fWidth*0.12f*0.35f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.top - fHeight*0.33f), PWLPT_BEZIERTO),
-
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.bottom + fHeight*0.3f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.bottom + fHeight*0.3f - fWidth*(14/15.0f - 0.29f)*0.35f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.bottom + fHeight*0.3f - fWidth*(14/15.0f - 0.29f)*0.35f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.bottom + fHeight*0.3f), PWLPT_BEZIERTO),
-
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.top - fHeight*0.25f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.top - fHeight*0.25f + fWidth*0.35f*(11/12.0f - 0.12f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f + fWidth*0.35f*(11/12.0f - 0.12f)), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f), PWLPT_BEZIERTO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 33);
- else
- GetPathDataFromArray(path, PathArray, 33);
-}
-
-void CPWL_Utils::GetGraphics_Attachment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
-
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),
-
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f - fWidth*0.25f*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.15f, crBBox.top - fHeight*0.65f + fHeight*0.15f*0.4f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.15f, crBBox.top - fHeight*0.65f), PWLPT_BEZIERTO),
-
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.15f, crBBox.top - fHeight*0.65f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.15f, crBBox.top - fHeight*0.65f + fHeight*0.15f*0.4f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f + fWidth*0.25f*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
-
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
-
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.65f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 24);
- else
- GetPathDataFromArray(path, PathArray, 24);
-}
-
-void CPWL_Utils::GetGraphics_Tag(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fWidth = crBBox.right - crBBox.left;
- FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.1f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight*0.5f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.3f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.1f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.1f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.3f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.3f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.5f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.7f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.7f), PWLPT_LINETO)
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 12);
- else
- GetPathDataFromArray(path, PathArray, 12);
-}
-
-void CPWL_Utils::GetGraphics_Foxit(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
-{
- FX_FLOAT fOutWidth = crBBox.right - crBBox.left;
- FX_FLOAT fOutHeight = crBBox.top - crBBox.bottom;
-
- CPDF_Rect crInBox = crBBox;
- crInBox.left = crBBox.left + fOutWidth*0.08f;
- crInBox.right = crBBox.right - fOutWidth*0.08f;
- crInBox.top = crBBox.top - fOutHeight*0.08f;
- crInBox.bottom = crBBox.bottom + fOutHeight*0.08f;
-
- FX_FLOAT fWidth = crInBox.right - crInBox.left;
- FX_FLOAT fHeight = crInBox.top - crInBox.bottom;
-
- CPWL_PathData PathArray[] =
- {
- CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f, crInBox.top), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f, crInBox.top - PWL_BEZIER * fHeight * 0.4f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f - PWL_BEZIER * fWidth * 0.45f, crInBox.top - fHeight*0.4f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.4f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_LINETO),
-
- CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.60f, crInBox.top), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f, crInBox.top), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f, crInBox.top - PWL_BEZIER * fHeight * 0.7f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f - PWL_BEZIER * fWidth * 0.75f, crInBox.top - fHeight*0.7f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.7f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.55f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crInBox.left + PWL_BEZIER * fWidth*0.60f, crInBox.top - fHeight*0.55f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top - PWL_BEZIER * fHeight * 0.55f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top), PWLPT_BEZIERTO),
-
- CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top - PWL_BEZIER * fHeight * 0.85f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f - PWL_BEZIER * fWidth * 0.90f, crInBox.top - fHeight*0.85f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.85f), PWLPT_BEZIERTO),
- CPWL_PathData(CPWL_Point(crInBox.left, crInBox.bottom), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crInBox.right, crInBox.bottom), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crInBox.right, crInBox.top), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top), PWLPT_LINETO),
-
- /*
- CPWL_PathData(CPWL_Point(crBBox.left, crBBox.top), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.right, crBBox.top), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right, crBBox.bottom), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left, crBBox.bottom), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left, crBBox.top), PWLPT_LINETO),
-
- CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_MOVETO),
- CPWL_PathData(CPWL_Point(crBBox.right-fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.right-fOutWidth*0.04f, crBBox.bottom+fOutHeight*0.04f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.bottom+fOutHeight*0.04f), PWLPT_LINETO),
- CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_LINETO),
- */
- };
-
- if(type == PWLPT_STREAM)
- sPathData = GetAppStreamFromArray(PathArray, 23);
- else
- GetPathDataFromArray(path, PathArray, 23);
-}
-
-void CPWL_Color::ConvertColorType(FX_INT32 nColorType)
-{
- switch (this->nColorType)
- {
- case COLORTYPE_TRANSPARENT:
- break;
- case COLORTYPE_GRAY:
- switch (nColorType)
- {
- case COLORTYPE_RGB:
- CPWL_Utils::ConvertGRAY2RGB(this->fColor1, this->fColor1, this->fColor2, this->fColor3);
- break;
- case COLORTYPE_CMYK:
- CPWL_Utils::ConvertGRAY2CMYK(this->fColor1, this->fColor1, this->fColor2, this->fColor3, this->fColor4);
- break;
- }
- break;
- case COLORTYPE_RGB:
- switch (nColorType)
- {
- case COLORTYPE_GRAY:
- CPWL_Utils::ConvertRGB2GRAY(this->fColor1, this->fColor2, this->fColor3, this->fColor1);
- break;
- case COLORTYPE_CMYK:
- CPWL_Utils::ConvertRGB2CMYK(this->fColor1, this->fColor2, this->fColor3, this->fColor1, this->fColor2, this->fColor3, this->fColor4);
- break;
- }
- break;
- case COLORTYPE_CMYK:
- switch (nColorType)
- {
- case COLORTYPE_GRAY:
- CPWL_Utils::ConvertCMYK2GRAY(this->fColor1, this->fColor2, this->fColor3, this->fColor4, this->fColor1);
- break;
- case COLORTYPE_RGB:
- CPWL_Utils::ConvertCMYK2RGB(this->fColor1, this->fColor2, this->fColor3, this->fColor4, this->fColor1, this->fColor2, this->fColor3);
- break;
- }
- break;
- }
- this->nColorType = nColorType;
-}
-
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_Utils.h" +#include "../../include/pdfwindow/PWL_Icon.h" + +#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) +#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) +#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) +#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb)) + +/* ---------------------------- CPWL_Utils ------------------------------ */ + +CFX_ByteString CPWL_Utils::GetAppStreamFromArray(const CPWL_PathData* pPathData, FX_INT32 nCount) +{ + CFX_ByteTextBuf csAP; + + for (FX_INT32 i=0; i<nCount; i++) + { + switch (pPathData[i].type) + { + case PWLPT_MOVETO: + csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " m\n"; + break; + case PWLPT_LINETO: + csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " l\n"; + break; + case PWLPT_BEZIERTO: + csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " " + << pPathData[i+1].point.x << " " << pPathData[i+1].point.y << " " + << pPathData[i+2].point.x << " " << pPathData[i+2].point.y << " c\n"; + + i += 2; + break; + default: + break; + } + } + + return csAP.GetByteString(); +} + +void CPWL_Utils::GetPathDataFromArray(CFX_PathData& path, const CPWL_PathData* pPathData, FX_INT32 nCount) +{ + path.SetPointCount(nCount); + + for (FX_INT32 i=0; i<nCount; i++) + { + switch (pPathData[i].type) + { + case PWLPT_MOVETO: + path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_MOVETO); + break; + case PWLPT_LINETO: + path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_LINETO); + break; + case PWLPT_BEZIERTO: + path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_BEZIERTO); + break; + default: + break; + } + } +} + + +CPDF_Rect CPWL_Utils::MaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2) +{ + CPDF_Rect rcRet; + + rcRet.left = PWL_MIN(rect1.left,rect2.left); + rcRet.bottom = PWL_MIN(rect1.bottom,rect2.bottom); + rcRet.right = PWL_MAX(rect1.right,rect2.right); + rcRet.top = PWL_MAX(rect1.top,rect2.top); + + return rcRet; +} + +CPDF_Rect CPWL_Utils::OffsetRect(const CPDF_Rect & rect,FX_FLOAT x,FX_FLOAT y) +{ + return CPDF_Rect(rect.left + x,rect.bottom + y, + rect.right + x,rect.top + y); +} + +FX_BOOL CPWL_Utils::ContainsRect(const CPDF_Rect& rcParent, const CPDF_Rect& rcChild) +{ + return rcChild.left >= rcParent.left && rcChild.bottom >= rcParent.bottom && + rcChild.right <= rcParent.right && rcChild.top <= rcParent.top; +} + +FX_BOOL CPWL_Utils::IntersectRect(const CPDF_Rect& rect1, const CPDF_Rect& rect2) +{ + FX_FLOAT left = rect1.left > rect2.left ? rect1.left : rect2.left; + FX_FLOAT right = rect1.right < rect2.right ? rect1.right : rect2.right; + FX_FLOAT bottom = rect1.bottom > rect2.bottom ? rect1.bottom : rect2.bottom; + FX_FLOAT top = rect1.top < rect2.top ? rect1.top : rect2.top; + + return left < right && bottom < top; +} + +CPDF_Point CPWL_Utils::OffsetPoint(const CPDF_Point& point,FX_FLOAT x,FX_FLOAT y) +{ + return CPDF_Point(point.x + x,point.y + y); +} + +CPVT_WordRange CPWL_Utils::OverlapWordRange(const CPVT_WordRange & wr1, const CPVT_WordRange & wr2) +{ + CPVT_WordRange wrRet; + + if (wr2.EndPos.WordCmp(wr1.BeginPos) < 0 || wr2.BeginPos.WordCmp(wr1.EndPos) > 0) return wrRet; + if (wr1.EndPos.WordCmp(wr2.BeginPos) < 0 || wr1.BeginPos.WordCmp(wr2.EndPos) > 0) return wrRet; + + if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0) + { + wrRet.BeginPos = wr2.BeginPos; + } + else + { + wrRet.BeginPos = wr1.BeginPos; + } + + if (wr1.EndPos.WordCmp(wr2.EndPos) < 0) + { + wrRet.EndPos = wr1.EndPos; + } + else + { + wrRet.EndPos = wr2.EndPos; + } + + return wrRet; +} + +CFX_ByteString CPWL_Utils::GetAP_Check(const CPDF_Rect & crBBox) +{ + CFX_ByteTextBuf csAP; + + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + const FX_INT32 num = 8; + + CPWL_Point pts[num*3] = + { + //1 + CPWL_Point(0.28f, 0.52f), + CPWL_Point(0.27f, 0.48f), + CPWL_Point(0.29f, 0.40f), + + //2 + CPWL_Point(0.30f, 0.33f), + CPWL_Point(0.31f, 0.29f), + CPWL_Point(0.31f, 0.28f), + + //3 + CPWL_Point(0.39f, 0.28f), + CPWL_Point(0.49f, 0.29f), + CPWL_Point(0.77f, 0.67f), + + //4 + CPWL_Point(0.76f, 0.68f), + CPWL_Point(0.78f, 0.69f), + CPWL_Point(0.76f, 0.75f), + + //5 + CPWL_Point(0.76f, 0.75f), + CPWL_Point(0.73f, 0.80f), + CPWL_Point(0.68f, 0.75f), + + //6 + CPWL_Point(0.68f, 0.74f), + CPWL_Point(0.68f, 0.74f), + CPWL_Point(0.44f, 0.47f), + + //7 + CPWL_Point(0.43f, 0.47f), + CPWL_Point(0.40f, 0.47f), + CPWL_Point(0.41f, 0.58f), + + //8 + CPWL_Point(0.40f, 0.60f), + CPWL_Point(0.28f, 0.66f), + CPWL_Point(0.30f, 0.56f) + }; + + for (FX_INT32 j=0; j<num*3; j++) + { + pts[j].x *= fWidth; + pts[j].x += crBBox.left; + + pts[j].y *= fHeight; + pts[j].y += crBBox.bottom; + } + + csAP << pts[0].x << " " << pts[0].y << " m\n"; + + for (FX_INT32 i=0; i<num; i++) + { + FX_INT32 nCur = i*3; + FX_INT32 n1 = i*3 + 1; + FX_INT32 n2 = i*3 + 2; + FX_INT32 nNext = (i < num-1 ? (i+1)*3 : 0); + + FX_FLOAT px1 = pts[n1].x - pts[nCur].x; + FX_FLOAT py1 = pts[n1].y - pts[nCur].y; + FX_FLOAT px2 = pts[n2].x - pts[nNext].x; + FX_FLOAT py2 = pts[n2].y - pts[nNext].y; + + csAP << pts[nCur].x + px1 * PWL_BEZIER << " " << pts[nCur].y + py1 * PWL_BEZIER << " " + << pts[nNext].x + px2 * PWL_BEZIER << " " << pts[nNext].y + py2 * PWL_BEZIER << " " + << pts[nNext].x << " " << pts[nNext].y << " c\n"; + } + + return csAP.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetAP_Circle(const CPDF_Rect & crBBox) +{ + CFX_ByteTextBuf csAP; + + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPDF_Point pt1(crBBox.left,crBBox.bottom + fHeight / 2); + CPDF_Point pt2(crBBox.left + fWidth / 2,crBBox.top); + CPDF_Point pt3(crBBox.right,crBBox.bottom + fHeight / 2); + CPDF_Point pt4(crBBox.left + fWidth / 2,crBBox.bottom); + + csAP << pt1.x << " " << pt1.y << " m\n"; + + FX_FLOAT px = pt2.x - pt1.x; + FX_FLOAT py = pt2.y - pt1.y; + + csAP << pt1.x << " " << pt1.y + py * PWL_BEZIER << " " + << pt2.x - px * PWL_BEZIER << " " << pt2.y << " " + << pt2.x << " " << pt2.y << " c\n"; + + px = pt3.x - pt2.x; + py = pt2.y - pt3.y; + + csAP << pt2.x + px * PWL_BEZIER << " " << pt2.y << " " + << pt3.x << " " << pt3.y + py * PWL_BEZIER << " " + << pt3.x << " " << pt3.y << " c\n"; + + px = pt3.x - pt4.x; + py = pt3.y - pt4.y; + + csAP << pt3.x << " " << pt3.y - py * PWL_BEZIER << " " + << pt4.x + px * PWL_BEZIER << " " << pt4.y << " " + << pt4.x << " " << pt4.y << " c\n"; + + px = pt4.x - pt1.x; + py = pt1.y - pt4.y; + + csAP << pt4.x - px * PWL_BEZIER << " " << pt4.y << " " + << pt1.x << " " << pt1.y - py * PWL_BEZIER << " " + << pt1.x << " " << pt1.y << " c\n"; + + return csAP.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetAP_Cross(const CPDF_Rect & crBBox) +{ + CFX_ByteTextBuf csAP; + + csAP << crBBox.left << " " << crBBox.top << " m\n"; + csAP << crBBox.right << " " << crBBox.bottom << " l\n"; + csAP << crBBox.left << " " << crBBox.bottom << " m\n"; + csAP << crBBox.right << " " << crBBox.top << " l\n"; + + return csAP.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetAP_Diamond(const CPDF_Rect & crBBox) +{ + CFX_ByteTextBuf csAP; + + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPDF_Point pt1(crBBox.left,crBBox.bottom + fHeight / 2); + CPDF_Point pt2(crBBox.left + fWidth / 2,crBBox.top); + CPDF_Point pt3(crBBox.right,crBBox.bottom + fHeight / 2); + CPDF_Point pt4(crBBox.left + fWidth / 2,crBBox.bottom); + + csAP << pt1.x << " " << pt1.y << " m\n"; + csAP << pt2.x << " " << pt2.y << " l\n"; + csAP << pt3.x << " " << pt3.y << " l\n"; + csAP << pt4.x << " " << pt4.y << " l\n"; + csAP << pt1.x << " " << pt1.y << " l\n"; + + return csAP.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetAP_Square(const CPDF_Rect & crBBox) +{ + CFX_ByteTextBuf csAP; + + csAP << crBBox.left << " " << crBBox.top << " m\n"; + csAP << crBBox.right << " " << crBBox.top << " l\n"; + csAP << crBBox.right << " " << crBBox.bottom << " l\n"; + csAP << crBBox.left << " " << crBBox.bottom << " l\n"; + csAP << crBBox.left << " " << crBBox.top << " l\n"; + + return csAP.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetAP_Star(const CPDF_Rect & crBBox) +{ + CFX_ByteTextBuf csAP; + + FX_FLOAT fRadius = (crBBox.top - crBBox.bottom)/(1+(FX_FLOAT)cos(PWL_PI/5.0f)); + CPDF_Point ptCenter = CPDF_Point((crBBox.left + crBBox.right) / 2.0f,(crBBox.top + crBBox.bottom) / 2.0f); + + FX_FLOAT px[5],py[5]; + + FX_FLOAT fAngel = PWL_PI/10.0f; + + for (FX_INT32 i=0; i<5; i++) + { + px[i] = ptCenter.x + fRadius * (FX_FLOAT)cos(fAngel); + py[i] = ptCenter.y + fRadius * (FX_FLOAT)sin(fAngel); + + fAngel += PWL_PI * 2 / 5.0f; + } + + csAP << px[0] << " " << py[0] << " m\n"; + + FX_INT32 nNext = 0; + for (FX_INT32 j=0; j<5; j++) + { + nNext += 2; + if (nNext >= 5) nNext -= 5; + csAP << px[nNext] << " " << py[nNext] << " l\n"; + } + + return csAP.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetAP_HalfCircle(const CPDF_Rect & crBBox,FX_FLOAT fRotate) +{ + CFX_ByteTextBuf csAP; + + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPDF_Point pt1(-fWidth/2,0); + CPDF_Point pt2(0,fHeight/2); + CPDF_Point pt3(fWidth/2,0); + + FX_FLOAT px,py; + + csAP << cos(fRotate) << " " << sin(fRotate) << " " << -sin(fRotate) << " " << cos(fRotate) << " " + << crBBox.left + fWidth / 2 << " " << crBBox.bottom + fHeight / 2 << " cm\n"; + + + csAP << pt1.x << " " << pt1.y << " m\n"; + + px = pt2.x - pt1.x; + py = pt2.y - pt1.y; + + csAP << pt1.x << " " << pt1.y + py * PWL_BEZIER << " " + << pt2.x - px * PWL_BEZIER << " " << pt2.y << " " + << pt2.x << " " << pt2.y << " c\n"; + + px = pt3.x - pt2.x; + py = pt2.y - pt3.y; + + csAP << pt2.x + px * PWL_BEZIER << " " << pt2.y << " " + << pt3.x << " " << pt3.y + py * PWL_BEZIER << " " + << pt3.x << " " << pt3.y << " c\n"; + + return csAP.GetByteString(); +} + + +CPDF_Rect CPWL_Utils::InflateRect(const CPDF_Rect & rcRect, FX_FLOAT fSize) +{ + if (rcRect.IsEmpty()) return rcRect; + + CPDF_Rect rcNew(rcRect.left - fSize, + rcRect.bottom - fSize, + rcRect.right + fSize, + rcRect.top + fSize); + rcNew.Normalize(); + return rcNew; +} + +CPDF_Rect CPWL_Utils::DeflateRect(const CPDF_Rect & rcRect, FX_FLOAT fSize) +{ + if (rcRect.IsEmpty()) return rcRect; + + CPDF_Rect rcNew(rcRect.left + fSize, + rcRect.bottom + fSize, + rcRect.right - fSize, + rcRect.top - fSize); + rcNew.Normalize(); + return rcNew; +} + +CPDF_Rect CPWL_Utils::ScaleRect(const CPDF_Rect & rcRect,FX_FLOAT fScale) +{ + FX_FLOAT fHalfWidth = (rcRect.right - rcRect.left) / 2.0f; + FX_FLOAT fHalfHeight = (rcRect.top - rcRect.bottom) / 2.0f; + + CPDF_Point ptCenter = CPDF_Point((rcRect.left + rcRect.right) / 2,(rcRect.top + rcRect.bottom) / 2); + + return CPDF_Rect(ptCenter.x - fHalfWidth * fScale, + ptCenter.y - fHalfHeight * fScale, + ptCenter.x + fHalfWidth * fScale, + ptCenter.y + fHalfHeight * fScale); +} + +CFX_ByteString CPWL_Utils::GetRectFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color) +{ + CFX_ByteTextBuf sAppStream; + + CFX_ByteString sColor = GetColorAppStream(color,TRUE); + if (sColor.GetLength() > 0) + { + sAppStream << "q\n" << sColor; + sAppStream << rect.left << " " << rect.bottom << " " + << rect.right - rect.left << " " << rect.top - rect.bottom << " re f\nQ\n"; + } + + return sAppStream.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetCircleFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color) +{ + CFX_ByteTextBuf sAppStream; + + CFX_ByteString sColor = GetColorAppStream(color,TRUE); + if (sColor.GetLength() > 0) + { + sAppStream << "q\n" << sColor << CPWL_Utils::GetAP_Circle(rect) << "f\nQ\n"; + } + + return sAppStream.GetByteString(); +} + +CPDF_Rect CPWL_Utils::GetCenterSquare(const CPDF_Rect & rect) +{ + FX_FLOAT fWidth = rect.right - rect.left; + FX_FLOAT fHeight = rect.top - rect.bottom; + + FX_FLOAT fCenterX = (rect.left + rect.right)/2.0f; + FX_FLOAT fCenterY = (rect.top + rect.bottom)/2.0f; + + FX_FLOAT fRadius = (fWidth > fHeight) ? fHeight / 2 : fWidth / 2; + + return CPDF_Rect(fCenterX - fRadius,fCenterY - fRadius,fCenterX + fRadius,fCenterY + fRadius); +} + +CFX_ByteString CPWL_Utils::GetEditAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, const CPVT_WordRange * pRange, + FX_BOOL bContinuous, FX_WORD SubWord) +{ + return IFX_Edit::GetEditAppearanceStream(pEdit,ptOffset,pRange,bContinuous,SubWord); +} + +CFX_ByteString CPWL_Utils::GetEditSelAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, + const CPVT_WordRange * pRange) +{ + return IFX_Edit::GetSelectAppearanceStream(pEdit,ptOffset,pRange); +} + +static CFX_ByteString GetSquigglyAppearanceStream(FX_FLOAT fStartX, FX_FLOAT fEndX, FX_FLOAT fY, FX_FLOAT fStep) +{ + CFX_ByteTextBuf sRet; + + sRet << "0 w\n" << fStartX << " " << fY << " m\n"; + + FX_FLOAT fx; + FX_INT32 i; + + for (i=1,fx=fStartX+fStep; fx<fEndX; fx+=fStep,i++) + { + sRet << fx << " " << fY + (i&1)*fStep << " l\n"; + } + + sRet << "S\n"; + + return sRet.GetByteString(); +} + +static CFX_ByteString GetWordSpellCheckAppearanceStream(IFX_Edit_Iterator* pIterator, const CPDF_Point & ptOffset, + const CPVT_WordRange & wrWord) +{ + CFX_ByteTextBuf sRet; + + FX_FLOAT fStartX = 0.0f; + FX_FLOAT fEndX = 0.0f; + FX_FLOAT fY = 0.0f; + FX_FLOAT fStep = 0.0f; + + FX_BOOL bBreak = FALSE; + + if (pIterator) + { + pIterator->SetAt(wrWord.BeginPos); + + do + { + CPVT_WordPlace place = pIterator->GetAt(); + + CPVT_Line line; + if (pIterator->GetLine(line)) + { + fY = line.ptLine.y; + fStep = (line.fLineAscent - line.fLineDescent) / 16.0f; + } + + if (place.LineCmp(wrWord.BeginPos) == 0) + { + pIterator->SetAt(wrWord.BeginPos); + CPVT_Word word; + if (pIterator->GetWord(word)) + { + fStartX = word.ptWord.x; + } + } + else + { + fStartX = line.ptLine.x; + } + + if (place.LineCmp(wrWord.EndPos) == 0) + { + pIterator->SetAt(wrWord.EndPos); + CPVT_Word word; + if (pIterator->GetWord(word)) + { + fEndX = word.ptWord.x + word.fWidth; + } + + bBreak = TRUE; + } + else + { + fEndX = line.ptLine.x + line.fLineWidth; + } + + sRet << GetSquigglyAppearanceStream(fStartX + ptOffset.x, fEndX + ptOffset.x, fY + ptOffset.y,fStep); + + if (bBreak) break; + } + while (pIterator->NextLine()); + } + + return sRet.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetSpellCheckAppStream(IFX_Edit* pEdit, IPWL_SpellCheck* pSpellCheck, const CPDF_Point & ptOffset, + const CPVT_WordRange * pRange) +{ + ASSERT(pEdit != NULL); + ASSERT(pSpellCheck != NULL); + + CFX_ByteTextBuf sRet; + + if (pRange && pRange->IsExist()) + { + if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) + { + pIterator->SetAt(pRange->BeginPos); + + FX_BOOL bLatinWord = FALSE; + CPVT_WordPlace wpWordStart; + CFX_ByteString sWord; + + CPVT_WordPlace oldplace; + while (pIterator->NextWord()) + { + CPVT_WordPlace place = pIterator->GetAt(); + if (pRange && place.WordCmp(pRange->EndPos) > 0) break; + + CPVT_Word word; + if (pIterator->GetWord(word)) + { + if (FX_EDIT_ISLATINWORD(word.Word)) + { + if (!bLatinWord) + { + wpWordStart = place; + bLatinWord = TRUE; + } + + sWord += (char)word.Word; + oldplace = place; + } + else + { + if (bLatinWord) + { + if (!pSpellCheck->CheckWord(sWord)) + { + sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace)); + pIterator->SetAt(place); + } + bLatinWord = FALSE; + } + + sWord.Empty(); + } + } + else + { + if (bLatinWord) + { + if (!pSpellCheck->CheckWord(sWord)) + sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace)); + bLatinWord = FALSE; + sWord.Empty(); + } + } + } + + if (bLatinWord) + { + if (!pSpellCheck->CheckWord(sWord)) + sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace)); + + bLatinWord = FALSE; + sWord.Empty(); + } + } + } + + return sRet.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetTextAppStream(const CPDF_Rect & rcBBox,IFX_Edit_FontMap * pFontMap, + const CFX_WideString & sText, FX_INT32 nAlignmentH, FX_INT32 nAlignmentV, + FX_FLOAT fFontSize, FX_BOOL bMultiLine, FX_BOOL bAutoReturn, const CPWL_Color & crText) +{ + CFX_ByteTextBuf sRet; + + if (IFX_Edit * pEdit = IFX_Edit::NewEdit()) + { + pEdit->SetFontMap(pFontMap); + + pEdit->SetPlateRect(rcBBox); + pEdit->SetAlignmentH(nAlignmentH); + pEdit->SetAlignmentV(nAlignmentV); + pEdit->SetMultiLine(bMultiLine); + pEdit->SetAutoReturn(bAutoReturn); + if (IsFloatZero(fFontSize)) + pEdit->SetAutoFontSize(TRUE); + else + pEdit->SetFontSize(fFontSize); + pEdit->Initialize(); + + pEdit->SetText(sText); + + CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit, CPDF_Point(0.0f,0.0f)); + if (sEdit.GetLength() > 0) + { + sRet << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n"; + } + + IFX_Edit::DelEdit(pEdit); + } + + return sRet.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetPushButtonAppStream(const CPDF_Rect & rcBBox, + IFX_Edit_FontMap * pFontMap, + CPDF_Stream * pIconStream, + CPDF_IconFit & IconFit, + const CFX_WideString & sLabel, + const CPWL_Color & crText, + FX_FLOAT fFontSize, + FX_INT32 nLayOut) +{ + const FX_FLOAT fAutoFontScale = 1.0f / 3.0f; + + if (IFX_Edit * pEdit = IFX_Edit::NewEdit()) + { + pEdit->SetFontMap(pFontMap); + + pEdit->SetAlignmentH(1); + pEdit->SetAlignmentV(1); + pEdit->SetMultiLine(FALSE); + pEdit->SetAutoReturn(FALSE); + if (IsFloatZero(fFontSize)) + pEdit->SetAutoFontSize(TRUE); + else + pEdit->SetFontSize(fFontSize); + pEdit->Initialize(); + pEdit->SetText(sLabel); + + CPDF_Rect rcLabelContent = pEdit->GetContentRect(); + + CPWL_Icon Icon; + PWL_CREATEPARAM cp; + cp.dwFlags = PWS_VISIBLE; + Icon.Create(cp); + Icon.SetIconFit(&IconFit); + Icon.SetPDFStream(pIconStream); + + CPDF_Rect rcLabel = CPDF_Rect(0,0,0,0); + CPDF_Rect rcIcon = CPDF_Rect(0,0,0,0); + FX_FLOAT fWidth = 0.0f; + FX_FLOAT fHeight = 0.0f; + + switch (nLayOut) + { + case PPBL_LABEL: + rcLabel = rcBBox; + rcIcon = CPDF_Rect(0,0,0,0); + break; + case PPBL_ICON: + rcIcon = rcBBox; + rcLabel = CPDF_Rect(0,0,0,0); + break; + case PPBL_ICONTOPLABELBOTTOM: + + if (pIconStream) + { + if (IsFloatZero(fFontSize)) + { + fHeight = rcBBox.top - rcBBox.bottom; + rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcBBox.bottom + fHeight * fAutoFontScale); + rcIcon = CPDF_Rect(rcBBox.left,rcLabel.top,rcBBox.right,rcBBox.top); + } + else + { + fHeight = rcLabelContent.Height(); + + if (rcBBox.bottom + fHeight > rcBBox.top) + { + rcIcon = CPDF_Rect(0,0,0,0); + rcLabel = rcBBox; + } + else + { + rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcBBox.bottom + fHeight); + rcIcon = CPDF_Rect(rcBBox.left,rcLabel.top,rcBBox.right,rcBBox.top); + } + } + } + else + { + rcLabel = rcBBox; + rcIcon = CPDF_Rect(0,0,0,0); + } + + break; + case PPBL_LABELTOPICONBOTTOM: + + if (pIconStream) + { + if (IsFloatZero(fFontSize)) + { + fHeight = rcBBox.top - rcBBox.bottom; + rcLabel = CPDF_Rect(rcBBox.left,rcBBox.top - fHeight * fAutoFontScale ,rcBBox.right,rcBBox.top); + rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcLabel.bottom); + } + else + { + fHeight = rcLabelContent.Height(); + + if (rcBBox.bottom + fHeight > rcBBox.top) + { + rcIcon = CPDF_Rect(0,0,0,0); + rcLabel = rcBBox; + } + else + { + rcLabel = CPDF_Rect(rcBBox.left,rcBBox.top - fHeight,rcBBox.right,rcBBox.top); + rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcLabel.bottom); + } + } + } + else + { + rcLabel = rcBBox; + rcIcon = CPDF_Rect(0,0,0,0); + } + + break; + case PPBL_ICONLEFTLABELRIGHT: + + if (pIconStream) + { + if (IsFloatZero(fFontSize)) + { + fWidth = rcBBox.right - rcBBox.left; + rcLabel = CPDF_Rect(rcBBox.right - fWidth * fAutoFontScale,rcBBox.bottom,rcBBox.right,rcBBox.top); + rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top); + + if (rcLabelContent.Width() < fWidth * fAutoFontScale) + { + } + else + { + if (rcLabelContent.Width() < fWidth) + { + rcLabel = CPDF_Rect(rcBBox.right - rcLabelContent.Width(),rcBBox.bottom,rcBBox.right,rcBBox.top); + rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top); + } + else + { + rcLabel = rcBBox; + rcIcon = CPDF_Rect(0,0,0,0); + } + } + } + else + { + fWidth = rcLabelContent.Width(); + + if (rcBBox.left + fWidth > rcBBox.right) + { + rcLabel = rcBBox; + rcIcon = CPDF_Rect(0,0,0,0); + } + else + { + rcLabel = CPDF_Rect(rcBBox.right - fWidth,rcBBox.bottom,rcBBox.right,rcBBox.top); + rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top); + } + } + } + else + { + rcLabel = rcBBox; + rcIcon = CPDF_Rect(0,0,0,0); + } + + break; + case PPBL_LABELLEFTICONRIGHT: + + if (pIconStream) + { + if (IsFloatZero(fFontSize)) + { + fWidth = rcBBox.right - rcBBox.left; + rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + fWidth * fAutoFontScale,rcBBox.top); + rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top); + + if (rcLabelContent.Width() < fWidth * fAutoFontScale) + { + } + else + { + if (rcLabelContent.Width() < fWidth) + { + rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + rcLabelContent.Width(),rcBBox.top); + rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top); + } + else + { + rcLabel = rcBBox; + rcIcon = CPDF_Rect(0,0,0,0); + } + } + } + else + { + fWidth = rcLabelContent.Width(); + + if (rcBBox.left + fWidth > rcBBox.right) + { + rcLabel = rcBBox; + rcIcon = CPDF_Rect(0,0,0,0); + } + else + { + rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + fWidth,rcBBox.top); + rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top); + } + } + } + else + { + rcLabel = rcBBox; + rcIcon = CPDF_Rect(0,0,0,0); + } + + break; + case PPBL_LABELOVERICON: + rcLabel = rcBBox; + rcIcon = rcBBox; + break; + } + + CFX_ByteTextBuf sAppStream,sTemp; + + if (!rcIcon.IsEmpty()) + { + Icon.Move(rcIcon, FALSE, FALSE); + sTemp << Icon.GetImageAppStream(); + } + + Icon.Destroy(); + + if (!rcLabel.IsEmpty()) + { + pEdit->SetPlateRect(rcLabel); + CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,0.0f)); + if (sEdit.GetLength() > 0) + { + sTemp << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n"; + } + } + + IFX_Edit::DelEdit(pEdit); + + if (sTemp.GetSize() > 0) + { + sAppStream << "q\n" << rcBBox.left << " " << rcBBox.bottom << " " + << rcBBox.right - rcBBox.left << " " << rcBBox.top - rcBBox.bottom << " re W n\n"; + sAppStream << sTemp << "Q\n"; + } + + return sAppStream.GetByteString(); + } + + return ""; +} + +CFX_ByteString CPWL_Utils::GetColorAppStream(const CPWL_Color & color,const FX_BOOL & bFillOrStroke) +{ + CFX_ByteTextBuf sColorStream; + + switch (color.nColorType) + { + case COLORTYPE_RGB: + sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " + << (bFillOrStroke ? "rg" : "RG") << "\n"; + break; + case COLORTYPE_GRAY: + sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") << "\n"; + break; + case COLORTYPE_CMYK: + sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " << color.fColor4 << " " + << (bFillOrStroke ? "k" : "K") << "\n"; + break; + } + + return sColorStream.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth, + const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom, + FX_INT32 nStyle, const CPWL_Dash & dash) +{ + CFX_ByteTextBuf sAppStream; + CFX_ByteString sColor; + + FX_FLOAT fLeft = rect.left; + FX_FLOAT fRight = rect.right; + FX_FLOAT fTop = rect.top; + FX_FLOAT fBottom = rect.bottom; + + if (fWidth > 0.0f) + { + FX_FLOAT fHalfWidth = fWidth / 2.0f; + + sAppStream << "q\n"; + + switch (nStyle) + { + default: + case PBS_SOLID: + sColor = CPWL_Utils::GetColorAppStream(color,TRUE); + if (sColor.GetLength() > 0) + { + sAppStream << sColor; + sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n"; + sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " " + << fRight - fLeft - fWidth * 2 << " " << fTop - fBottom - fWidth * 2 << " re\n"; + sAppStream << "f*\n"; + } + break; + case PBS_DASH: + sColor = CPWL_Utils::GetColorAppStream(color,FALSE); + if (sColor.GetLength() > 0) + { + sAppStream << sColor; + sAppStream << fWidth << " w" << " [" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n"; + sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " m\n"; + sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 << " l\n"; + sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 << " l\n"; + sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 << " l\n"; + sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " l S\n"; + } + break; + case PBS_BEVELED: + case PBS_INSET: + sColor = CPWL_Utils::GetColorAppStream(crLeftTop,TRUE); + if (sColor.GetLength() > 0) + { + sAppStream << sColor; + sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " m\n"; + sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth << " l\n"; + sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " l\n"; + sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n"; + sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n"; + sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l f\n"; + } + + sColor = CPWL_Utils::GetColorAppStream(crRightBottom,TRUE); + if (sColor.GetLength() > 0) + { + sAppStream << sColor; + sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " m\n"; + sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth << " l\n"; + sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " l\n"; + sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n"; + sAppStream << fRight - fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n"; + sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l f\n"; + } + + sColor = CPWL_Utils::GetColorAppStream(color,TRUE); + if (sColor.GetLength() > 0) + { + sAppStream << sColor; + sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n"; + sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " " + << fRight - fLeft - fHalfWidth * 2 << " " << fTop - fBottom - fHalfWidth * 2 << " re f*\n"; + } + break; + case PBS_UNDERLINED: + sColor = CPWL_Utils::GetColorAppStream(color,FALSE); + if (sColor.GetLength() > 0) + { + sAppStream << sColor; + sAppStream << fWidth << " w\n"; + sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n"; + sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n"; + } + break; + } + + sAppStream << "Q\n"; + } + + return sAppStream.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetCircleBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth, + const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom, + FX_INT32 nStyle, const CPWL_Dash & dash) +{ + CFX_ByteTextBuf sAppStream; + CFX_ByteString sColor; + + + + + + + if (fWidth > 0.0f) + { + sAppStream << "q\n"; + + switch (nStyle) + { + default: + case PBS_SOLID: + case PBS_UNDERLINED: + { + sColor = CPWL_Utils::GetColorAppStream(color,FALSE); + if (sColor.GetLength() > 0) + { + sAppStream << "q\n" << fWidth << " w\n" << sColor + << CPWL_Utils::GetAP_Circle(CPWL_Utils::DeflateRect(rect,fWidth / 2.0f)) + << " S\nQ\n"; + } + } + break; + case PBS_DASH: + { + sColor = CPWL_Utils::GetColorAppStream(color,FALSE); + if (sColor.GetLength() > 0) + { + sAppStream << "q\n" << fWidth << " w\n" + << "[" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n" + << sColor << CPWL_Utils::GetAP_Circle(CPWL_Utils::DeflateRect(rect,fWidth / 2.0f)) + << " S\nQ\n"; + } + } + break; + case PBS_BEVELED: + { + FX_FLOAT fHalfWidth = fWidth / 2.0f; + + sColor = CPWL_Utils::GetColorAppStream(color,FALSE); + if (sColor.GetLength() > 0) + { + sAppStream << "q\n" << fHalfWidth << " w\n" + << sColor << CPWL_Utils::GetAP_Circle(rect) + << " S\nQ\n"; + } + + sColor = CPWL_Utils::GetColorAppStream(crLeftTop,FALSE); + if (sColor.GetLength() > 0) + { + sAppStream << "q\n" << fHalfWidth << " w\n" + << sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI/4.0f) + << " S\nQ\n"; + } + + sColor = CPWL_Utils::GetColorAppStream(crRightBottom,FALSE); + if (sColor.GetLength() > 0) + { + sAppStream << "q\n" << fHalfWidth << " w\n" + << sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI*5/4.0f) + << " S\nQ\n"; + } + } + break; + case PBS_INSET: + { + FX_FLOAT fHalfWidth = fWidth / 2.0f; + + sColor = CPWL_Utils::GetColorAppStream(color,FALSE); + if (sColor.GetLength() > 0) + { + sAppStream << "q\n" << fHalfWidth << " w\n" + << sColor << CPWL_Utils::GetAP_Circle(rect) + << " S\nQ\n"; + } + + sColor = CPWL_Utils::GetColorAppStream(crLeftTop,FALSE); + if (sColor.GetLength() > 0) + { + sAppStream << "q\n" << fHalfWidth << " w\n" + << sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI/4.0f) + << " S\nQ\n"; + } + + sColor = CPWL_Utils::GetColorAppStream(crRightBottom,FALSE); + if (sColor.GetLength() > 0) + { + sAppStream << "q\n" << fHalfWidth << " w\n" + << sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI*5/4.0f) + << " S\nQ\n"; + } + } + break; + } + + sAppStream << "Q\n"; + } + + return sAppStream.GetByteString(); +} + +CPWL_Color CPWL_Utils::SubstractColor(const CPWL_Color & sColor,FX_FLOAT fColorSub) +{ + CPWL_Color sRet; + sRet.nColorType = sColor.nColorType; + + switch (sColor.nColorType) + { + case COLORTYPE_TRANSPARENT: + sRet.nColorType = COLORTYPE_RGB; + sRet.fColor1 = PWL_MAX(1 - fColorSub,0.0f); + sRet.fColor2 = PWL_MAX(1 - fColorSub,0.0f); + sRet.fColor3 = PWL_MAX(1 - fColorSub,0.0f); + break; + case COLORTYPE_RGB: + case COLORTYPE_GRAY: + case COLORTYPE_CMYK: + sRet.fColor1 = PWL_MAX(sColor.fColor1 - fColorSub,0.0f); + sRet.fColor2 = PWL_MAX(sColor.fColor2 - fColorSub,0.0f); + sRet.fColor3 = PWL_MAX(sColor.fColor3 - fColorSub,0.0f); + sRet.fColor4 = PWL_MAX(sColor.fColor4 - fColorSub,0.0f); + break; + } + + return sRet; +} + +CPWL_Color CPWL_Utils::DevideColor(const CPWL_Color & sColor,FX_FLOAT fColorDevide) +{ + CPWL_Color sRet; + sRet.nColorType = sColor.nColorType; + + switch (sColor.nColorType) + { + case COLORTYPE_TRANSPARENT: + sRet.nColorType = COLORTYPE_RGB; + sRet.fColor1 = 1 / fColorDevide; + sRet.fColor2 = 1 / fColorDevide; + sRet.fColor3 = 1 / fColorDevide; + break; + case COLORTYPE_RGB: + case COLORTYPE_GRAY: + case COLORTYPE_CMYK: + sRet = sColor; + sRet.fColor1 /= fColorDevide; + sRet.fColor2 /= fColorDevide; + sRet.fColor3 /= fColorDevide; + sRet.fColor4 /= fColorDevide; + break; + } + + return sRet; +} + +CFX_ByteString CPWL_Utils::GetAppStream_Check(const CPDF_Rect & rcBBox, const CPWL_Color & crText) +{ + CFX_ByteTextBuf sAP; + sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Check(rcBBox) << "f\nQ\n"; + return sAP.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetAppStream_Circle(const CPDF_Rect & rcBBox, const CPWL_Color & crText) +{ + CFX_ByteTextBuf sAP; + sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Circle(rcBBox) << "f\nQ\n"; + return sAP.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetAppStream_Cross(const CPDF_Rect & rcBBox, const CPWL_Color & crText) +{ + CFX_ByteTextBuf sAP; + sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,FALSE) << CPWL_Utils::GetAP_Cross(rcBBox) << "S\nQ\n"; + return sAP.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetAppStream_Diamond(const CPDF_Rect & rcBBox, const CPWL_Color & crText) +{ + CFX_ByteTextBuf sAP; + sAP << "q\n1 w\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Diamond(rcBBox) << "f\nQ\n"; + return sAP.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetAppStream_Square(const CPDF_Rect & rcBBox, const CPWL_Color & crText) +{ + CFX_ByteTextBuf sAP; + sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Square(rcBBox) << "f\nQ\n"; + return sAP.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetAppStream_Star(const CPDF_Rect & rcBBox, const CPWL_Color & crText) +{ + CFX_ByteTextBuf sAP; + sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Star(rcBBox) << "f\nQ\n"; + return sAP.GetByteString(); +} + +CFX_ByteString CPWL_Utils::GetCheckBoxAppStream(const CPDF_Rect & rcBBox, + FX_INT32 nStyle, + const CPWL_Color & crText) +{ + CPDF_Rect rcCenter = GetCenterSquare(rcBBox); + switch (nStyle) + { + default: + case PCS_CHECK: + return GetAppStream_Check(rcCenter,crText); + case PCS_CIRCLE: + return GetAppStream_Circle(ScaleRect(rcCenter,2.0f/3.0f),crText); + case PCS_CROSS: + return GetAppStream_Cross(rcCenter,crText); + case PCS_DIAMOND: + return GetAppStream_Diamond(ScaleRect(rcCenter,2.0f/3.0f),crText); + case PCS_SQUARE: + return GetAppStream_Square(ScaleRect(rcCenter,2.0f/3.0f),crText); + case PCS_STAR: + return GetAppStream_Star(ScaleRect(rcCenter,2.0f/3.0f),crText); + } +} + +CFX_ByteString CPWL_Utils::GetRadioButtonAppStream(const CPDF_Rect & rcBBox, + FX_INT32 nStyle, + const CPWL_Color & crText) +{ + CPDF_Rect rcCenter = GetCenterSquare(rcBBox); + switch (nStyle) + { + default: + case PCS_CHECK: + return GetAppStream_Check(rcCenter,crText); + case PCS_CIRCLE: + return GetAppStream_Circle(ScaleRect(rcCenter,1.0f/2.0f),crText); + case PCS_CROSS: + return GetAppStream_Cross(rcCenter,crText); + case PCS_DIAMOND: + return GetAppStream_Diamond(ScaleRect(rcCenter,2.0f/3.0f),crText); + case PCS_SQUARE: + return GetAppStream_Square(ScaleRect(rcCenter,2.0f/3.0f),crText); + case PCS_STAR: + return GetAppStream_Star(ScaleRect(rcCenter,2.0f/3.0f),crText); + } +} + +CFX_ByteString CPWL_Utils::GetDropButtonAppStream(const CPDF_Rect & rcBBox) +{ + CFX_ByteTextBuf sAppStream; + + if (!rcBBox.IsEmpty()) + { + sAppStream << "q\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_RGB,220.0f/255.0f,220.0f/255.0f,220.0f/255.0f),TRUE); + sAppStream << rcBBox.left << " " << rcBBox.bottom << " " + << rcBBox.right - rcBBox.left << " " << rcBBox.top - rcBBox.bottom << " re f\n"; + sAppStream << "Q\n"; + + sAppStream << "q\n" << + CPWL_Utils::GetBorderAppStream(rcBBox,2,CPWL_Color(COLORTYPE_GRAY,0),CPWL_Color(COLORTYPE_GRAY,1),CPWL_Color(COLORTYPE_GRAY,0.5),PBS_BEVELED,CPWL_Dash(3,0,0)) + << "Q\n"; + + CPDF_Point ptCenter = CPDF_Point((rcBBox.left + rcBBox.right)/2,(rcBBox.top + rcBBox.bottom)/2); + if (IsFloatBigger(rcBBox.right - rcBBox.left,6) && IsFloatBigger(rcBBox.top - rcBBox.bottom,6)) + { + sAppStream << "q\n" << " 0 g\n"; + sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n"; + sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n"; + sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n"; + sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n"; + sAppStream << "Q\n"; + } + } + + return sAppStream.GetByteString(); +} + +void CPWL_Utils::ConvertCMYK2GRAY(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dGray) +{ + if (dC<0 || dC>1 || dM<0 || dM>1 || dY < 0 || dY >1 || dK < 0 || dK >1) + return; + dGray = 1.0f - FX_MIN(1.0f,0.3f*dC+0.59f * dM + 0.11f*dY+dK); +} + +void CPWL_Utils::ConvertGRAY2CMYK(FX_FLOAT dGray,FX_FLOAT &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK) +{ + if (dGray <0 || dGray >1) + return; + dC = 0.0f; + dM = 0.0f; + dY = 0.0f; + dK = 1.0f-dGray; +} + +void CPWL_Utils::ConvertGRAY2RGB(FX_FLOAT dGray,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB) +{ + if (dGray <0 || dGray >1) + return; + dR = dGray; + dG = dGray; + dB = dGray; +} + +void CPWL_Utils::ConvertRGB2GRAY(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dGray) +{ + if (dR<0 || dR>1 || dG<0 || dG > 0 || dB < 0 || dB >1) + return; + dGray = 0.3f*dR+0.59f*dG+0.11f*dB; +} + +void CPWL_Utils::ConvertCMYK2RGB(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB) +{ + if (dC <0 || dC>1 || dM < 0 || dM > 1 || dY < 0 || dY > 1 || dK < 0 || dK > 1 ) + return; + dR = 1.0f - FX_MIN(1.0f, dC + dK); + dG = 1.0f - FX_MIN(1.0f, dM + dK); + dB = 1.0f - FX_MIN(1.0f, dY + dK); +} + +void CPWL_Utils::ConvertRGB2CMYK(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK) +{ + if (dR<0 || dR>1 || dG<0 || dG>1 || dB<0 || dB>1) + return; + + dC = 1.0f - dR; + dM = 1.0f - dG; + dY = 1.0f - dB; + dK = FX_MIN(dC, FX_MIN(dM, dY)); +} + +void CPWL_Utils::PWLColorToARGB(const CPWL_Color& color, FX_INT32& alpha, FX_FLOAT& red, FX_FLOAT& green, FX_FLOAT& blue) +{ + switch (color.nColorType) + { + case COLORTYPE_TRANSPARENT: + { + alpha = 0; + } + break; + case COLORTYPE_GRAY: + { + ConvertGRAY2RGB(color.fColor1, red, green, blue); + } + break; + case COLORTYPE_RGB: + { + red = color.fColor1; + green = color.fColor2; + blue = color.fColor3; + } + break; + case COLORTYPE_CMYK: + { + ConvertCMYK2RGB(color.fColor1, color.fColor2, color.fColor3, color.fColor4, + red, green, blue); + } + break; + } +} + +FX_COLORREF CPWL_Utils::PWLColorToFXColor(const CPWL_Color& color, FX_INT32 nTransparancy) +{ + FX_INT32 nAlpha = nTransparancy; + FX_FLOAT dRed = 0; + FX_FLOAT dGreen = 0; + FX_FLOAT dBlue = 0; + + PWLColorToARGB(color, nAlpha, dRed, dGreen, dBlue); + + return ArgbEncode(nAlpha, (FX_INT32)(dRed*255), (FX_INT32)(dGreen*255), (FX_INT32)(dBlue*255)); +} + +void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect, + const FX_COLORREF & color) +{ + CFX_PathData path; + CPDF_Rect rcTemp(rect); + path.AppendRect(rcTemp.left,rcTemp.bottom,rcTemp.right,rcTemp.top); + pDevice->DrawPath(&path, pUser2Device, NULL, color, 0, FXFILL_WINDING); +} + +void CPWL_Utils::DrawFillArea(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, + const CPDF_Point* pPts, FX_INT32 nCount, const FX_COLORREF& color) +{ + CFX_PathData path; + path.SetPointCount(nCount); + + path.SetPoint(0, pPts[0].x, pPts[0].y, FXPT_MOVETO); + for (FX_INT32 i=1; i<nCount; i++) + path.SetPoint(i, pPts[i].x, pPts[i].y, FXPT_LINETO); + + pDevice->DrawPath(&path, pUser2Device, NULL, color, 0, FXFILL_ALTERNATE); +} + +void CPWL_Utils::DrawStrokeRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect, + const FX_COLORREF & color, FX_FLOAT fWidth) +{ + CFX_PathData path; + CPDF_Rect rcTemp(rect); + path.AppendRect(rcTemp.left,rcTemp.bottom,rcTemp.right,rcTemp.top); + + CFX_GraphStateData gsd; + gsd.m_LineWidth = fWidth; + + pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE); +} + +void CPWL_Utils::DrawStrokeLine(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, + const CPDF_Point & ptMoveTo, const CPDF_Point & ptLineTo, const FX_COLORREF & color, FX_FLOAT fWidth) +{ + CFX_PathData path; + path.SetPointCount(2); + path.SetPoint(0, ptMoveTo.x, ptMoveTo.y, FXPT_MOVETO); + path.SetPoint(1, ptLineTo.x, ptLineTo.y, FXPT_LINETO); + + CFX_GraphStateData gsd; + gsd.m_LineWidth = fWidth; + + pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE); +} + +void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect, + const CPWL_Color & color, FX_INT32 nTransparancy) +{ + CPWL_Utils::DrawFillRect(pDevice,pUser2Device,rect,PWLColorToFXColor(color,nTransparancy)); +} + +void CPWL_Utils::DrawShadow(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, + FX_BOOL bVertical, FX_BOOL bHorizontal, CPDF_Rect rect, + FX_INT32 nTransparancy, FX_INT32 nStartGray, FX_INT32 nEndGray) +{ + FX_FLOAT fStepGray = 1.0f; + + if (bVertical) + { + fStepGray = (nEndGray - nStartGray) / rect.Height(); + + for (FX_FLOAT fy=rect.bottom+0.5f; fy<=rect.top-0.5f; fy+=1.0f) + { + FX_INT32 nGray = nStartGray + (FX_INT32)(fStepGray * (fy-rect.bottom)); + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, CPDF_Point(rect.left, fy), + CPDF_Point(rect.right, fy), ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f); + } + } + + if (bHorizontal) + { + fStepGray = (nEndGray - nStartGray) / rect.Width(); + + for (FX_FLOAT fx=rect.left+0.5f; fx<=rect.right-0.5f; fx+=1.0f) + { + FX_INT32 nGray = nStartGray + (FX_INT32)(fStepGray * (fx-rect.left)); + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, CPDF_Point(fx, rect.bottom), + CPDF_Point(fx, rect.top), ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f); + } + } +} + +void CPWL_Utils::DrawBorder(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, + const CPDF_Rect & rect, FX_FLOAT fWidth, + const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom, + FX_INT32 nStyle, const CPWL_Dash & dash, FX_INT32 nTransparancy) +{ + FX_FLOAT fLeft = rect.left; + FX_FLOAT fRight = rect.right; + FX_FLOAT fTop = rect.top; + FX_FLOAT fBottom = rect.bottom; + + if (fWidth > 0.0f) + { + FX_FLOAT fHalfWidth = fWidth / 2.0f; + + switch (nStyle) + { + default: + case PBS_SOLID: + { + CFX_PathData path; + path.AppendRect(fLeft, fBottom, fRight, fTop); + path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth, fTop - fWidth); + pDevice->DrawPath(&path, pUser2Device, NULL, PWLColorToFXColor(color,nTransparancy), 0, FXFILL_ALTERNATE); + } + break; + case PBS_DASH: + { + CFX_PathData path; + + path.SetPointCount(5); + path.SetPoint(0, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_MOVETO); + path.SetPoint(1, fLeft + fWidth / 2.0f, fTop - fWidth / 2.0f, FXPT_LINETO); + path.SetPoint(2, fRight - fWidth / 2.0f, fTop - fWidth / 2.0f, FXPT_LINETO); + path.SetPoint(3, fRight - fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_LINETO); + path.SetPoint(4, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_LINETO); + + CFX_GraphStateData gsd; + gsd.SetDashCount(2); + gsd.m_DashArray[0] = 3.0f; + gsd.m_DashArray[1] = 3.0f; + gsd.m_DashPhase = 0; + + gsd.m_LineWidth = fWidth; + pDevice->DrawPath(&path, pUser2Device, &gsd, 0, PWLColorToFXColor(color,nTransparancy), FXFILL_WINDING); + } + break; + case PBS_BEVELED: + case PBS_INSET: + { + CFX_GraphStateData gsd; + gsd.m_LineWidth = fHalfWidth; + + CFX_PathData pathLT; + + pathLT.SetPointCount(7); + pathLT.SetPoint(0, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_MOVETO); + pathLT.SetPoint(1, fLeft + fHalfWidth, fTop - fHalfWidth, FXPT_LINETO); + pathLT.SetPoint(2, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO); + pathLT.SetPoint(3, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO); + pathLT.SetPoint(4, fLeft + fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO); + pathLT.SetPoint(5, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO); + pathLT.SetPoint(6, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO); + + pDevice->DrawPath(&pathLT, pUser2Device, &gsd, PWLColorToFXColor(crLeftTop,nTransparancy), 0, FXFILL_ALTERNATE); + + CFX_PathData pathRB; + + pathRB.SetPointCount(7); + pathRB.SetPoint(0, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_MOVETO); + pathRB.SetPoint(1, fRight - fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO); + pathRB.SetPoint(2, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO); + pathRB.SetPoint(3, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO); + pathRB.SetPoint(4, fRight - fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO); + pathRB.SetPoint(5, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO); + pathRB.SetPoint(6, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO); + + pDevice->DrawPath(&pathRB, pUser2Device, &gsd, PWLColorToFXColor(crRightBottom,nTransparancy), 0, FXFILL_ALTERNATE); + + CFX_PathData path; + + path.AppendRect(fLeft, fBottom, fRight, fTop); + path.AppendRect(fLeft + fHalfWidth, fBottom + fHalfWidth, fRight - fHalfWidth, fTop - fHalfWidth); + + pDevice->DrawPath(&path, pUser2Device, &gsd, PWLColorToFXColor(color,nTransparancy), 0, FXFILL_ALTERNATE); + } + break; + case PBS_UNDERLINED: + { + CFX_PathData path; + + path.SetPointCount(2); + path.SetPoint(0, fLeft, fBottom + fWidth / 2, FXPT_MOVETO); + path.SetPoint(1, fRight, fBottom + fWidth / 2, FXPT_LINETO); + + CFX_GraphStateData gsd; + gsd.m_LineWidth = fWidth; + + pDevice->DrawPath(&path, pUser2Device, &gsd,0, PWLColorToFXColor(color,nTransparancy), FXFILL_ALTERNATE); + } + break; + case PBS_SHADOW: + { + CFX_PathData path; + path.AppendRect(fLeft, fBottom, fRight, fTop); + path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth, fTop - fWidth); + pDevice->DrawPath(&path, pUser2Device, NULL, PWLColorToFXColor(color,nTransparancy/2), 0, FXFILL_ALTERNATE); + } + break; + } + } +} + +static void AddSquigglyPath(CFX_PathData & PathData, FX_FLOAT fStartX, FX_FLOAT fEndX, FX_FLOAT fY, FX_FLOAT fStep) +{ + PathData.AddPointCount(1); + PathData.SetPoint(PathData.GetPointCount() - 1, fStartX, fY, FXPT_MOVETO); + + FX_FLOAT fx; + FX_INT32 i; + + for (i=1,fx=fStartX+fStep; fx<fEndX; fx+=fStep,i++) + { + PathData.AddPointCount(1); + PathData.SetPoint(PathData.GetPointCount() - 1, fx, fY + (i&1)*fStep, FXPT_LINETO); + } +} + +static void AddSpellCheckObj(CFX_PathData & PathData, IFX_Edit* pEdit, const CPVT_WordRange& wrWord) +{ + FX_FLOAT fStartX = 0.0f; + FX_FLOAT fEndX = 0.0f; + FX_FLOAT fY = 0.0f; + FX_FLOAT fStep = 0.0f; + + FX_BOOL bBreak = FALSE; + + if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) + { + pIterator->SetAt(wrWord.BeginPos); + + do + { + CPVT_WordPlace place = pIterator->GetAt(); + + CPVT_Line line; + if (pIterator->GetLine(line)) + { + fY = line.ptLine.y; + fStep = (line.fLineAscent - line.fLineDescent) / 16.0f; + } + + if (place.LineCmp(wrWord.BeginPos) == 0) + { + pIterator->SetAt(wrWord.BeginPos); + CPVT_Word word; + if (pIterator->GetWord(word)) + { + fStartX = word.ptWord.x; + } + } + else + { + fStartX = line.ptLine.x; + } + + if (place.LineCmp(wrWord.EndPos) == 0) + { + pIterator->SetAt(wrWord.EndPos); + CPVT_Word word; + if (pIterator->GetWord(word)) + { + fEndX = word.ptWord.x + word.fWidth; + } + + bBreak = TRUE; + } + else + { + fEndX = line.ptLine.x + line.fLineWidth; + } + + AddSquigglyPath(PathData, fStartX, fEndX, fY, fStep); + + if (bBreak) break; + } + while (pIterator->NextLine()); + } +} + +void CPWL_Utils::DrawEditSpellCheck(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, + const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, + IPWL_SpellCheck * pSpellCheck) +{ + const FX_COLORREF crSpell = ArgbEncode(255,255,0,0); + + //for spellcheck + FX_BOOL bLatinWord = FALSE; + CPVT_WordPlace wpWordStart; + CFX_ByteString sLatinWord; + + CFX_PathData pathSpell; + + pDevice->SaveState(); + + if (!rcClip.IsEmpty()) + { + CPDF_Rect rcTemp = rcClip; + pUser2Device->TransformRect(rcTemp); + FX_RECT rcDevClip; + rcDevClip.left = (FX_INT32)rcTemp.left; + rcDevClip.right = (FX_INT32)rcTemp.right; + rcDevClip.top = (FX_INT32)rcTemp.top; + rcDevClip.bottom = (FX_INT32)rcTemp.bottom; + pDevice->SetClip_Rect(&rcDevClip); + } + + if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) + { + if (pEdit->GetFontMap()) + { + if (pRange) + pIterator->SetAt(pRange->BeginPos); + else + pIterator->SetAt(0); + + CPVT_WordPlace oldplace; + + while (pIterator->NextWord()) + { + CPVT_WordPlace place = pIterator->GetAt(); + if (pRange && place.WordCmp(pRange->EndPos) > 0) break; + + CPVT_Word word; + if (pIterator->GetWord(word)) + { + if (FX_EDIT_ISLATINWORD(word.Word)) + { + if (!bLatinWord) + { + wpWordStart = place; + bLatinWord = TRUE; + } + + sLatinWord += (char)word.Word; + } + else + { + if (bLatinWord) + { + if (!sLatinWord.IsEmpty()) + { + if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord)) + { + AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace)); + pIterator->SetAt(place); + } + } + bLatinWord = FALSE; + } + + sLatinWord.Empty(); + } + + oldplace = place; + } + else + { + if (bLatinWord) + { + if (!sLatinWord.IsEmpty()) + { + if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord)) + { + AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace)); + pIterator->SetAt(place); + } + } + bLatinWord = FALSE; + } + + sLatinWord.Empty(); + } + } + + if (!sLatinWord.IsEmpty()) + { + if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord)) + { + AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace)); + } + } + } + } + + CFX_GraphStateData gsd; + gsd.m_LineWidth = 0; + if (pathSpell.GetPointCount() > 0) + pDevice->DrawPath(&pathSpell, pUser2Device, &gsd, 0, crSpell, FXFILL_ALTERNATE); + + pDevice->RestoreState(); +} + +FX_BOOL CPWL_Utils::IsBlackOrWhite(const CPWL_Color& color) +{ + switch (color.nColorType) + { + case COLORTYPE_TRANSPARENT: + return FALSE; + case COLORTYPE_GRAY: + return color.fColor1 < 0.5f; + case COLORTYPE_RGB: + return color.fColor1 + color.fColor2 + color.fColor3 < 1.5f; + case COLORTYPE_CMYK: + return color.fColor1 + color.fColor2 + color.fColor3 + color.fColor4 > 2.0f; + } + + return TRUE; +} + +CPWL_Color CPWL_Utils::GetReverseColor(const CPWL_Color& color) +{ + CPWL_Color crRet = color; + + switch (color.nColorType) + { + case COLORTYPE_GRAY: + crRet.fColor1 = 1.0f - crRet.fColor1; + break; + case COLORTYPE_RGB: + crRet.fColor1 = 1.0f - crRet.fColor1; + crRet.fColor2 = 1.0f - crRet.fColor2; + crRet.fColor3 = 1.0f - crRet.fColor3; + break; + case COLORTYPE_CMYK: + crRet.fColor1 = 1.0f - crRet.fColor1; + crRet.fColor2 = 1.0f - crRet.fColor2; + crRet.fColor3 = 1.0f - crRet.fColor3; + crRet.fColor4 = 1.0f - crRet.fColor4; + break; + } + + return crRet; +} + +CFX_ByteString CPWL_Utils::GetIconAppStream(FX_INT32 nType, const CPDF_Rect& rect, const CPWL_Color& crFill, + const CPWL_Color& crStroke) +{ + CFX_ByteString sAppStream = CPWL_Utils::GetColorAppStream(crStroke, FALSE); + sAppStream += CPWL_Utils::GetColorAppStream(crFill, TRUE); + + CFX_ByteString sPath; + CFX_PathData path; + + switch (nType) + { + case PWL_ICONTYPE_CHECKMARK: + GetGraphics_Checkmark(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_CIRCLE: + GetGraphics_Circle(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_COMMENT: + GetGraphics_Comment(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_CROSS: + GetGraphics_Cross(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_HELP: + GetGraphics_Help(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_INSERTTEXT: + GetGraphics_InsertText(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_KEY: + GetGraphics_Key(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_NEWPARAGRAPH: + GetGraphics_NewParagraph(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_TEXTNOTE: + GetGraphics_TextNote(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_PARAGRAPH: + GetGraphics_Paragraph(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_RIGHTARROW: + GetGraphics_RightArrow(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_RIGHTPOINTER: + GetGraphics_RightPointer(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_STAR: + GetGraphics_Star(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_UPARROW: + GetGraphics_UpArrow(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_UPLEFTARROW: + GetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_GRAPH: + GetGraphics_Graph(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_PAPERCLIP: + GetGraphics_Paperclip(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_ATTACHMENT: + GetGraphics_Attachment(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_TAG: + GetGraphics_Tag(sPath, path, rect, PWLPT_STREAM); + break; + case PWL_ICONTYPE_FOXIT: + GetGraphics_Foxit(sPath, path, rect, PWLPT_STREAM); + break; + } + + sAppStream += sPath; + if (crStroke.nColorType != COLORTYPE_TRANSPARENT) + sAppStream += "B*\n"; + else + sAppStream += "f*\n"; + + return sAppStream; +} + +void CPWL_Utils::DrawIconAppStream(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, + FX_INT32 nType, const CPDF_Rect & rect, const CPWL_Color& crFill, const CPWL_Color& crStroke, const FX_INT32 nTransparancy) +{ + CFX_GraphStateData gsd; + gsd.m_LineWidth = 1.0f; + + CFX_ByteString sPath; + CFX_PathData path; + + switch (nType) + { + case PWL_ICONTYPE_CHECKMARK: + GetGraphics_Checkmark(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_CIRCLE: + GetGraphics_Circle(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_COMMENT: + GetGraphics_Comment(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_CROSS: + GetGraphics_Cross(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_HELP: + GetGraphics_Help(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_INSERTTEXT: + GetGraphics_InsertText(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_KEY: + GetGraphics_Key(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_NEWPARAGRAPH: + GetGraphics_NewParagraph(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_TEXTNOTE: + GetGraphics_TextNote(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_PARAGRAPH: + GetGraphics_Paragraph(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_RIGHTARROW: + GetGraphics_RightArrow(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_RIGHTPOINTER: + GetGraphics_RightPointer(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_STAR: + GetGraphics_Star(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_UPARROW: + GetGraphics_UpArrow(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_UPLEFTARROW: + GetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_GRAPH: + GetGraphics_Graph(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_PAPERCLIP: + GetGraphics_Paperclip(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_ATTACHMENT: + GetGraphics_Attachment(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_TAG: + GetGraphics_Tag(sPath, path, rect, PWLPT_PATHDATA); + break; + case PWL_ICONTYPE_FOXIT: + GetGraphics_Foxit(sPath, path, rect, PWLPT_PATHDATA); + break; + default: + return; + } + + pDevice->DrawPath(&path, pUser2Device, &gsd, + PWLColorToFXColor(crFill,nTransparancy), PWLColorToFXColor(crStroke,nTransparancy), FXFILL_ALTERNATE); +} + +void CPWL_Utils::GetGraphics_Checkmark(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f, crBBox.bottom + fHeight * 2 / 5.0f),PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f + PWL_BEZIER*(fWidth / 7.0f - fWidth / 15.0f), + crBBox.bottom + fHeight * 2 / 5.0f + PWL_BEZIER*(fHeight * 2 / 7.0f - fHeight * 2 / 5.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f + PWL_BEZIER*(fWidth / 5.0f - fWidth / 4.5f), + crBBox.bottom + fHeight / 16.0f + PWL_BEZIER*(fHeight / 5.0f - fHeight / 16.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f, crBBox.bottom + fHeight / 16.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f + PWL_BEZIER*(fWidth / 4.4f - fWidth / 4.5f), + crBBox.bottom + fHeight / 16.0f - PWL_BEZIER*fHeight / 16.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f + PWL_BEZIER*(fWidth / 4.0f - fWidth / 3.0f), + crBBox.bottom), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f, crBBox.bottom), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f + PWL_BEZIER*fWidth*(1/7.0f + 2/15.0f), + crBBox.bottom + PWL_BEZIER*fHeight * 4 / 5.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f + PWL_BEZIER*fWidth*(1/7.0f - 7/15.0f), + crBBox.bottom + fHeight * 15/16.0f + PWL_BEZIER*(fHeight * 4/5.0f - fHeight * 15/16.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f,crBBox.bottom + fHeight * 15 / 16.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f + PWL_BEZIER*(fWidth * 7 / 15.0f - fWidth * 14 / 15.0f), + crBBox.bottom + fHeight * 15 / 16.0f + PWL_BEZIER*(fHeight * 8 / 7.0f - fHeight * 15 / 16.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f + PWL_BEZIER*(fWidth / 3.4f - fWidth / 3.6f), + crBBox.bottom + fHeight / 3.5f + PWL_BEZIER*(fHeight / 3.5f - fHeight / 3.5f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f,crBBox.bottom + fHeight / 3.5f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f, + crBBox.bottom + fHeight / 3.5f + PWL_BEZIER*(fHeight / 4.0f - fHeight / 3.5f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f + PWL_BEZIER*(fWidth / 3.5f - fWidth / 15.0f), + crBBox.bottom + fHeight * 2 / 5.0f + PWL_BEZIER*(fHeight * 3.5f / 5.0f - fHeight * 2 / 5.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,crBBox.bottom + fHeight * 2 / 5.0f), PWLPT_BEZIERTO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 16); + else + GetPathDataFromArray(path, PathArray, 16); +} + +void CPWL_Utils::GetGraphics_Circle(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f,crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, + crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*14/15.0f - fHeight/2.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/15.0f), crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f,crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*14/15.0f - fWidth/2.0f), crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*14/15.0f - fHeight/2.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight/2.0f - fHeight/15.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*14/15.0f - fWidth/2.0f), crBBox.bottom + fHeight/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/15.0f), crBBox.bottom + fHeight/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight/2.0f - fHeight/15.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f,crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth*3/15.0f), crBBox.top - fHeight*3/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight*3/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*4/5.0f - fWidth/2.0f), crBBox.top - fHeight*3/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*4/5.0f - fWidth/2.0f), crBBox.bottom + fHeight*3/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight*3/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth*4/5.0f - fWidth/2.0f), crBBox.bottom + fHeight*3/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 26); + else + GetPathDataFromArray(path, PathArray, 26); +} + +void CPWL_Utils::GetGraphics_Comment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f + PWL_BEZIER*(fHeight/6.0f - fHeight/10.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f - PWL_BEZIER*fWidth/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight/10.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f + PWL_BEZIER*fWidth/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/6 + PWL_BEZIER*(fHeight/6.0f - fHeight/10.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/3.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f + PWL_BEZIER*fHeight/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f + PWL_BEZIER*fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f, crBBox.bottom + fHeight*2/15 + PWL_BEZIER*fHeight*2/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f - PWL_BEZIER*fWidth*2/15.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*6/30.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f + PWL_BEZIER*fWidth/30.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f, crBBox.bottom + fHeight*2/15.0f + PWL_BEZIER*fHeight*2/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f - PWL_BEZIER*fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/3.0f - PWL_BEZIER*fHeight/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/3.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight*8/30.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight*8/30.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15, crBBox.top - fHeight*25/60.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight*25/60.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight*17/30.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*4/15.0f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 30); + else + GetPathDataFromArray(path, PathArray, 30); +} + +void CPWL_Utils::GetGraphics_Cross(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + //FX_FLOAT fcatercorner = (FX_FLOAT)sqrt(fWidth*fWidth + fHeight*fHeight); + CPWL_Point center_point(crBBox.left + fWidth/2, crBBox.bottom + fHeight/2); + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(center_point.x, center_point.y + fHeight/10.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(center_point.x + fWidth*0.3f, center_point.y + fHeight/10.0f + fWidth*0.3f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f + fWidth*0.3f, center_point.y + fHeight*0.3f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f, center_point.y), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f + fWidth*0.3f, center_point.y - fHeight*0.3f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(center_point.x + fWidth*0.3f, center_point.y - fHeight/10.0f - fHeight*0.3f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(center_point.x, center_point.y - fHeight/10.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(center_point.x - fWidth*0.3f, center_point.y - fHeight/10 - fHeight*0.3f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(center_point.x - fWidth/10.0f - fWidth*0.3f, center_point.y - fHeight*0.3f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(center_point.x - fWidth/10, center_point.y), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(center_point.x - fWidth/10 - fWidth*0.3f, center_point.y + fHeight*0.3f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(center_point.x - fWidth*0.3f, center_point.y + fHeight/10.0f + fHeight*0.3f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(center_point.x, center_point.y + fHeight/10.0f), PWLPT_LINETO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 13); + else + GetPathDataFromArray(path, PathArray, 13); +} + +void CPWL_Utils::GetGraphics_Help(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight/60.0f - fHeight/2.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/60.0f), crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*fWidth*29/60.0f, crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight/60.0f - fHeight/2.0f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*fHeight*29/60.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*fWidth*29/60.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*fWidth*29/60.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*fHeight*29/60.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.23f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f - PWL_BEZIER*fWidth*0.23f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f + PWL_BEZIER*fWidth*0.23f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.27f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.23f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.27f - fWidth*0.08f*0.2f, crBBox.top - fHeight*0.36f - fHeight*0.15f*0.7f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.35f + fWidth*0.08f*0.2f, crBBox.top - fHeight*0.51f + fHeight*0.15f*0.2f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.35f, crBBox.top - fHeight*0.51f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.35f - fWidth*0.1f*0.5f, crBBox.top - fHeight*0.51f - fHeight*0.15f*0.3f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f - fWidth*0.1f*0.5f, crBBox.top - fHeight*0.68f + fHeight*0.15f*0.5f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.top - fHeight*0.68f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.bottom + fHeight*0.30f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.bottom + fHeight*0.30f - fWidth*0.1f*0.7f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.bottom + fHeight*0.30f - fWidth*0.1f*0.7f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.bottom + fHeight*0.30f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.top - fHeight*0.66f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f - fWidth*0.1f*0.05f, crBBox.top - fHeight*0.66f + fHeight*0.18f*0.5f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f - fWidth*0.1f*0.05f, crBBox.top - fHeight*0.48f - fHeight*0.18f*0.3f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.top - fHeight*0.48f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f + fWidth*0.08f*0.2f, crBBox.top - fHeight*0.48f + fHeight*0.18f*0.2f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.37f - fWidth*0.08f*0.2f, crBBox.top - fHeight*0.36f - fHeight*0.18f*0.7f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.37f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.37f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.13f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f + PWL_BEZIER*fWidth*0.13f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f - PWL_BEZIER*fWidth*0.13f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.13f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f - fWidth*0.1f*0.6f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f - fWidth*0.1f*0.6f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f + PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f - PWL_BEZIER*fWidth*0.095f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f + PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f + PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f - PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f + PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f - PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f - PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f), PWLPT_BEZIERTO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 59); + else + GetPathDataFromArray(path, PathArray, 59); +} + +void CPWL_Utils::GetGraphics_InsertText(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.bottom + fHeight/10), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2, crBBox.top - fHeight*2/15), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10, crBBox.bottom + fHeight/10), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.bottom + fHeight/10), PWLPT_LINETO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 4); + else + GetPathDataFromArray(path, PathArray, 4); +} + +void CPWL_Utils::GetGraphics_Key(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + FX_FLOAT k = -fHeight/fWidth; + CPWL_Point tail; + CPWL_Point CicleCenter; + tail.x = crBBox.left + fWidth*0.9f; + tail.y = k*(tail.x - crBBox.right) + crBBox.bottom; + CicleCenter.x = crBBox.left + fWidth*0.15f; + CicleCenter.y = k*(CicleCenter.x - crBBox.right) + crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(tail.x + fWidth/30.0f, -fWidth/30.0f/k + tail.y), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(tail.x + fWidth/30.0f - fWidth*0.18f, -k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f + fWidth*0.07f, + -fWidth*0.07f/k - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 + fWidth*0.07f, + -fWidth*0.07f/k - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20, + -k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15, + -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 + fWidth*0.07f, + -fWidth*0.07f/k - k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 - fWidth/20 + fWidth*0.07f, + -fWidth*0.07f/k + -k*fWidth/20 + -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 - fWidth/20, + -k*fWidth/20 + -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.45f, -k*fWidth*0.45f - fWidth/30/k + tail.y), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.45f + fWidth*0.2f, + -fWidth*0.4f/k - k*fWidth*0.45f - fWidth/30/k + tail.y), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.2f, - fWidth*0.1f/k + CicleCenter.y), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth/60.0f, -k*fWidth/60 + CicleCenter.y), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth/60, -k*fWidth/60 + CicleCenter.y), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth*0.22f, fWidth*0.35f/k + CicleCenter.y - fHeight*0.05f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(tail.x - fWidth/30 - fWidth*0.45f - fWidth*0.18f, fWidth*0.05f/k - k*fWidth*0.45f + fWidth/30/k + tail.y - fHeight*0.05f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(tail.x - fWidth/30.0f - fWidth*0.45f, -k*fWidth*0.45f + fWidth/30.0f/k + tail.y), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(tail.x - fWidth/30.0f, fWidth/30.0f/k + tail.y), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(tail.x + fWidth/30, -fWidth/30/k + tail.y), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f, k*fWidth*0.08f + CicleCenter.y), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f + fWidth*0.1f, -fWidth*0.1f/k + k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f + fWidth*0.1f, k*fWidth*0.22f + CicleCenter.y - fWidth*0.1f/k), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f, k*fWidth*0.22f + CicleCenter.y), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f - fWidth*0.1f, fWidth*0.1f/k + k*fWidth*0.22f + CicleCenter.y), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f - fWidth*0.1f, fWidth*0.1f/k + k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f, k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 28); + else + GetPathDataFromArray(path, PathArray, 28); +} + +void CPWL_Utils::GetGraphics_NewParagraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/20.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/20.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.top - fHeight*17/30.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.top - fHeight*17/30.0f - fWidth*0.14f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.48f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.48f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.bottom + fWidth*0.24f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/10.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/10.0f + fHeight/7.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.97f, crBBox.bottom + fHeight/10.0f + fHeight/7.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.97f, crBBox.top - fHeight*17/30.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*17/30.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.85f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.85f, crBBox.top - fHeight*17/30.0f - fHeight*0.08f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*17/30.0f - fHeight*0.08f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_LINETO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 28); + else + GetPathDataFromArray(path, PathArray, 28); +} + +void CPWL_Utils::GetGraphics_TextNote(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*4/15.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/5.0f, crBBox.top - fHeight*4/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*7/15.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/5.0f, crBBox.top - fHeight*7/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*10/15.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.top - fHeight*10/15.0f), PWLPT_LINETO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 17); + else + GetPathDataFromArray(path, PathArray, 17); +} + +void CPWL_Utils::GetGraphics_Paragraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.634f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.634f, crBBox.top - fHeight*2/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.566f, crBBox.top - fHeight*2/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.566f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f - fHeight*0.4f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.2f, crBBox.top - fHeight/15.0f - fHeight*0.4f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.2f, crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 12); + else + GetPathDataFromArray(path, PathArray, 12); +} + +void CPWL_Utils::GetGraphics_RightArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/2.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + fWidth/8.0f, crBBox.bottom + fHeight/5.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/5.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f - fWidth*0.15f, crBBox.top - fHeight/2.0f - fWidth/25.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight/2.0f - fWidth/25.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight/2.0f + fWidth/25.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f - fWidth*0.15f, crBBox.top - fHeight/2.0f + fWidth/25.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/5.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + fWidth/8.0f, crBBox.top - fHeight/5.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 10); + else + GetPathDataFromArray(path, PathArray, 10); +} + +void CPWL_Utils::GetGraphics_RightPointer(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30.0f, crBBox.top - fHeight/2.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/30.0f, crBBox.bottom + fHeight/6.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*4/15.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/30.0f, crBBox.top - fHeight/6.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 5); + else + GetPathDataFromArray(path, PathArray, 5); +} + +void CPWL_Utils::GetGraphics_Star(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fLongRadius = (crBBox.top - crBBox.bottom)/(1+(FX_FLOAT)cos(PWL_PI/5.0f)); + fLongRadius = fLongRadius * 0.7f; + FX_FLOAT fShortRadius = fLongRadius * 0.55f; + CPDF_Point ptCenter = CPDF_Point((crBBox.left + crBBox.right) / 2.0f,(crBBox.top + crBBox.bottom) / 2.0f); + + FX_FLOAT px1[5], py1[5]; + FX_FLOAT px2[5], py2[5]; + + FX_FLOAT fAngel = PWL_PI/10.0f; + + for (FX_INT32 i=0; i<5; i++) + { + px1[i] = ptCenter.x + fLongRadius * (FX_FLOAT)cos(fAngel); + py1[i] = ptCenter.y + fLongRadius * (FX_FLOAT)sin(fAngel); + + fAngel += PWL_PI * 2 / 5.0f; + } + + fAngel = PWL_PI/5.0f + PWL_PI/10.0f; + + for (FX_INT32 j=0; j<5; j++) + { + px2[j] = ptCenter.x + fShortRadius * (FX_FLOAT)cos(fAngel); + py2[j] = ptCenter.y + fShortRadius * (FX_FLOAT)sin(fAngel); + + fAngel += PWL_PI * 2 / 5.0f; + } + + CPWL_PathData PathArray[11]; + PathArray[0] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_MOVETO); + PathArray[1] = CPWL_PathData(CPWL_Point(px2[0], py2[0]), PWLPT_LINETO); + + for(FX_INT32 k = 0; k < 4; k++) + { + PathArray[(k+1)*2] = CPWL_PathData(CPWL_Point(px1[k+1], py1[k+1]), PWLPT_LINETO); + PathArray[(k+1)*2 + 1] = CPWL_PathData(CPWL_Point(px2[k+1], py2[k+1]), PWLPT_LINETO); + } + + PathArray[10] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_LINETO); + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 11); + else + GetPathDataFromArray(path, PathArray, 11); +} + +void CPWL_Utils::GetGraphics_UpArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 8); + else + GetPathDataFromArray(path, PathArray, 8); +} + +void CPWL_Utils::GetGraphics_UpLeftArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + CPWL_Point leftup(crBBox.left, crBBox.top); + CPWL_Point rightdown(crBBox.right, crBBox.bottom); + FX_FLOAT k = -fHeight/fWidth; + CPWL_Point tail; + tail.x = crBBox.left + fWidth*4/5.0f; + tail.y = k*(tail.x - crBBox.right) + rightdown.y; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/20.0f, k*(crBBox.left + fWidth/20.0f - rightdown.x) + rightdown.y), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x + fWidth/10.0f + fWidth/5.0f, + -fWidth/5.0f/k + tail.y - fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x + fWidth/10.0f, + tail.y - fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(tail.x + fWidth/10.0f, tail.y - fWidth/10.0f/k), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(tail.x - fWidth/10.0f, tail.y + fWidth/10.0f/k), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x - fWidth/10.0f, tail.y + fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x - fWidth/10.0f - fWidth/5.0f, + fWidth/5.0f/k + tail.y + fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/20.0f, k*(crBBox.left + fWidth/20.0f - rightdown.x) + rightdown.y), PWLPT_LINETO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 8); + else + GetPathDataFromArray(path, PathArray, 8); +} + +void CPWL_Utils::GetGraphics_Graph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.top - fWidth*0.15f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.15f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.top - fWidth*0.15f), PWLPT_LINETO), + + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.top - fWidth*0.45f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.475f, crBBox.top - fWidth*0.45f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.475f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.top - fWidth*0.45f), PWLPT_LINETO), + + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.05f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*0.05f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.05f), PWLPT_LINETO), + + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.top - fWidth*0.35f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.925f, crBBox.top - fWidth*0.35f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.925f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.top - fWidth*0.35f), PWLPT_LINETO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 20); + else + GetPathDataFromArray(path, PathArray, 20); +} + +void CPWL_Utils::GetGraphics_Paperclip(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.bottom + fHeight*0.25f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.bottom + fHeight*0.25f - fWidth*57/60.0f*0.35f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.bottom + fHeight*0.25f - fWidth*57/60.0f*0.35f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.bottom + fHeight*0.25f), PWLPT_BEZIERTO), + + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.top - fHeight*0.33f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.top - fHeight*0.33f + fHeight/15*0.5f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.top - fHeight*0.33f + fHeight/15*0.5f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.top - fHeight*0.33f), PWLPT_BEZIERTO), + + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.bottom + fHeight*0.2f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.bottom + fHeight*0.2f - (fWidth*57/60.0f - fWidth*0.24f)*0.25f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.bottom + fHeight*0.2f - (fWidth*57/60.0f - fWidth*0.24f)*0.25f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.bottom + fHeight*0.2f), PWLPT_BEZIERTO), + + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.top - fHeight*0.2f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.top - fHeight*0.2f + (fWidth*11/12.0f - fWidth*0.36f)*0.25f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.top - fHeight*0.2f + (fWidth*11/12.0f - fWidth*0.36f)*0.25f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.top - fHeight*0.2f), PWLPT_BEZIERTO), + + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.bottom + fHeight*0.25f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.bottom + fHeight*0.25f - (fWidth*14/15.0f - fWidth*0.53f)*0.25f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.bottom + fHeight*0.25f - (fWidth*14/15.0f - fWidth*0.53f)*0.25f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.bottom + fHeight*0.25f), PWLPT_BEZIERTO), + + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.top - fHeight*0.33f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.top - fHeight*0.33f + fWidth*0.12f*0.35f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.top - fHeight*0.33f + fWidth*0.12f*0.35f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.top - fHeight*0.33f), PWLPT_BEZIERTO), + + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.bottom + fHeight*0.3f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.bottom + fHeight*0.3f - fWidth*(14/15.0f - 0.29f)*0.35f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.bottom + fHeight*0.3f - fWidth*(14/15.0f - 0.29f)*0.35f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.bottom + fHeight*0.3f), PWLPT_BEZIERTO), + + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.top - fHeight*0.25f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.top - fHeight*0.25f + fWidth*0.35f*(11/12.0f - 0.12f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f + fWidth*0.35f*(11/12.0f - 0.12f)), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f), PWLPT_BEZIERTO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 33); + else + GetPathDataFromArray(path, PathArray, 33); +} + +void CPWL_Utils::GetGraphics_Attachment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.23f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO), + + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.23f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.23f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.23f), PWLPT_LINETO), + + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f - fWidth*0.25f*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.15f, crBBox.top - fHeight*0.65f + fHeight*0.15f*0.4f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.15f, crBBox.top - fHeight*0.65f), PWLPT_BEZIERTO), + + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.15f, crBBox.top - fHeight*0.65f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.15f, crBBox.top - fHeight*0.65f + fHeight*0.15f*0.4f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f + fWidth*0.25f*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO), + + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO), + + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.65f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 24); + else + GetPathDataFromArray(path, PathArray, 24); +} + +void CPWL_Utils::GetGraphics_Tag(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.1f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight*0.5f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.3f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.1f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.1f, crBBox.top - fHeight*0.1f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.1f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.3f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.3f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.5f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.7f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.7f), PWLPT_LINETO) + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 12); + else + GetPathDataFromArray(path, PathArray, 12); +} + +void CPWL_Utils::GetGraphics_Foxit(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type) +{ + FX_FLOAT fOutWidth = crBBox.right - crBBox.left; + FX_FLOAT fOutHeight = crBBox.top - crBBox.bottom; + + CPDF_Rect crInBox = crBBox; + crInBox.left = crBBox.left + fOutWidth*0.08f; + crInBox.right = crBBox.right - fOutWidth*0.08f; + crInBox.top = crBBox.top - fOutHeight*0.08f; + crInBox.bottom = crBBox.bottom + fOutHeight*0.08f; + + FX_FLOAT fWidth = crInBox.right - crInBox.left; + FX_FLOAT fHeight = crInBox.top - crInBox.bottom; + + CPWL_PathData PathArray[] = + { + CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f, crInBox.top), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f, crInBox.top - PWL_BEZIER * fHeight * 0.4f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f - PWL_BEZIER * fWidth * 0.45f, crInBox.top - fHeight*0.4f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.4f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_LINETO), + + CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.60f, crInBox.top), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f, crInBox.top), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f, crInBox.top - PWL_BEZIER * fHeight * 0.7f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f - PWL_BEZIER * fWidth * 0.75f, crInBox.top - fHeight*0.7f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.7f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.55f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crInBox.left + PWL_BEZIER * fWidth*0.60f, crInBox.top - fHeight*0.55f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top - PWL_BEZIER * fHeight * 0.55f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top), PWLPT_BEZIERTO), + + CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top - PWL_BEZIER * fHeight * 0.85f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f - PWL_BEZIER * fWidth * 0.90f, crInBox.top - fHeight*0.85f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.85f), PWLPT_BEZIERTO), + CPWL_PathData(CPWL_Point(crInBox.left, crInBox.bottom), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crInBox.right, crInBox.bottom), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crInBox.right, crInBox.top), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top), PWLPT_LINETO), + + /* + CPWL_PathData(CPWL_Point(crBBox.left, crBBox.top), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.right, crBBox.top), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right, crBBox.bottom), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left, crBBox.bottom), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left, crBBox.top), PWLPT_LINETO), + + CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_MOVETO), + CPWL_PathData(CPWL_Point(crBBox.right-fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.right-fOutWidth*0.04f, crBBox.bottom+fOutHeight*0.04f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.bottom+fOutHeight*0.04f), PWLPT_LINETO), + CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_LINETO), + */ + }; + + if(type == PWLPT_STREAM) + sPathData = GetAppStreamFromArray(PathArray, 23); + else + GetPathDataFromArray(path, PathArray, 23); +} + +void CPWL_Color::ConvertColorType(FX_INT32 nColorType) +{ + switch (this->nColorType) + { + case COLORTYPE_TRANSPARENT: + break; + case COLORTYPE_GRAY: + switch (nColorType) + { + case COLORTYPE_RGB: + CPWL_Utils::ConvertGRAY2RGB(this->fColor1, this->fColor1, this->fColor2, this->fColor3); + break; + case COLORTYPE_CMYK: + CPWL_Utils::ConvertGRAY2CMYK(this->fColor1, this->fColor1, this->fColor2, this->fColor3, this->fColor4); + break; + } + break; + case COLORTYPE_RGB: + switch (nColorType) + { + case COLORTYPE_GRAY: + CPWL_Utils::ConvertRGB2GRAY(this->fColor1, this->fColor2, this->fColor3, this->fColor1); + break; + case COLORTYPE_CMYK: + CPWL_Utils::ConvertRGB2CMYK(this->fColor1, this->fColor2, this->fColor3, this->fColor1, this->fColor2, this->fColor3, this->fColor4); + break; + } + break; + case COLORTYPE_CMYK: + switch (nColorType) + { + case COLORTYPE_GRAY: + CPWL_Utils::ConvertCMYK2GRAY(this->fColor1, this->fColor2, this->fColor3, this->fColor4, this->fColor1); + break; + case COLORTYPE_RGB: + CPWL_Utils::ConvertCMYK2RGB(this->fColor1, this->fColor2, this->fColor3, this->fColor4, this->fColor1, this->fColor2, this->fColor3); + break; + } + break; + } + this->nColorType = nColorType; +} + + diff --git a/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp b/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp index 035ffbbf4d..9bb784c8a6 100644 --- a/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp @@ -1,1342 +1,1342 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "../../include/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-#include "../../include/pdfwindow/PWL_ScrollBar.h"
-
-/* -------------------------- CPWL_Timer -------------------------- */
-
-static CFX_MapPtrTemplate<FX_INT32, CPWL_Timer*> g_TimeMap;
-
-CPWL_Timer::CPWL_Timer(CPWL_TimerHandler* pAttached, IFX_SystemHandler* pSystemHandler) :
- m_pAttached(pAttached),
- m_nTimerID(0),
- m_pSystemHandler(pSystemHandler)
-{
- ASSERT(m_pAttached != NULL);
- ASSERT(m_pSystemHandler != NULL);
-}
-
-CPWL_Timer::~CPWL_Timer()
-{
- KillPWLTimer();
-}
-
-FX_INT32 CPWL_Timer::SetPWLTimer(FX_INT32 nElapse)
-{
- if (m_nTimerID != 0) KillPWLTimer();
- m_nTimerID = m_pSystemHandler->SetTimer(nElapse, TimerProc);
- g_TimeMap.SetAt(m_nTimerID, this);
- return m_nTimerID;
-}
-
-void CPWL_Timer::KillPWLTimer()
-{
- if (m_nTimerID != 0)
- {
- m_pSystemHandler->KillTimer(m_nTimerID);
- g_TimeMap.RemoveKey(m_nTimerID);
- m_nTimerID = 0;
- }
-}
-
-void CPWL_Timer::TimerProc(FX_INT32 idEvent)
-{
- CPWL_Timer* pTimer = NULL;
- if (g_TimeMap.Lookup(idEvent, pTimer))
- {
- if (pTimer)
- {
- if (pTimer->m_pAttached)
- pTimer->m_pAttached->TimerProc();
- }
- }
-}
-
-/* -------------------------- CPWL_TimerHandler -------------------------- */
-
-CPWL_TimerHandler::CPWL_TimerHandler() : m_pTimer(NULL)
-{
-}
-
-CPWL_TimerHandler::~CPWL_TimerHandler()
-{
- if (m_pTimer) delete m_pTimer;
-}
-
-void CPWL_TimerHandler::BeginTimer(FX_INT32 nElapse)
-{
- if (!m_pTimer)
- m_pTimer = new CPWL_Timer(this, GetSystemHandler());
-
- if (m_pTimer)
- m_pTimer->SetPWLTimer(nElapse);
-}
-
-void CPWL_TimerHandler::EndTimer()
-{
- if (m_pTimer)
- m_pTimer->KillPWLTimer();
-}
-
-void CPWL_TimerHandler::TimerProc()
-{
-}
-
-/* --------------------------- CPWL_MsgControl ---------------------------- */
-
-class CPWL_MsgControl
-{
- friend class CPWL_Wnd;
-
-public:
- CPWL_MsgControl(CPWL_Wnd * pWnd)
- {
-// PWL_TRACE("new CPWL_MsgControl\n");
- m_pCreatedWnd = pWnd;
- Default();
- }
-
- ~CPWL_MsgControl()
- {
-// PWL_TRACE("~CPWL_MsgControl\n");
- Default();
- }
-
- void Default()
- {
- m_aMousePath.RemoveAll();
- m_aKeyboardPath.RemoveAll();
- m_pMainMouseWnd = NULL;
- m_pMainKeyboardWnd = NULL;
- }
-
- FX_BOOL IsWndCreated(const CPWL_Wnd * pWnd) const
- {
- return m_pCreatedWnd == pWnd;
- }
-
- FX_BOOL IsMainCaptureMouse(const CPWL_Wnd * pWnd) const
- {
- return pWnd == m_pMainMouseWnd;
- }
-
- FX_BOOL IsWndCaptureMouse(const CPWL_Wnd * pWnd) const
- {
- if (pWnd)
- for( FX_INT32 i=0,sz=m_aMousePath.GetSize(); i<sz; i++)
- if (m_aMousePath.GetAt(i) == pWnd)
- return TRUE;
-
- return FALSE;
- }
-
- FX_BOOL IsMainCaptureKeyboard(const CPWL_Wnd * pWnd) const
- {
- return pWnd == m_pMainKeyboardWnd;
- }
-
-
- FX_BOOL IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const
- {
- if (pWnd)
- for( FX_INT32 i=0,sz=m_aKeyboardPath.GetSize(); i<sz; i++)
- if (m_aKeyboardPath.GetAt(i) == pWnd)
- return TRUE;
-
- return FALSE;
- }
-
- void SetFocus(CPWL_Wnd * pWnd)
- {
- m_aKeyboardPath.RemoveAll();
-
- if (pWnd)
- {
- m_pMainKeyboardWnd = pWnd;
-
- CPWL_Wnd * pParent = pWnd;
- while (pParent)
- {
- m_aKeyboardPath.Add(pParent);
- pParent = pParent->GetParentWindow();
- }
-
- pWnd->OnSetFocus();
- }
- }
-
- void KillFocus()
- {
- if (m_aKeyboardPath.GetSize() > 0)
- if (CPWL_Wnd* pWnd = m_aKeyboardPath.GetAt(0))
- pWnd->OnKillFocus();
-
- m_pMainKeyboardWnd = NULL;
- m_aKeyboardPath.RemoveAll();
- }
-
- void SetCapture(CPWL_Wnd * pWnd)
- {
- m_aMousePath.RemoveAll();
-
- if (pWnd)
- {
- m_pMainMouseWnd = pWnd;
-
- CPWL_Wnd * pParent = pWnd;
- while (pParent)
- {
- m_aMousePath.Add(pParent);
- pParent = pParent->GetParentWindow();
- }
- }
- }
-
- void ReleaseCapture()
- {
- m_pMainMouseWnd = NULL;
- m_aMousePath.RemoveAll();
- }
-
-private:
- CFX_ArrayTemplate<CPWL_Wnd*> m_aMousePath;
- CFX_ArrayTemplate<CPWL_Wnd*> m_aKeyboardPath;
- CPWL_Wnd* m_pCreatedWnd;
- CPWL_Wnd* m_pMainMouseWnd;
- CPWL_Wnd* m_pMainKeyboardWnd;
-};
-
-/* --------------------------- CPWL_Wnd ---------------------------- */
-
-CPWL_Wnd::CPWL_Wnd() :
- m_pVScrollBar(NULL),
- m_rcWindow(),
- m_rcClip(),
- m_bCreated(FALSE),
- m_bVisible(FALSE),
- m_bNotifying(FALSE),
- m_bEnabled(TRUE)
-{
-}
-
-CPWL_Wnd::~CPWL_Wnd()
-{
- ASSERT(m_bCreated == FALSE);
-}
-
-CFX_ByteString CPWL_Wnd::GetClassName() const
-{
- return "CPWL_Wnd";
-}
-
-void CPWL_Wnd::Create(const PWL_CREATEPARAM & cp)
-{
- if (!IsValid())
- {
- m_sPrivateParam = cp;
-
- OnCreate(m_sPrivateParam);
-
- m_sPrivateParam.rcRectWnd.Normalize();
- m_rcWindow = m_sPrivateParam.rcRectWnd;
- m_rcClip = CPWL_Utils::InflateRect(m_rcWindow,1.0f);
-
- CreateMsgControl();
-
- if (m_sPrivateParam.pParentWnd)
- m_sPrivateParam.pParentWnd->OnNotify(this, PNM_ADDCHILD);
-
- PWL_CREATEPARAM ccp = m_sPrivateParam;
-
- ccp.dwFlags &= 0xFFFF0000L; //remove sub styles
- ccp.mtChild = CPDF_Matrix(1,0,0,1,0,0);
-
- CreateScrollBar(ccp);
- CreateChildWnd(ccp);
-
- m_bVisible = HasFlag(PWS_VISIBLE);
-
- OnCreated();
-
- RePosChildWnd();
- m_bCreated = TRUE;
- }
-}
-
-void CPWL_Wnd::OnCreate(PWL_CREATEPARAM & cp)
-{
-}
-
-void CPWL_Wnd::OnCreated()
-{
-}
-
-void CPWL_Wnd::OnDestroy()
-{
-}
-
-void CPWL_Wnd::Destroy()
-{
- KillFocus();
-
- OnDestroy();
-
- if (m_bCreated)
- {
- for (FX_INT32 i = m_aChildren.GetSize()-1; i >= 0; i --)
- {
- if (CPWL_Wnd * pChild = m_aChildren[i])
- {
- pChild->Destroy();
- delete pChild;
- pChild = NULL;
- }
- }
-
- if (m_sPrivateParam.pParentWnd)
- m_sPrivateParam.pParentWnd->OnNotify(this, PNM_REMOVECHILD);
- m_bCreated = FALSE;
- }
-
- DestroyMsgControl();
-
- FXSYS_memset(&m_sPrivateParam, 0, sizeof(PWL_CREATEPARAM));
- m_aChildren.RemoveAll();
- m_pVScrollBar = NULL;
-}
-
-void CPWL_Wnd::Move(const CPDF_Rect & rcNew, FX_BOOL bReset,FX_BOOL bRefresh)
-{
- if (IsValid())
- {
- CPDF_Rect rcOld = this->GetWindowRect();
-
- m_rcWindow = rcNew;
- m_rcWindow.Normalize();
- //m_rcClip = CPWL_Utils::InflateRect(m_rcWindow,1.0f); //for special caret
-
- if (rcOld.left != rcNew.left || rcOld.right != rcNew.right ||
- rcOld.top != rcNew.top || rcOld.bottom != rcNew.bottom)
- {
- if (bReset)
- {
- RePosChildWnd();
- }
-
- }
- if (bRefresh)
- {
- InvalidateRectMove(rcOld,rcNew);
- }
-
- m_sPrivateParam.rcRectWnd = m_rcWindow;
- }
-}
-
-void CPWL_Wnd::InvalidateRectMove(const CPDF_Rect & rcOld, const CPDF_Rect & rcNew)
-{
- CPDF_Rect rcUnion = rcOld;
- rcUnion.Union(rcNew);
-
- InvalidateRect(&rcUnion);
-
- /*
- CPDF_Rect SubArray[4];
-
- rcOld.Substract4(rcNew,SubArray);
- for (FX_INT32 i=0;i<4;i++)
- {
- if (SubArray[i].left == 0 &&
- SubArray[i].right == 0 &&
- SubArray[i].top == 0 &&
- SubArray[i].bottom == 0)continue;
-
- InvalidateRect(&CPWL_Utils::InflateRect(SubArray[i],2));
- }
-
- rcNew.Substract4(rcOld,SubArray);
- for (FX_INT32 j=0;j<4;j++)
- {
- if (SubArray[j].left == 0 &&
- SubArray[j].right == 0 &&
- SubArray[j].top == 0 &&
- SubArray[j].bottom == 0)continue;
-
- InvalidateRect(&CPWL_Utils::InflateRect(SubArray[j],2));
- }
- */
-}
-
-void CPWL_Wnd::GetAppearanceStream(CFX_ByteString & sAppStream)
-{
- if (IsValid())
- {
- CFX_ByteTextBuf sTextBuf;
- GetAppearanceStream(sTextBuf);
- sAppStream += sTextBuf.GetByteString();
- }
-}
-
-void CPWL_Wnd::GetAppearanceStream(CFX_ByteTextBuf & sAppStream)
-{
- if (IsValid() && IsVisible())
- {
- GetThisAppearanceStream(sAppStream);
- GetChildAppearanceStream(sAppStream);
- }
-}
-
-//if don't set,Get default apperance stream
-void CPWL_Wnd::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
-{
- CPDF_Rect rectWnd = GetWindowRect();
- if (!rectWnd.IsEmpty())
- {
- CFX_ByteTextBuf sThis;
-
- if (HasFlag(PWS_BACKGROUND))
- sThis << CPWL_Utils::GetRectFillAppStream(rectWnd,this->GetBackgroundColor());
-
- if (HasFlag(PWS_BORDER))
- sThis << CPWL_Utils::GetBorderAppStream(rectWnd,
- (FX_FLOAT)GetBorderWidth(),
- GetBorderColor(),
- this->GetBorderLeftTopColor(this->GetBorderStyle()),
- this->GetBorderRightBottomColor(this->GetBorderStyle()),
- this->GetBorderStyle(),
- this->GetBorderDash());
-
- sAppStream << sThis;
- }
-}
-
-void CPWL_Wnd::GetChildAppearanceStream(CFX_ByteTextBuf & sAppStream)
-{
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
- {
- pChild->GetAppearanceStream(sAppStream);
- }
- }
-}
-
-void CPWL_Wnd::DrawAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- if (IsValid() && IsVisible())
- {
- DrawThisAppearance(pDevice,pUser2Device);
- DrawChildAppearance(pDevice,pUser2Device);
- }
-}
-
-void CPWL_Wnd::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- CPDF_Rect rectWnd = GetWindowRect();
- if (!rectWnd.IsEmpty())
- {
- if (HasFlag(PWS_BACKGROUND))
- {
- CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rectWnd,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
- CPWL_Utils::DrawFillRect(pDevice,pUser2Device,rcClient,this->GetBackgroundColor(),GetTransparency());
- }
-
- if (HasFlag(PWS_BORDER))
- CPWL_Utils::DrawBorder(pDevice,
- pUser2Device,
- rectWnd,
- (FX_FLOAT)GetBorderWidth(),
- GetBorderColor(),
- this->GetBorderLeftTopColor(this->GetBorderStyle()),
- this->GetBorderRightBottomColor(this->GetBorderStyle()),
- this->GetBorderStyle(),
- this->GetBorderDash(),
- GetTransparency());
- }
-}
-
-void CPWL_Wnd::DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
-{
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
- {
- CPDF_Matrix mt = pChild->GetChildMatrix();
- if (mt.IsIdentity())
- {
- pChild->DrawAppearance(pDevice,pUser2Device);
- }
- else
- {
- mt.Concat(*pUser2Device);
- pChild->DrawAppearance(pDevice,&mt);
- }
- }
- }
-}
-
-void CPWL_Wnd::InvalidateRect(CPDF_Rect* pRect)
-{
- if (IsValid())
- {
- CPDF_Rect rcRefresh = pRect ? *pRect : GetWindowRect();
-
- if (!HasFlag(PWS_NOREFRESHCLIP))
- {
- CPDF_Rect rcClip = GetClipRect();
- if (!rcClip.IsEmpty())
- {
- rcRefresh.Intersect(rcClip);
- }
- }
-
- FX_RECT rcWin = PWLtoWnd(rcRefresh);
- rcWin.left -= PWL_INVALIDATE_INFLATE;
- rcWin.top -= PWL_INVALIDATE_INFLATE;
- rcWin.right += PWL_INVALIDATE_INFLATE;
- rcWin.bottom += PWL_INVALIDATE_INFLATE;
-
- if (IFX_SystemHandler* pSH = GetSystemHandler())
- {
- if (FX_HWND hWnd = GetAttachedHWnd())
- {
- pSH->InvalidateRect(hWnd, rcWin);
- }
- }
- }
-}
-
-#define PWL_IMPLEMENT_KEY_METHOD(key_method_name)\
-FX_BOOL CPWL_Wnd::key_method_name(FX_WORD nChar, FX_DWORD nFlag)\
-{\
- if (IsValid() && IsVisible() && IsEnabled())\
- {\
- if (IsWndCaptureKeyboard(this))\
- {\
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
- {\
- if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
- {\
- if (IsWndCaptureKeyboard(pChild))\
- {\
- return pChild->key_method_name(nChar,nFlag);\
- }\
- }\
- }\
- }\
- }\
- return FALSE;\
-}
-
-#define PWL_IMPLEMENT_MOUSE_METHOD(mouse_method_name)\
-FX_BOOL CPWL_Wnd::mouse_method_name(const CPDF_Point & point, FX_DWORD nFlag)\
-{\
- if (IsValid() && IsVisible() && IsEnabled())\
- {\
- if (IsWndCaptureMouse(this))\
- {\
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
- {\
- if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
- {\
- if (IsWndCaptureMouse(pChild))\
- {\
- return pChild->mouse_method_name(pChild->ParentToChild(point),nFlag);\
- }\
- }\
- }\
- SetCursor();\
- }\
- else\
- {\
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
- {\
- if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
- {\
- if (pChild->WndHitTest(pChild->ParentToChild(point)))\
- {\
- return pChild->mouse_method_name(pChild->ParentToChild(point),nFlag);\
- }\
- }\
- }\
- if (this->WndHitTest(point))\
- SetCursor();\
- }\
- }\
- return FALSE;\
-}
-
-PWL_IMPLEMENT_KEY_METHOD(OnKeyDown)
-PWL_IMPLEMENT_KEY_METHOD(OnKeyUp)
-PWL_IMPLEMENT_KEY_METHOD(OnChar)
-
-PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDblClk)
-PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDown)
-PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonUp)
-PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDblClk)
-PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDown)
-PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonUp)
-PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDblClk)
-PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDown)
-PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonUp)
-PWL_IMPLEMENT_MOUSE_METHOD(OnMouseMove)
-
-FX_BOOL CPWL_Wnd::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)
-{
- if (IsValid() && IsVisible() && IsEnabled())
- {
- SetCursor();
- if (IsWndCaptureKeyboard(this))
- {
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
- {
- if (IsWndCaptureKeyboard(pChild))
- {
- return pChild->OnMouseWheel(zDelta,pChild->ParentToChild(point), nFlag);
- }
- }
- }
- }
- }
- return FALSE;
-}
-
-void CPWL_Wnd::AddChild(CPWL_Wnd * pWnd)
-{
- m_aChildren.Add(pWnd);
-}
-
-void CPWL_Wnd::RemoveChild(CPWL_Wnd * pWnd)
-{
- for (FX_INT32 i = m_aChildren.GetSize()-1; i >= 0; i --)
- {
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
- {
- if (pChild == pWnd)
- {
- m_aChildren.RemoveAt(i);
- break;
- }
- }
- }
-}
-
-void CPWL_Wnd::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
-{
- switch (msg)
- {
- case PNM_ADDCHILD:
- this->AddChild(pWnd);
- break;
- case PNM_REMOVECHILD:
- this->RemoveChild(pWnd);
- break;
- default:
- break;
- }
-}
-
-FX_BOOL CPWL_Wnd::IsValid() const
-{
- return m_bCreated;
-}
-
-PWL_CREATEPARAM CPWL_Wnd::GetCreationParam() const
-{
- return m_sPrivateParam;
-}
-
-CPWL_Wnd* CPWL_Wnd::GetParentWindow() const
-{
- return m_sPrivateParam.pParentWnd;
-}
-
-CPDF_Rect CPWL_Wnd::GetOriginWindowRect() const
-{
- return m_sPrivateParam.rcRectWnd;
-}
-
-CPDF_Rect CPWL_Wnd::GetWindowRect() const
-{
- return m_rcWindow;
-}
-
-CPDF_Rect CPWL_Wnd::GetClientRect() const
-{
- CPDF_Rect rcWindow = GetWindowRect();
- CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
-
- if (CPWL_ScrollBar * pVSB = this->GetVScrollBar())
- rcClient.right -= pVSB->GetScrollBarWidth();
-
- rcClient.Normalize();
-
- if (rcWindow.Contains(rcClient))
- return rcClient;
- else
- return CPDF_Rect();
-}
-
-CPDF_Point CPWL_Wnd::GetCenterPoint() const
-{
- CPDF_Rect rcClient = GetClientRect();
-
- return CPDF_Point((rcClient.left + rcClient.right) * 0.5f,
- (rcClient.top + rcClient.bottom) * 0.5f);
-}
-
-CPDF_Rect CPWL_Wnd::GetClientCenterSquare() const
-{
- return CPWL_Utils::GetCenterSquare(GetClientRect());
-}
-
-CPDF_Rect CPWL_Wnd::GetWindowCenterSquare() const
-{
- return CPWL_Utils::GetCenterSquare(CPWL_Utils::DeflateRect(GetWindowRect(),0.1f));
-}
-
-FX_BOOL CPWL_Wnd::HasFlag(FX_DWORD dwFlags) const
-{
- return (m_sPrivateParam.dwFlags & dwFlags) != 0;
-}
-
-void CPWL_Wnd::RemoveFlag(FX_DWORD dwFlags)
-{
- m_sPrivateParam.dwFlags &= ~dwFlags;
-}
-
-void CPWL_Wnd::AddFlag(FX_DWORD dwFlags)
-{
- m_sPrivateParam.dwFlags |= dwFlags;
-}
-
-CPWL_Color CPWL_Wnd::GetBackgroundColor() const
-{
- return m_sPrivateParam.sBackgroundColor;
-}
-
-void CPWL_Wnd::SetBackgroundColor(const CPWL_Color & color)
-{
- m_sPrivateParam.sBackgroundColor = color;
-}
-
-void CPWL_Wnd::SetTextColor(const CPWL_Color & color)
-{
- m_sPrivateParam.sTextColor = color;
-}
-
-void CPWL_Wnd::SetTextStrokeColor(const CPWL_Color & color)
-{
- m_sPrivateParam.sTextStrokeColor = color;
-}
-
-CPWL_Color CPWL_Wnd::GetTextColor() const
-{
- return m_sPrivateParam.sTextColor;
-}
-
-CPWL_Color CPWL_Wnd::GetTextStrokeColor() const
-{
- return m_sPrivateParam.sTextStrokeColor;
-}
-
-FX_INT32 CPWL_Wnd::GetBorderStyle() const
-{
- return m_sPrivateParam.nBorderStyle;
-}
-
-void CPWL_Wnd::SetBorderStyle(FX_INT32 nBorderStyle)
-{
- if (HasFlag(PWS_BORDER))
- m_sPrivateParam.nBorderStyle = nBorderStyle;
-}
-
-FX_INT32 CPWL_Wnd::GetBorderWidth() const
-{
- if (HasFlag(PWS_BORDER))
- return m_sPrivateParam.dwBorderWidth;
-
- return 0;
-}
-
-FX_INT32 CPWL_Wnd::GetInnerBorderWidth() const
-{
- /*
- switch (GetBorderStyle())
- {
- case PBS_BEVELED:
- case PBS_INSET:
- return GetBorderWidth() / 2;
- }
- */
- return 0;
-}
-
-void CPWL_Wnd::SetBorderWidth(FX_INT32 nBorderWidth)
-{
- if (HasFlag(PWS_BORDER))
- m_sPrivateParam.dwBorderWidth = nBorderWidth;
-}
-
-CPWL_Color CPWL_Wnd::GetBorderColor() const
-{
- if (HasFlag(PWS_BORDER))
- return m_sPrivateParam.sBorderColor;
-
- return CPWL_Color();
-}
-
-void CPWL_Wnd::SetBorderColor(const CPWL_Color & color)
-{
- if (HasFlag(PWS_BORDER))
- m_sPrivateParam.sBorderColor = color;
-}
-
-CPWL_Dash CPWL_Wnd::GetBorderDash() const
-{
- return m_sPrivateParam.sDash;
-}
-
-void* CPWL_Wnd::GetAttachedData() const
-{
- return m_sPrivateParam.pAttachedData;
-}
-
-void CPWL_Wnd::SetBorderDash(const CPWL_Dash & sDash)
-{
- if (HasFlag(PWS_BORDER))
- m_sPrivateParam.sDash = sDash;
-}
-
-CPWL_ScrollBar* CPWL_Wnd::GetVScrollBar() const
-{
- if (HasFlag(PWS_VSCROLL))
- return m_pVScrollBar;
-
- return NULL;
-}
-
-void CPWL_Wnd::CreateScrollBar(const PWL_CREATEPARAM & cp)
-{
- CreateVScrollBar(cp);
-}
-
-void CPWL_Wnd::CreateVScrollBar(const PWL_CREATEPARAM & cp)
-{
- if (!m_pVScrollBar && HasFlag(PWS_VSCROLL))
- {
- PWL_CREATEPARAM scp = cp;
-
- //flags
- scp.dwFlags = PWS_CHILD| PWS_BACKGROUND | PWS_AUTOTRANSPARENT | PWS_NOREFRESHCLIP;
-
- scp.pParentWnd = this;
- scp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
- scp.eCursorType = FXCT_ARROW;
- scp.nTransparency = PWL_SCROLLBAR_TRANSPARANCY;
-
- if ((m_pVScrollBar = new CPWL_ScrollBar(SBT_VSCROLL)))
- m_pVScrollBar->Create(scp);
- }
-}
-
-void CPWL_Wnd::SetCapture()
-{
- if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
- pMsgCtrl->SetCapture(this);
-}
-
-void CPWL_Wnd::ReleaseCapture()
-{
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
- pChild->ReleaseCapture();
-
- if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
- pMsgCtrl->ReleaseCapture();
-}
-
-void CPWL_Wnd::SetFocus()
-{
- if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
- {
- if (!pMsgCtrl->IsMainCaptureKeyboard(this))
- pMsgCtrl->KillFocus();
- pMsgCtrl->SetFocus(this);
- }
-}
-
-void CPWL_Wnd::KillFocus()
-{
- if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
- {
- if (pMsgCtrl->IsWndCaptureKeyboard(this))
- pMsgCtrl->KillFocus();
- }
-}
-
-void CPWL_Wnd::OnSetFocus()
-{
-}
-
-void CPWL_Wnd::OnKillFocus()
-{
-}
-
-FX_BOOL CPWL_Wnd::WndHitTest(const CPDF_Point & point) const
-{
- return IsValid() && IsVisible() && GetWindowRect().Contains(point.x,point.y);
-}
-
-FX_BOOL CPWL_Wnd::ClientHitTest(const CPDF_Point & point) const
-{
- return IsValid() && IsVisible() && GetClientRect().Contains(point.x,point.y);
-}
-
-const CPWL_Wnd * CPWL_Wnd::GetRootWnd() const
-{
- if (m_sPrivateParam.pParentWnd)
- return m_sPrivateParam.pParentWnd->GetRootWnd();
- else
- return this;
-}
-
-void CPWL_Wnd::SetVisible(FX_BOOL bVisible)
-{
- if (IsValid())
- {
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
- {
- pChild->SetVisible(bVisible);
- }
- }
-
- if (bVisible != m_bVisible)
- {
- m_bVisible = bVisible;
- RePosChildWnd();
- InvalidateRect();
- }
- }
-}
-
-void CPWL_Wnd::SetClipRect(const CPDF_Rect & rect)
-{
- m_rcClip = rect;
- m_rcClip.Normalize();
-}
-
-CPDF_Rect CPWL_Wnd::GetClipRect() const
-{
- return m_rcClip;
-}
-
-FX_BOOL CPWL_Wnd::IsReadOnly() const
-{
- return HasFlag(PWS_READONLY);
-}
-
-void CPWL_Wnd::RePosChildWnd()
-{
- CPDF_Rect rcContent = CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
-
- CPWL_ScrollBar * pVSB = this->GetVScrollBar();
-
- CPDF_Rect rcVScroll = CPDF_Rect(rcContent.right - PWL_SCROLLBAR_WIDTH,
- rcContent.bottom,
- rcContent.right-1.0f,
- rcContent.top);
-
- if (pVSB) pVSB->Move(rcVScroll,TRUE,FALSE);
-}
-
-void CPWL_Wnd::CreateChildWnd(const PWL_CREATEPARAM & cp)
-{
-}
-
-void CPWL_Wnd::SetCursor()
-{
- if (IsValid())
- {
- if (IFX_SystemHandler* pSH = GetSystemHandler())
- {
- FX_INT32 nCursorType = this->GetCreationParam().eCursorType;
- pSH->SetCursor(nCursorType);
- }
- }
-}
-
-void CPWL_Wnd::CreateMsgControl()
-{
- if (!m_sPrivateParam.pMsgControl)
- m_sPrivateParam.pMsgControl = new CPWL_MsgControl(this);
-}
-
-void CPWL_Wnd::DestroyMsgControl()
-{
- if (CPWL_MsgControl* pMsgControl = GetMsgControl())
- if (pMsgControl->IsWndCreated(this))
- delete pMsgControl;
-}
-
-CPWL_MsgControl* CPWL_Wnd::GetMsgControl() const
-{
- return m_sPrivateParam.pMsgControl;
-}
-
-FX_BOOL CPWL_Wnd::IsCaptureMouse() const
-{
- return IsWndCaptureMouse(this);
-}
-
-FX_BOOL CPWL_Wnd::IsWndCaptureMouse(const CPWL_Wnd * pWnd) const
-{
- if (CPWL_MsgControl * pCtrl = GetMsgControl())
- return pCtrl->IsWndCaptureMouse(pWnd);
-
- return FALSE;
-}
-
-FX_BOOL CPWL_Wnd::IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const
-{
- if (CPWL_MsgControl * pCtrl = GetMsgControl())
- return pCtrl->IsWndCaptureKeyboard(pWnd);
-
- return FALSE;
-}
-
-FX_BOOL CPWL_Wnd::IsFocused() const
-{
- if (CPWL_MsgControl * pCtrl = GetMsgControl())
- return pCtrl->IsMainCaptureKeyboard(this);
-
- return FALSE;
-}
-
-CPDF_Rect CPWL_Wnd::GetFocusRect() const
-{
- return CPWL_Utils::InflateRect(this->GetWindowRect(),1);
-}
-
-FX_FLOAT CPWL_Wnd::GetFontSize() const
-{
- return this->m_sPrivateParam.fFontSize;
-}
-
-void CPWL_Wnd::SetFontSize(FX_FLOAT fFontSize)
-{
- this->m_sPrivateParam.fFontSize = fFontSize;
-}
-
-IFX_SystemHandler* CPWL_Wnd::GetSystemHandler() const
-{
- return m_sPrivateParam.pSystemHandler;
-}
-
-IPWL_FocusHandler* CPWL_Wnd::GetFocusHandler() const
-{
- return m_sPrivateParam.pFocusHandler;
-}
-
-IPWL_Provider* CPWL_Wnd::GetProvider() const
-{
- return m_sPrivateParam.pProvider;
-}
-
-IFX_Edit_FontMap* CPWL_Wnd::GetFontMap() const
-{
- return m_sPrivateParam.pFontMap;
-}
-
-CPWL_Color CPWL_Wnd::GetBorderLeftTopColor(FX_INT32 nBorderStyle) const
-{
- CPWL_Color color;
-
- switch (nBorderStyle)
- {
- case PBS_SOLID:
- break;
- case PBS_DASH:
- break;
- case PBS_BEVELED:
- color = CPWL_Color(COLORTYPE_GRAY,1);
- break;
- case PBS_INSET:
- color = CPWL_Color(COLORTYPE_GRAY,0.5f);
- break;
- case PBS_UNDERLINED:
- break;
- }
-
- return color;
-}
-
-CPWL_Color CPWL_Wnd::GetBorderRightBottomColor(FX_INT32 nBorderStyle) const
-{
- CPWL_Color color;
-
- switch (nBorderStyle)
- {
- case PBS_SOLID:
- break;
- case PBS_DASH:
- break;
- case PBS_BEVELED:
- color = CPWL_Utils::DevideColor(GetBackgroundColor(),2);
- break;
- case PBS_INSET:
- color = CPWL_Color(COLORTYPE_GRAY,0.75f);
- break;
- case PBS_UNDERLINED:
- break;
- }
-
- return color;
-}
-
-/* ----------------------------------------------------------------- */
-
-FX_INT32 CPWL_Wnd::GetTransparency()
-{
- return m_sPrivateParam.nTransparency;
-}
-
-void CPWL_Wnd::SetTransparency(FX_INT32 nTransparency)
-{
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
- {
- pChild->SetTransparency(nTransparency);
- }
- }
-
- m_sPrivateParam.nTransparency = nTransparency;
-}
-
-CPDF_Matrix CPWL_Wnd::GetWindowMatrix() const
-{
- CPDF_Matrix mt = this->GetChildToRoot();
-
- if (IPWL_Provider* pProvider = GetProvider())
- {
- mt.Concat(pProvider->GetWindowMatrix(GetAttachedData()));
- return mt;
- }
-
-/*
- if (CReader_App* pApp = CPWL_Module::GetReaderApp())
- if (CReader_Document* pDocument = pApp->GetCurrentDocument())
- if (CReader_DocView* pDocView = pDocument->GetCurrentDocView())
- {
- CPDF_Matrix mtPageView;
- pDocView->GetCurrentMatrix(mtPageView);
- mt.Concat(mtPageView);
- return mt;
- }
-
-*/
-
- return mt;
-}
-
-void CPWL_Wnd::PWLtoWnd(const CPDF_Point& point, FX_INT32& x, FX_INT32& y) const
-{
- CPDF_Matrix mt = GetWindowMatrix();
- CPDF_Point pt = point;
- mt.Transform(pt.x,pt.y);
- x = (FX_INT32)(pt.x+0.5);
- y = (FX_INT32)(pt.y+0.5);
-}
-
-FX_RECT CPWL_Wnd::PWLtoWnd(const CPDF_Rect & rect) const
-{
- CPDF_Rect rcTemp = rect;
- CPDF_Matrix mt = GetWindowMatrix();
- mt.TransformRect(rcTemp);
- return FX_RECT((FX_INT32)(rcTemp.left+0.5), (FX_INT32)(rcTemp.bottom+0.5), (FX_INT32)(rcTemp.right+0.5), (FX_INT32)(rcTemp.top+0.5));
-}
-
-FX_HWND CPWL_Wnd::GetAttachedHWnd() const
-{
- return m_sPrivateParam.hAttachedWnd;
-}
-
-CPDF_Point CPWL_Wnd::ChildToParent(const CPDF_Point& point) const
-{
- CPDF_Matrix mt = GetChildMatrix();
- if (mt.IsIdentity())
- return point;
- else
- {
- CPDF_Point pt = point;
- mt.Transform(pt.x,pt.y);
- return pt;
- }
-}
-
-CPDF_Rect CPWL_Wnd::ChildToParent(const CPDF_Rect& rect) const
-{
- CPDF_Matrix mt = GetChildMatrix();
- if (mt.IsIdentity())
- return rect;
- else
- {
- CPDF_Rect rc = rect;
- mt.TransformRect(rc);
- return rc;
- }
-}
-
-CPDF_Point CPWL_Wnd::ParentToChild(const CPDF_Point& point) const
-{
- CPDF_Matrix mt = GetChildMatrix();
- if (mt.IsIdentity())
- return point;
- else
- {
- mt.SetReverse(mt);
- CPDF_Point pt = point;
- mt.Transform(pt.x,pt.y);
- return pt;
- }
-}
-
-CPDF_Rect CPWL_Wnd::ParentToChild(const CPDF_Rect& rect) const
-{
- CPDF_Matrix mt = GetChildMatrix();
- if (mt.IsIdentity())
- return rect;
- else
- {
- mt.SetReverse(mt);
- CPDF_Rect rc = rect;
- mt.TransformRect(rc);
- return rc;
- }
-}
-
-CPDF_Matrix CPWL_Wnd::GetChildToRoot() const
-{
- CPDF_Matrix mt(1,0,0,1,0,0);
-
- if (HasFlag(PWS_CHILD))
- {
- const CPWL_Wnd* pParent = this;
- while (pParent)
- {
- mt.Concat(pParent->GetChildMatrix());
- pParent = pParent->GetParentWindow();
- }
- }
-
- return mt;
-}
-
-CPDF_Matrix CPWL_Wnd::GetChildMatrix() const
-{
- if (HasFlag(PWS_CHILD))
- return m_sPrivateParam.mtChild;
-
- return CPDF_Matrix(1,0,0,1,0,0);
-}
-
-void CPWL_Wnd::SetChildMatrix(const CPDF_Matrix& mt)
-{
- m_sPrivateParam.mtChild = mt;
-}
-
-const CPWL_Wnd* CPWL_Wnd::GetFocused() const
-{
- if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
- {
- return pMsgCtrl->m_pMainKeyboardWnd;
- }
-
- return NULL;
-}
-
-void CPWL_Wnd::EnableWindow(FX_BOOL bEnable)
-{
- if (m_bEnabled != bEnable)
- {
- for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
- {
- if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
- {
- pChild->EnableWindow(bEnable);
- }
- }
-
- this->m_bEnabled = bEnable;
-
- if (bEnable)
- this->OnEnabled();
- else
- this->OnDisabled();
- }
-}
-
-FX_BOOL CPWL_Wnd::IsEnabled()
-{
- return m_bEnabled;
-}
-
-void CPWL_Wnd::OnEnabled()
-{
-}
-
-void CPWL_Wnd::OnDisabled()
-{
-}
-
-FX_BOOL CPWL_Wnd::IsCTRLpressed(FX_DWORD nFlag) const
-{
- if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
- {
- return pSystemHandler->IsCTRLKeyDown(nFlag);
- }
-
- return FALSE;
-}
-
-FX_BOOL CPWL_Wnd::IsSHIFTpressed(FX_DWORD nFlag) const
-{
- if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
- {
- return pSystemHandler->IsSHIFTKeyDown(nFlag);
- }
-
- return FALSE;
-}
-
-FX_BOOL CPWL_Wnd::IsALTpressed(FX_DWORD nFlag) const
-{
- if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
- {
- return pSystemHandler->IsALTKeyDown(nFlag);
- }
-
- return FALSE;
-}
-
-FX_BOOL CPWL_Wnd::IsINSERTpressed(FX_DWORD nFlag) const
-{
- if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
- {
- return pSystemHandler->IsINSERTKeyDown(nFlag);
- }
-
- return FALSE;
-}
-
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "../../include/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_Utils.h" +#include "../../include/pdfwindow/PWL_ScrollBar.h" + +/* -------------------------- CPWL_Timer -------------------------- */ + +static CFX_MapPtrTemplate<FX_INT32, CPWL_Timer*> g_TimeMap; + +CPWL_Timer::CPWL_Timer(CPWL_TimerHandler* pAttached, IFX_SystemHandler* pSystemHandler) : + m_pAttached(pAttached), + m_nTimerID(0), + m_pSystemHandler(pSystemHandler) +{ + ASSERT(m_pAttached != NULL); + ASSERT(m_pSystemHandler != NULL); +} + +CPWL_Timer::~CPWL_Timer() +{ + KillPWLTimer(); +} + +FX_INT32 CPWL_Timer::SetPWLTimer(FX_INT32 nElapse) +{ + if (m_nTimerID != 0) KillPWLTimer(); + m_nTimerID = m_pSystemHandler->SetTimer(nElapse, TimerProc); + g_TimeMap.SetAt(m_nTimerID, this); + return m_nTimerID; +} + +void CPWL_Timer::KillPWLTimer() +{ + if (m_nTimerID != 0) + { + m_pSystemHandler->KillTimer(m_nTimerID); + g_TimeMap.RemoveKey(m_nTimerID); + m_nTimerID = 0; + } +} + +void CPWL_Timer::TimerProc(FX_INT32 idEvent) +{ + CPWL_Timer* pTimer = NULL; + if (g_TimeMap.Lookup(idEvent, pTimer)) + { + if (pTimer) + { + if (pTimer->m_pAttached) + pTimer->m_pAttached->TimerProc(); + } + } +} + +/* -------------------------- CPWL_TimerHandler -------------------------- */ + +CPWL_TimerHandler::CPWL_TimerHandler() : m_pTimer(NULL) +{ +} + +CPWL_TimerHandler::~CPWL_TimerHandler() +{ + if (m_pTimer) delete m_pTimer; +} + +void CPWL_TimerHandler::BeginTimer(FX_INT32 nElapse) +{ + if (!m_pTimer) + m_pTimer = new CPWL_Timer(this, GetSystemHandler()); + + if (m_pTimer) + m_pTimer->SetPWLTimer(nElapse); +} + +void CPWL_TimerHandler::EndTimer() +{ + if (m_pTimer) + m_pTimer->KillPWLTimer(); +} + +void CPWL_TimerHandler::TimerProc() +{ +} + +/* --------------------------- CPWL_MsgControl ---------------------------- */ + +class CPWL_MsgControl +{ + friend class CPWL_Wnd; + +public: + CPWL_MsgControl(CPWL_Wnd * pWnd) + { +// PWL_TRACE("new CPWL_MsgControl\n"); + m_pCreatedWnd = pWnd; + Default(); + } + + ~CPWL_MsgControl() + { +// PWL_TRACE("~CPWL_MsgControl\n"); + Default(); + } + + void Default() + { + m_aMousePath.RemoveAll(); + m_aKeyboardPath.RemoveAll(); + m_pMainMouseWnd = NULL; + m_pMainKeyboardWnd = NULL; + } + + FX_BOOL IsWndCreated(const CPWL_Wnd * pWnd) const + { + return m_pCreatedWnd == pWnd; + } + + FX_BOOL IsMainCaptureMouse(const CPWL_Wnd * pWnd) const + { + return pWnd == m_pMainMouseWnd; + } + + FX_BOOL IsWndCaptureMouse(const CPWL_Wnd * pWnd) const + { + if (pWnd) + for( FX_INT32 i=0,sz=m_aMousePath.GetSize(); i<sz; i++) + if (m_aMousePath.GetAt(i) == pWnd) + return TRUE; + + return FALSE; + } + + FX_BOOL IsMainCaptureKeyboard(const CPWL_Wnd * pWnd) const + { + return pWnd == m_pMainKeyboardWnd; + } + + + FX_BOOL IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const + { + if (pWnd) + for( FX_INT32 i=0,sz=m_aKeyboardPath.GetSize(); i<sz; i++) + if (m_aKeyboardPath.GetAt(i) == pWnd) + return TRUE; + + return FALSE; + } + + void SetFocus(CPWL_Wnd * pWnd) + { + m_aKeyboardPath.RemoveAll(); + + if (pWnd) + { + m_pMainKeyboardWnd = pWnd; + + CPWL_Wnd * pParent = pWnd; + while (pParent) + { + m_aKeyboardPath.Add(pParent); + pParent = pParent->GetParentWindow(); + } + + pWnd->OnSetFocus(); + } + } + + void KillFocus() + { + if (m_aKeyboardPath.GetSize() > 0) + if (CPWL_Wnd* pWnd = m_aKeyboardPath.GetAt(0)) + pWnd->OnKillFocus(); + + m_pMainKeyboardWnd = NULL; + m_aKeyboardPath.RemoveAll(); + } + + void SetCapture(CPWL_Wnd * pWnd) + { + m_aMousePath.RemoveAll(); + + if (pWnd) + { + m_pMainMouseWnd = pWnd; + + CPWL_Wnd * pParent = pWnd; + while (pParent) + { + m_aMousePath.Add(pParent); + pParent = pParent->GetParentWindow(); + } + } + } + + void ReleaseCapture() + { + m_pMainMouseWnd = NULL; + m_aMousePath.RemoveAll(); + } + +private: + CFX_ArrayTemplate<CPWL_Wnd*> m_aMousePath; + CFX_ArrayTemplate<CPWL_Wnd*> m_aKeyboardPath; + CPWL_Wnd* m_pCreatedWnd; + CPWL_Wnd* m_pMainMouseWnd; + CPWL_Wnd* m_pMainKeyboardWnd; +}; + +/* --------------------------- CPWL_Wnd ---------------------------- */ + +CPWL_Wnd::CPWL_Wnd() : + m_pVScrollBar(NULL), + m_rcWindow(), + m_rcClip(), + m_bCreated(FALSE), + m_bVisible(FALSE), + m_bNotifying(FALSE), + m_bEnabled(TRUE) +{ +} + +CPWL_Wnd::~CPWL_Wnd() +{ + ASSERT(m_bCreated == FALSE); +} + +CFX_ByteString CPWL_Wnd::GetClassName() const +{ + return "CPWL_Wnd"; +} + +void CPWL_Wnd::Create(const PWL_CREATEPARAM & cp) +{ + if (!IsValid()) + { + m_sPrivateParam = cp; + + OnCreate(m_sPrivateParam); + + m_sPrivateParam.rcRectWnd.Normalize(); + m_rcWindow = m_sPrivateParam.rcRectWnd; + m_rcClip = CPWL_Utils::InflateRect(m_rcWindow,1.0f); + + CreateMsgControl(); + + if (m_sPrivateParam.pParentWnd) + m_sPrivateParam.pParentWnd->OnNotify(this, PNM_ADDCHILD); + + PWL_CREATEPARAM ccp = m_sPrivateParam; + + ccp.dwFlags &= 0xFFFF0000L; //remove sub styles + ccp.mtChild = CPDF_Matrix(1,0,0,1,0,0); + + CreateScrollBar(ccp); + CreateChildWnd(ccp); + + m_bVisible = HasFlag(PWS_VISIBLE); + + OnCreated(); + + RePosChildWnd(); + m_bCreated = TRUE; + } +} + +void CPWL_Wnd::OnCreate(PWL_CREATEPARAM & cp) +{ +} + +void CPWL_Wnd::OnCreated() +{ +} + +void CPWL_Wnd::OnDestroy() +{ +} + +void CPWL_Wnd::Destroy() +{ + KillFocus(); + + OnDestroy(); + + if (m_bCreated) + { + for (FX_INT32 i = m_aChildren.GetSize()-1; i >= 0; i --) + { + if (CPWL_Wnd * pChild = m_aChildren[i]) + { + pChild->Destroy(); + delete pChild; + pChild = NULL; + } + } + + if (m_sPrivateParam.pParentWnd) + m_sPrivateParam.pParentWnd->OnNotify(this, PNM_REMOVECHILD); + m_bCreated = FALSE; + } + + DestroyMsgControl(); + + FXSYS_memset(&m_sPrivateParam, 0, sizeof(PWL_CREATEPARAM)); + m_aChildren.RemoveAll(); + m_pVScrollBar = NULL; +} + +void CPWL_Wnd::Move(const CPDF_Rect & rcNew, FX_BOOL bReset,FX_BOOL bRefresh) +{ + if (IsValid()) + { + CPDF_Rect rcOld = this->GetWindowRect(); + + m_rcWindow = rcNew; + m_rcWindow.Normalize(); + //m_rcClip = CPWL_Utils::InflateRect(m_rcWindow,1.0f); //for special caret + + if (rcOld.left != rcNew.left || rcOld.right != rcNew.right || + rcOld.top != rcNew.top || rcOld.bottom != rcNew.bottom) + { + if (bReset) + { + RePosChildWnd(); + } + + } + if (bRefresh) + { + InvalidateRectMove(rcOld,rcNew); + } + + m_sPrivateParam.rcRectWnd = m_rcWindow; + } +} + +void CPWL_Wnd::InvalidateRectMove(const CPDF_Rect & rcOld, const CPDF_Rect & rcNew) +{ + CPDF_Rect rcUnion = rcOld; + rcUnion.Union(rcNew); + + InvalidateRect(&rcUnion); + + /* + CPDF_Rect SubArray[4]; + + rcOld.Substract4(rcNew,SubArray); + for (FX_INT32 i=0;i<4;i++) + { + if (SubArray[i].left == 0 && + SubArray[i].right == 0 && + SubArray[i].top == 0 && + SubArray[i].bottom == 0)continue; + + InvalidateRect(&CPWL_Utils::InflateRect(SubArray[i],2)); + } + + rcNew.Substract4(rcOld,SubArray); + for (FX_INT32 j=0;j<4;j++) + { + if (SubArray[j].left == 0 && + SubArray[j].right == 0 && + SubArray[j].top == 0 && + SubArray[j].bottom == 0)continue; + + InvalidateRect(&CPWL_Utils::InflateRect(SubArray[j],2)); + } + */ +} + +void CPWL_Wnd::GetAppearanceStream(CFX_ByteString & sAppStream) +{ + if (IsValid()) + { + CFX_ByteTextBuf sTextBuf; + GetAppearanceStream(sTextBuf); + sAppStream += sTextBuf.GetByteString(); + } +} + +void CPWL_Wnd::GetAppearanceStream(CFX_ByteTextBuf & sAppStream) +{ + if (IsValid() && IsVisible()) + { + GetThisAppearanceStream(sAppStream); + GetChildAppearanceStream(sAppStream); + } +} + +//if don't set,Get default apperance stream +void CPWL_Wnd::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream) +{ + CPDF_Rect rectWnd = GetWindowRect(); + if (!rectWnd.IsEmpty()) + { + CFX_ByteTextBuf sThis; + + if (HasFlag(PWS_BACKGROUND)) + sThis << CPWL_Utils::GetRectFillAppStream(rectWnd,this->GetBackgroundColor()); + + if (HasFlag(PWS_BORDER)) + sThis << CPWL_Utils::GetBorderAppStream(rectWnd, + (FX_FLOAT)GetBorderWidth(), + GetBorderColor(), + this->GetBorderLeftTopColor(this->GetBorderStyle()), + this->GetBorderRightBottomColor(this->GetBorderStyle()), + this->GetBorderStyle(), + this->GetBorderDash()); + + sAppStream << sThis; + } +} + +void CPWL_Wnd::GetChildAppearanceStream(CFX_ByteTextBuf & sAppStream) +{ + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd * pChild = m_aChildren.GetAt(i)) + { + pChild->GetAppearanceStream(sAppStream); + } + } +} + +void CPWL_Wnd::DrawAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + if (IsValid() && IsVisible()) + { + DrawThisAppearance(pDevice,pUser2Device); + DrawChildAppearance(pDevice,pUser2Device); + } +} + +void CPWL_Wnd::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + CPDF_Rect rectWnd = GetWindowRect(); + if (!rectWnd.IsEmpty()) + { + if (HasFlag(PWS_BACKGROUND)) + { + CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rectWnd,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth())); + CPWL_Utils::DrawFillRect(pDevice,pUser2Device,rcClient,this->GetBackgroundColor(),GetTransparency()); + } + + if (HasFlag(PWS_BORDER)) + CPWL_Utils::DrawBorder(pDevice, + pUser2Device, + rectWnd, + (FX_FLOAT)GetBorderWidth(), + GetBorderColor(), + this->GetBorderLeftTopColor(this->GetBorderStyle()), + this->GetBorderRightBottomColor(this->GetBorderStyle()), + this->GetBorderStyle(), + this->GetBorderDash(), + GetTransparency()); + } +} + +void CPWL_Wnd::DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device) +{ + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd * pChild = m_aChildren.GetAt(i)) + { + CPDF_Matrix mt = pChild->GetChildMatrix(); + if (mt.IsIdentity()) + { + pChild->DrawAppearance(pDevice,pUser2Device); + } + else + { + mt.Concat(*pUser2Device); + pChild->DrawAppearance(pDevice,&mt); + } + } + } +} + +void CPWL_Wnd::InvalidateRect(CPDF_Rect* pRect) +{ + if (IsValid()) + { + CPDF_Rect rcRefresh = pRect ? *pRect : GetWindowRect(); + + if (!HasFlag(PWS_NOREFRESHCLIP)) + { + CPDF_Rect rcClip = GetClipRect(); + if (!rcClip.IsEmpty()) + { + rcRefresh.Intersect(rcClip); + } + } + + FX_RECT rcWin = PWLtoWnd(rcRefresh); + rcWin.left -= PWL_INVALIDATE_INFLATE; + rcWin.top -= PWL_INVALIDATE_INFLATE; + rcWin.right += PWL_INVALIDATE_INFLATE; + rcWin.bottom += PWL_INVALIDATE_INFLATE; + + if (IFX_SystemHandler* pSH = GetSystemHandler()) + { + if (FX_HWND hWnd = GetAttachedHWnd()) + { + pSH->InvalidateRect(hWnd, rcWin); + } + } + } +} + +#define PWL_IMPLEMENT_KEY_METHOD(key_method_name)\ +FX_BOOL CPWL_Wnd::key_method_name(FX_WORD nChar, FX_DWORD nFlag)\ +{\ + if (IsValid() && IsVisible() && IsEnabled())\ + {\ + if (IsWndCaptureKeyboard(this))\ + {\ + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\ + {\ + if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\ + {\ + if (IsWndCaptureKeyboard(pChild))\ + {\ + return pChild->key_method_name(nChar,nFlag);\ + }\ + }\ + }\ + }\ + }\ + return FALSE;\ +} + +#define PWL_IMPLEMENT_MOUSE_METHOD(mouse_method_name)\ +FX_BOOL CPWL_Wnd::mouse_method_name(const CPDF_Point & point, FX_DWORD nFlag)\ +{\ + if (IsValid() && IsVisible() && IsEnabled())\ + {\ + if (IsWndCaptureMouse(this))\ + {\ + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\ + {\ + if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\ + {\ + if (IsWndCaptureMouse(pChild))\ + {\ + return pChild->mouse_method_name(pChild->ParentToChild(point),nFlag);\ + }\ + }\ + }\ + SetCursor();\ + }\ + else\ + {\ + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\ + {\ + if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\ + {\ + if (pChild->WndHitTest(pChild->ParentToChild(point)))\ + {\ + return pChild->mouse_method_name(pChild->ParentToChild(point),nFlag);\ + }\ + }\ + }\ + if (this->WndHitTest(point))\ + SetCursor();\ + }\ + }\ + return FALSE;\ +} + +PWL_IMPLEMENT_KEY_METHOD(OnKeyDown) +PWL_IMPLEMENT_KEY_METHOD(OnKeyUp) +PWL_IMPLEMENT_KEY_METHOD(OnChar) + +PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDblClk) +PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDown) +PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonUp) +PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDblClk) +PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDown) +PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonUp) +PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDblClk) +PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDown) +PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonUp) +PWL_IMPLEMENT_MOUSE_METHOD(OnMouseMove) + +FX_BOOL CPWL_Wnd::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag) +{ + if (IsValid() && IsVisible() && IsEnabled()) + { + SetCursor(); + if (IsWndCaptureKeyboard(this)) + { + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd * pChild = m_aChildren.GetAt(i)) + { + if (IsWndCaptureKeyboard(pChild)) + { + return pChild->OnMouseWheel(zDelta,pChild->ParentToChild(point), nFlag); + } + } + } + } + } + return FALSE; +} + +void CPWL_Wnd::AddChild(CPWL_Wnd * pWnd) +{ + m_aChildren.Add(pWnd); +} + +void CPWL_Wnd::RemoveChild(CPWL_Wnd * pWnd) +{ + for (FX_INT32 i = m_aChildren.GetSize()-1; i >= 0; i --) + { + if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) + { + if (pChild == pWnd) + { + m_aChildren.RemoveAt(i); + break; + } + } + } +} + +void CPWL_Wnd::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam) +{ + switch (msg) + { + case PNM_ADDCHILD: + this->AddChild(pWnd); + break; + case PNM_REMOVECHILD: + this->RemoveChild(pWnd); + break; + default: + break; + } +} + +FX_BOOL CPWL_Wnd::IsValid() const +{ + return m_bCreated; +} + +PWL_CREATEPARAM CPWL_Wnd::GetCreationParam() const +{ + return m_sPrivateParam; +} + +CPWL_Wnd* CPWL_Wnd::GetParentWindow() const +{ + return m_sPrivateParam.pParentWnd; +} + +CPDF_Rect CPWL_Wnd::GetOriginWindowRect() const +{ + return m_sPrivateParam.rcRectWnd; +} + +CPDF_Rect CPWL_Wnd::GetWindowRect() const +{ + return m_rcWindow; +} + +CPDF_Rect CPWL_Wnd::GetClientRect() const +{ + CPDF_Rect rcWindow = GetWindowRect(); + CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth())); + + if (CPWL_ScrollBar * pVSB = this->GetVScrollBar()) + rcClient.right -= pVSB->GetScrollBarWidth(); + + rcClient.Normalize(); + + if (rcWindow.Contains(rcClient)) + return rcClient; + else + return CPDF_Rect(); +} + +CPDF_Point CPWL_Wnd::GetCenterPoint() const +{ + CPDF_Rect rcClient = GetClientRect(); + + return CPDF_Point((rcClient.left + rcClient.right) * 0.5f, + (rcClient.top + rcClient.bottom) * 0.5f); +} + +CPDF_Rect CPWL_Wnd::GetClientCenterSquare() const +{ + return CPWL_Utils::GetCenterSquare(GetClientRect()); +} + +CPDF_Rect CPWL_Wnd::GetWindowCenterSquare() const +{ + return CPWL_Utils::GetCenterSquare(CPWL_Utils::DeflateRect(GetWindowRect(),0.1f)); +} + +FX_BOOL CPWL_Wnd::HasFlag(FX_DWORD dwFlags) const +{ + return (m_sPrivateParam.dwFlags & dwFlags) != 0; +} + +void CPWL_Wnd::RemoveFlag(FX_DWORD dwFlags) +{ + m_sPrivateParam.dwFlags &= ~dwFlags; +} + +void CPWL_Wnd::AddFlag(FX_DWORD dwFlags) +{ + m_sPrivateParam.dwFlags |= dwFlags; +} + +CPWL_Color CPWL_Wnd::GetBackgroundColor() const +{ + return m_sPrivateParam.sBackgroundColor; +} + +void CPWL_Wnd::SetBackgroundColor(const CPWL_Color & color) +{ + m_sPrivateParam.sBackgroundColor = color; +} + +void CPWL_Wnd::SetTextColor(const CPWL_Color & color) +{ + m_sPrivateParam.sTextColor = color; +} + +void CPWL_Wnd::SetTextStrokeColor(const CPWL_Color & color) +{ + m_sPrivateParam.sTextStrokeColor = color; +} + +CPWL_Color CPWL_Wnd::GetTextColor() const +{ + return m_sPrivateParam.sTextColor; +} + +CPWL_Color CPWL_Wnd::GetTextStrokeColor() const +{ + return m_sPrivateParam.sTextStrokeColor; +} + +FX_INT32 CPWL_Wnd::GetBorderStyle() const +{ + return m_sPrivateParam.nBorderStyle; +} + +void CPWL_Wnd::SetBorderStyle(FX_INT32 nBorderStyle) +{ + if (HasFlag(PWS_BORDER)) + m_sPrivateParam.nBorderStyle = nBorderStyle; +} + +FX_INT32 CPWL_Wnd::GetBorderWidth() const +{ + if (HasFlag(PWS_BORDER)) + return m_sPrivateParam.dwBorderWidth; + + return 0; +} + +FX_INT32 CPWL_Wnd::GetInnerBorderWidth() const +{ + /* + switch (GetBorderStyle()) + { + case PBS_BEVELED: + case PBS_INSET: + return GetBorderWidth() / 2; + } + */ + return 0; +} + +void CPWL_Wnd::SetBorderWidth(FX_INT32 nBorderWidth) +{ + if (HasFlag(PWS_BORDER)) + m_sPrivateParam.dwBorderWidth = nBorderWidth; +} + +CPWL_Color CPWL_Wnd::GetBorderColor() const +{ + if (HasFlag(PWS_BORDER)) + return m_sPrivateParam.sBorderColor; + + return CPWL_Color(); +} + +void CPWL_Wnd::SetBorderColor(const CPWL_Color & color) +{ + if (HasFlag(PWS_BORDER)) + m_sPrivateParam.sBorderColor = color; +} + +CPWL_Dash CPWL_Wnd::GetBorderDash() const +{ + return m_sPrivateParam.sDash; +} + +void* CPWL_Wnd::GetAttachedData() const +{ + return m_sPrivateParam.pAttachedData; +} + +void CPWL_Wnd::SetBorderDash(const CPWL_Dash & sDash) +{ + if (HasFlag(PWS_BORDER)) + m_sPrivateParam.sDash = sDash; +} + +CPWL_ScrollBar* CPWL_Wnd::GetVScrollBar() const +{ + if (HasFlag(PWS_VSCROLL)) + return m_pVScrollBar; + + return NULL; +} + +void CPWL_Wnd::CreateScrollBar(const PWL_CREATEPARAM & cp) +{ + CreateVScrollBar(cp); +} + +void CPWL_Wnd::CreateVScrollBar(const PWL_CREATEPARAM & cp) +{ + if (!m_pVScrollBar && HasFlag(PWS_VSCROLL)) + { + PWL_CREATEPARAM scp = cp; + + //flags + scp.dwFlags = PWS_CHILD| PWS_BACKGROUND | PWS_AUTOTRANSPARENT | PWS_NOREFRESHCLIP; + + scp.pParentWnd = this; + scp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR; + scp.eCursorType = FXCT_ARROW; + scp.nTransparency = PWL_SCROLLBAR_TRANSPARANCY; + + if ((m_pVScrollBar = new CPWL_ScrollBar(SBT_VSCROLL))) + m_pVScrollBar->Create(scp); + } +} + +void CPWL_Wnd::SetCapture() +{ + if (CPWL_MsgControl * pMsgCtrl = GetMsgControl()) + pMsgCtrl->SetCapture(this); +} + +void CPWL_Wnd::ReleaseCapture() +{ + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++) + if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) + pChild->ReleaseCapture(); + + if (CPWL_MsgControl * pMsgCtrl = GetMsgControl()) + pMsgCtrl->ReleaseCapture(); +} + +void CPWL_Wnd::SetFocus() +{ + if (CPWL_MsgControl * pMsgCtrl = GetMsgControl()) + { + if (!pMsgCtrl->IsMainCaptureKeyboard(this)) + pMsgCtrl->KillFocus(); + pMsgCtrl->SetFocus(this); + } +} + +void CPWL_Wnd::KillFocus() +{ + if (CPWL_MsgControl * pMsgCtrl = GetMsgControl()) + { + if (pMsgCtrl->IsWndCaptureKeyboard(this)) + pMsgCtrl->KillFocus(); + } +} + +void CPWL_Wnd::OnSetFocus() +{ +} + +void CPWL_Wnd::OnKillFocus() +{ +} + +FX_BOOL CPWL_Wnd::WndHitTest(const CPDF_Point & point) const +{ + return IsValid() && IsVisible() && GetWindowRect().Contains(point.x,point.y); +} + +FX_BOOL CPWL_Wnd::ClientHitTest(const CPDF_Point & point) const +{ + return IsValid() && IsVisible() && GetClientRect().Contains(point.x,point.y); +} + +const CPWL_Wnd * CPWL_Wnd::GetRootWnd() const +{ + if (m_sPrivateParam.pParentWnd) + return m_sPrivateParam.pParentWnd->GetRootWnd(); + else + return this; +} + +void CPWL_Wnd::SetVisible(FX_BOOL bVisible) +{ + if (IsValid()) + { + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) + { + pChild->SetVisible(bVisible); + } + } + + if (bVisible != m_bVisible) + { + m_bVisible = bVisible; + RePosChildWnd(); + InvalidateRect(); + } + } +} + +void CPWL_Wnd::SetClipRect(const CPDF_Rect & rect) +{ + m_rcClip = rect; + m_rcClip.Normalize(); +} + +CPDF_Rect CPWL_Wnd::GetClipRect() const +{ + return m_rcClip; +} + +FX_BOOL CPWL_Wnd::IsReadOnly() const +{ + return HasFlag(PWS_READONLY); +} + +void CPWL_Wnd::RePosChildWnd() +{ + CPDF_Rect rcContent = CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth())); + + CPWL_ScrollBar * pVSB = this->GetVScrollBar(); + + CPDF_Rect rcVScroll = CPDF_Rect(rcContent.right - PWL_SCROLLBAR_WIDTH, + rcContent.bottom, + rcContent.right-1.0f, + rcContent.top); + + if (pVSB) pVSB->Move(rcVScroll,TRUE,FALSE); +} + +void CPWL_Wnd::CreateChildWnd(const PWL_CREATEPARAM & cp) +{ +} + +void CPWL_Wnd::SetCursor() +{ + if (IsValid()) + { + if (IFX_SystemHandler* pSH = GetSystemHandler()) + { + FX_INT32 nCursorType = this->GetCreationParam().eCursorType; + pSH->SetCursor(nCursorType); + } + } +} + +void CPWL_Wnd::CreateMsgControl() +{ + if (!m_sPrivateParam.pMsgControl) + m_sPrivateParam.pMsgControl = new CPWL_MsgControl(this); +} + +void CPWL_Wnd::DestroyMsgControl() +{ + if (CPWL_MsgControl* pMsgControl = GetMsgControl()) + if (pMsgControl->IsWndCreated(this)) + delete pMsgControl; +} + +CPWL_MsgControl* CPWL_Wnd::GetMsgControl() const +{ + return m_sPrivateParam.pMsgControl; +} + +FX_BOOL CPWL_Wnd::IsCaptureMouse() const +{ + return IsWndCaptureMouse(this); +} + +FX_BOOL CPWL_Wnd::IsWndCaptureMouse(const CPWL_Wnd * pWnd) const +{ + if (CPWL_MsgControl * pCtrl = GetMsgControl()) + return pCtrl->IsWndCaptureMouse(pWnd); + + return FALSE; +} + +FX_BOOL CPWL_Wnd::IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const +{ + if (CPWL_MsgControl * pCtrl = GetMsgControl()) + return pCtrl->IsWndCaptureKeyboard(pWnd); + + return FALSE; +} + +FX_BOOL CPWL_Wnd::IsFocused() const +{ + if (CPWL_MsgControl * pCtrl = GetMsgControl()) + return pCtrl->IsMainCaptureKeyboard(this); + + return FALSE; +} + +CPDF_Rect CPWL_Wnd::GetFocusRect() const +{ + return CPWL_Utils::InflateRect(this->GetWindowRect(),1); +} + +FX_FLOAT CPWL_Wnd::GetFontSize() const +{ + return this->m_sPrivateParam.fFontSize; +} + +void CPWL_Wnd::SetFontSize(FX_FLOAT fFontSize) +{ + this->m_sPrivateParam.fFontSize = fFontSize; +} + +IFX_SystemHandler* CPWL_Wnd::GetSystemHandler() const +{ + return m_sPrivateParam.pSystemHandler; +} + +IPWL_FocusHandler* CPWL_Wnd::GetFocusHandler() const +{ + return m_sPrivateParam.pFocusHandler; +} + +IPWL_Provider* CPWL_Wnd::GetProvider() const +{ + return m_sPrivateParam.pProvider; +} + +IFX_Edit_FontMap* CPWL_Wnd::GetFontMap() const +{ + return m_sPrivateParam.pFontMap; +} + +CPWL_Color CPWL_Wnd::GetBorderLeftTopColor(FX_INT32 nBorderStyle) const +{ + CPWL_Color color; + + switch (nBorderStyle) + { + case PBS_SOLID: + break; + case PBS_DASH: + break; + case PBS_BEVELED: + color = CPWL_Color(COLORTYPE_GRAY,1); + break; + case PBS_INSET: + color = CPWL_Color(COLORTYPE_GRAY,0.5f); + break; + case PBS_UNDERLINED: + break; + } + + return color; +} + +CPWL_Color CPWL_Wnd::GetBorderRightBottomColor(FX_INT32 nBorderStyle) const +{ + CPWL_Color color; + + switch (nBorderStyle) + { + case PBS_SOLID: + break; + case PBS_DASH: + break; + case PBS_BEVELED: + color = CPWL_Utils::DevideColor(GetBackgroundColor(),2); + break; + case PBS_INSET: + color = CPWL_Color(COLORTYPE_GRAY,0.75f); + break; + case PBS_UNDERLINED: + break; + } + + return color; +} + +/* ----------------------------------------------------------------- */ + +FX_INT32 CPWL_Wnd::GetTransparency() +{ + return m_sPrivateParam.nTransparency; +} + +void CPWL_Wnd::SetTransparency(FX_INT32 nTransparency) +{ + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) + { + pChild->SetTransparency(nTransparency); + } + } + + m_sPrivateParam.nTransparency = nTransparency; +} + +CPDF_Matrix CPWL_Wnd::GetWindowMatrix() const +{ + CPDF_Matrix mt = this->GetChildToRoot(); + + if (IPWL_Provider* pProvider = GetProvider()) + { + mt.Concat(pProvider->GetWindowMatrix(GetAttachedData())); + return mt; + } + +/* + if (CReader_App* pApp = CPWL_Module::GetReaderApp()) + if (CReader_Document* pDocument = pApp->GetCurrentDocument()) + if (CReader_DocView* pDocView = pDocument->GetCurrentDocView()) + { + CPDF_Matrix mtPageView; + pDocView->GetCurrentMatrix(mtPageView); + mt.Concat(mtPageView); + return mt; + } + +*/ + + return mt; +} + +void CPWL_Wnd::PWLtoWnd(const CPDF_Point& point, FX_INT32& x, FX_INT32& y) const +{ + CPDF_Matrix mt = GetWindowMatrix(); + CPDF_Point pt = point; + mt.Transform(pt.x,pt.y); + x = (FX_INT32)(pt.x+0.5); + y = (FX_INT32)(pt.y+0.5); +} + +FX_RECT CPWL_Wnd::PWLtoWnd(const CPDF_Rect & rect) const +{ + CPDF_Rect rcTemp = rect; + CPDF_Matrix mt = GetWindowMatrix(); + mt.TransformRect(rcTemp); + return FX_RECT((FX_INT32)(rcTemp.left+0.5), (FX_INT32)(rcTemp.bottom+0.5), (FX_INT32)(rcTemp.right+0.5), (FX_INT32)(rcTemp.top+0.5)); +} + +FX_HWND CPWL_Wnd::GetAttachedHWnd() const +{ + return m_sPrivateParam.hAttachedWnd; +} + +CPDF_Point CPWL_Wnd::ChildToParent(const CPDF_Point& point) const +{ + CPDF_Matrix mt = GetChildMatrix(); + if (mt.IsIdentity()) + return point; + else + { + CPDF_Point pt = point; + mt.Transform(pt.x,pt.y); + return pt; + } +} + +CPDF_Rect CPWL_Wnd::ChildToParent(const CPDF_Rect& rect) const +{ + CPDF_Matrix mt = GetChildMatrix(); + if (mt.IsIdentity()) + return rect; + else + { + CPDF_Rect rc = rect; + mt.TransformRect(rc); + return rc; + } +} + +CPDF_Point CPWL_Wnd::ParentToChild(const CPDF_Point& point) const +{ + CPDF_Matrix mt = GetChildMatrix(); + if (mt.IsIdentity()) + return point; + else + { + mt.SetReverse(mt); + CPDF_Point pt = point; + mt.Transform(pt.x,pt.y); + return pt; + } +} + +CPDF_Rect CPWL_Wnd::ParentToChild(const CPDF_Rect& rect) const +{ + CPDF_Matrix mt = GetChildMatrix(); + if (mt.IsIdentity()) + return rect; + else + { + mt.SetReverse(mt); + CPDF_Rect rc = rect; + mt.TransformRect(rc); + return rc; + } +} + +CPDF_Matrix CPWL_Wnd::GetChildToRoot() const +{ + CPDF_Matrix mt(1,0,0,1,0,0); + + if (HasFlag(PWS_CHILD)) + { + const CPWL_Wnd* pParent = this; + while (pParent) + { + mt.Concat(pParent->GetChildMatrix()); + pParent = pParent->GetParentWindow(); + } + } + + return mt; +} + +CPDF_Matrix CPWL_Wnd::GetChildMatrix() const +{ + if (HasFlag(PWS_CHILD)) + return m_sPrivateParam.mtChild; + + return CPDF_Matrix(1,0,0,1,0,0); +} + +void CPWL_Wnd::SetChildMatrix(const CPDF_Matrix& mt) +{ + m_sPrivateParam.mtChild = mt; +} + +const CPWL_Wnd* CPWL_Wnd::GetFocused() const +{ + if (CPWL_MsgControl * pMsgCtrl = GetMsgControl()) + { + return pMsgCtrl->m_pMainKeyboardWnd; + } + + return NULL; +} + +void CPWL_Wnd::EnableWindow(FX_BOOL bEnable) +{ + if (m_bEnabled != bEnable) + { + for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++) + { + if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) + { + pChild->EnableWindow(bEnable); + } + } + + this->m_bEnabled = bEnable; + + if (bEnable) + this->OnEnabled(); + else + this->OnDisabled(); + } +} + +FX_BOOL CPWL_Wnd::IsEnabled() +{ + return m_bEnabled; +} + +void CPWL_Wnd::OnEnabled() +{ +} + +void CPWL_Wnd::OnDisabled() +{ +} + +FX_BOOL CPWL_Wnd::IsCTRLpressed(FX_DWORD nFlag) const +{ + if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) + { + return pSystemHandler->IsCTRLKeyDown(nFlag); + } + + return FALSE; +} + +FX_BOOL CPWL_Wnd::IsSHIFTpressed(FX_DWORD nFlag) const +{ + if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) + { + return pSystemHandler->IsSHIFTKeyDown(nFlag); + } + + return FALSE; +} + +FX_BOOL CPWL_Wnd::IsALTpressed(FX_DWORD nFlag) const +{ + if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) + { + return pSystemHandler->IsALTKeyDown(nFlag); + } + + return FALSE; +} + +FX_BOOL CPWL_Wnd::IsINSERTpressed(FX_DWORD nFlag) const +{ + if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) + { + return pSystemHandler->IsINSERTKeyDown(nFlag); + } + + return FALSE; +} + |