OSDN Git Service

Merge branch 'master' of https://github.com/winmerge/winmerge into jp
[winmerge-jp/winmerge-jp.git] / Src / LocationView.h
index d96e252..9f948c3 100644 (file)
-//////////////////////////////////////////////////////////////////////
 /** 
  * @file  LocationView.h
  *
  * @brief Declaration of CLocationView class
  */
-//
-//////////////////////////////////////////////////////////////////////
-#ifndef __LOCATIONVIEW_H__
-#define __LOCATIONVIEW_H__
+#pragma once
 
+#include <vector>
+#include <memory>
 
-/**
- * @brief Status for display moved block
- */
-enum DISPLAY_MOVED_BLOCKS
-{
-       DISPLAY_MOVED_NONE = 0,
-       DISPLAY_MOVED_ALL,
-       DISPLAY_MOVED_FOLLOW_DIFF,
-};
+class CMergeDoc;
+class CMergeEditView;
 
 /**
  * @brief Endpoints of line connecting moved blocks
  */
 struct MovedLine
 {
-       CPoint ptLeft;
-       CPoint ptRight;
+       int apparent0;
+       int apparent1;
+       int blockHeight;
+       CPoint ptLeftUpper;
+       CPoint ptLeftLower;
+       CPoint ptRightUpper;
+       CPoint ptRightLower;
+       bool currentDiff;
 };
 
 typedef CList<MovedLine, MovedLine&> MOVEDLINE_LIST;
 
+/**
+ * @brief A struct mapping difference lines to pixels in location pane.
+ * This structure maps one difference's line numbers to pixel locations in
+ * the location pane. The line numbers are "fixed" i.e. they are converted to
+ * word-wrapped absolute line numbers if needed.
+ */
+struct DiffBlock
+{
+       unsigned top_line; /**< First line of the difference. */
+       unsigned bottom_line; /**< Last line of the difference. */
+       unsigned top_coord; /**< X-coord of diff block begin. */
+       unsigned bottom_coord; /**< X-coord of diff block end. */
+       unsigned diff_index; /**< Index of difference in the original diff list. */
+       int op;
+};
+
 /** 
  * @brief Class showing map of files.
+ * The location is a view showing two vertical bars. Each bar depicts one file
+ * in the file compare. The bars show a scaled view of the files. The
+ * difference areas are drawn with the same colors than in actual file compare.
+ * Also visible area of files is drawn as "shaded".
+ *
+ * These visualizations allow user to easily see a overall picture of the files
+ * in comparison. Using mouse it allows easy and fast moving in files.
  */
 class CLocationView : public CView
 {
 public:
        CLocationView();
+       ~CLocationView();
        DECLARE_DYNCREATE(CLocationView)
-       void SetConnectMovedBlocks(int displayMovedBlocks);
+       void SetConnectMovedBlocks(bool displayMovedBlocks);
        void UpdateVisiblePos(int nTopLine = -1, int nBottomLine = -1);
+       void SetFrameHwnd(HWND hwndFrame);
+       void ForceRecalculate();
 
 protected:
 
 // Overrides
        // ClassWizard generated virtual function overrides
-       //{{AFX_VIRTUAL(CMergeDiffDetailView)
+       //{{AFX_VIRTUAL(CLocationView)
        public:
-       virtual void OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint);
+       virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
        virtual void OnDraw(CDC* pDC);
-       afx_msg void OnClose();
        //}}AFX_VIRTUAL
 
-       CMergeDoc* GetDocument();
-
 protected:
-       // Return end of block (diff/non-diff)
-       BOOL GetNextRect(int &nLineIndex);
-       void DrawRect(CDC* pDC, const CRect& r, COLORREF cr, BOOL border = FALSE);
-       BOOL GotoLocation(CPoint point, BOOL bRealLine = TRUE);
-       int GetLineFromYPos(int nYCoord, CRect rc, int bar, BOOL bRealLine = TRUE);
-       int IsInsideBar(CRect rc, POINT pt);
-       void DrawVisibleAreaRect(int nTopLine = -1, int nBottomLine = -1);
-       void DrawConnectLines();
+       CMergeDoc* GetDocument();
+       void DrawRect(CDC* pDC, const CRect& r, COLORREF cr, bool bSelected = false);
+       bool GotoLocation(const CPoint& point, bool bRealLine = true, bool bMoveAnchor = true);
+       int GetLineFromYPos(int nYCoord, int bar, bool bRealLine = true);
+       int IsInsideBar(const CRect& rc, const POINT& pt);
+       void DrawVisibleAreaRect(CDC* pDC, int nTopLine = -1, int nBottomLine = -1);
+       void DrawConnectLines(CDC* pDC);
+       void DrawDiffMarker(CDC* pDC, int yCoord);
+       void CalculateBars();
+       void CalculateBlocks();
+       void CalculateBlocksPixel(int nBlockStart, int nBlockEnd, int nBlockLength,
+                       int &nBeginY, int &nEndY);
+       COLORREF GetBackgroundColor();
+       void DrawBackground(CDC* pDC);
 
 private:
-       CMergeEditView* m_view[2];
-       int m_displayMovedBlocks;
+       bool m_displayMovedBlocks; //*< Setting for displaying moved blocks */
        double m_pixInLines; //*< How many pixels is one line in bars */
-       UINT m_nLeftBarLeft; //*< Left edge of left-side bar */
-       UINT m_nLeftBarRight; //*< Right edge of left-side bar */
-       UINT m_nRightBarLeft; //*< Left edge of right-side bar */
-       UINT m_nRightBarRight; //*< Right edge of right-side bar */
+       double m_lineInPix; //*< How many lines is one pixel?
+       CRect m_bar[3]; //*< Left/middle/riggt bar */
        int m_visibleTop; //*< Top visible line for visible area indicator */
        int m_visibleBottom; //*< Bottom visible line for visible area indicator */
+       int m_nSubLineCount[3]; //*< Cached subline count */
        MOVEDLINE_LIST m_movedLines; //*< List of moved block connecting lines */
-       bool m_bIgnoreTrivials; //*< Whether to paint trivial blocks */
+       HWND m_hwndFrame; //*< Frame window handle */
+       std::unique_ptr<CBitmap> m_pSavedBackgroundBitmap; //*< Saved background */
+       bool m_bDrawn; //*< Is already drawn in location pane? */
+       std::vector<DiffBlock> m_diffBlocks; //*< List of pre-calculated diff blocks.
+       bool m_bRecalculateBlocks; //*< Recalculate diff blocks in next repaint.
+       CSize m_currentSize; //*< Current size of the panel.
 
        // Generated message map functions
 protected:
@@ -84,21 +113,28 @@ protected:
        afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
        afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
        afx_msg void OnMouseMove(UINT nFlags, CPoint point);
+       afx_msg int  OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message);
+       afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
        afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
        afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
+       afx_msg void OnClose();
+       afx_msg void OnVScroll (UINT nSBCode, UINT nPos, CScrollBar * pScrollBar);
+       afx_msg void OnSize(UINT nType, int cx, int cy);
+       afx_msg BOOL OnEraseBkgnd(CDC* pDC);
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
 };
 
 #ifndef _DEBUG  // debug version in DiffView.cpp
 inline CMergeDoc* CLocationView::GetDocument()
-   { return (CMergeDoc*)m_pDocument; }
+   { return reinterpret_cast<CMergeDoc*>(m_pDocument); }
 #endif
 
-/////////////////////////////////////////////////////////////////////////////
-
-//{{AFX_INSERT_LOCATION}}
-// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
-
+/** 
+ * @brief Stores HWND of frame window (CMergeEditFrame).
+ */
+inline void CLocationView::SetFrameHwnd(HWND hwndFrame)
+{
+       m_hwndFrame = hwndFrame;
+}
 
-#endif //__LOCATIONVIEW_H__