00001
00002
00003
00004
00005
00006 #include "ExTextView.h"
00007
00008
00009 using namespace jbxl;
00010 using namespace jbxwl;
00011
00012
00014
00015
00016 IMPLEMENT_DYNCREATE(CExTextView, CScrollView)
00017
00018
00019 CExTextView::CExTextView()
00020 {
00021 pDoc = NULL;
00022 pFrame = NULL;
00023 pApp = NULL;
00024
00025 Title = _T("");
00026
00027 sizeXYRate = 1.0;
00028 clientRate = 1.0;
00029
00030 xsize = 0;
00031 ysize = 0;
00032
00033 origXSize = 0;
00034 origYSize = 0;
00035 initXSize = 0;
00036 initYSize = 0;
00037 prevXSize = 0;
00038 prevYSize = 0;
00039
00040 cnstSize = false;
00041 cnstXSize = false;
00042 cnstYSize = false;
00043 cnstXYRate = false;
00044 maxXSize = SINTMAX;
00045 maxYSize = SINTMAX;
00046
00047 doReSize = false;
00048 activeWin = false;
00049
00050 clientRect.bottom = 0;
00051 clientRect.top = 0;
00052 clientRect.left = 0;
00053 clientRect.right = 0;
00054 }
00055
00056
00057
00058 CExTextView::~CExTextView()
00059 {
00060 DEBUG_INFO("DESTRUCTOR: CExTextView: START\n");
00061
00062 if (pApp!=NULL) {
00063 DEBUG_INFO("Call Application ViewDestructor()\n");
00064 pApp->ViewDestructor(this);
00065 }
00066
00067 if (!isNull(pFrame)) pFrame->pView = NULL;
00068 pDoc = NULL;
00069 pFrame = NULL;
00070
00071 DEBUG_INFO("DESTRUCTOR: CExTextView: END\n");
00072 }
00073
00074
00075
00076 BEGIN_MESSAGE_MAP(CExTextView, CScrollView)
00077
00078 ON_WM_SIZE()
00079
00080 ON_WM_ERASEBKGND()
00081 END_MESSAGE_MAP()
00082
00083
00084
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 POINT CExTextView::SetWindowSize(int cxs, int cys, BOOL first)
00097 {
00098 POINT pc = {-1, -1};
00099
00100 if (cxs<0 || cys<0) return pc;
00101 pc.x = cxs;
00102 pc.y = cys;
00103
00104 POINT pt = GetWindowSize(pc);
00105 pFrame->SetWindowPos((CWnd*)&wndTop, 0, 0, pt.x, pt.y, SWP_NOMOVE);
00106 GetClientRect(&clientRect);
00107
00108
00109 if (clientRect.right!=pc.x || clientRect.bottom!=pc.y) {
00110 if (first) {
00111 double srate = (double)clientRect.bottom/(double)clientRect.right;
00112 if (sizeXYRate<srate) {
00113 pc.x = clientRect.right;
00114 pc.y = (int)(pc.x*sizeXYRate+0.5);
00115 }
00116 else {
00117 pc.y = clientRect.bottom;
00118 pc.x = (int)(pc.y/sizeXYRate+0.5);
00119 }
00120 }
00121 else {
00122 pc.x = prevXSize;
00123 pc.y = prevYSize;
00124 }
00125 pt = GetWindowSize(pc);
00126 pFrame->SetWindowPos((CWnd*)&wndTop, 0, 0, pt.x, pt.y, SWP_NOMOVE);
00127 GetClientRect(&clientRect);
00128 }
00129
00130 pc.x = prevXSize = clientRect.right;
00131 pc.y = prevYSize = clientRect.bottom;
00132 clientRate = (double)clientRect.right/(double)origXSize;
00133
00134 if (first) {
00135 initXSize = clientRect.right;
00136 initYSize = clientRect.bottom;
00137 }
00138 return pc;
00139 }
00140
00141
00142
00143
00144
00145 POINT CExTextView::GetWindowSize(POINT pt)
00146 {
00147 RECT frect, crect;
00148 POINT pc;
00149
00150 pFrame->GetWindowRect(&frect);
00151 GetClientRect(&crect);
00152
00153 pc.x = pt.x + (frect.right -frect.left) - (crect.right -crect.left);
00154 pc.y = pt.y + (frect.bottom-frect.top) - (crect.bottom-crect.top);
00155 return pc;
00156 }
00157
00158
00159
00160
00161
00162 POINT CExTextView::GetClientSize(POINT pt)
00163 {
00164 RECT frect, crect;
00165 POINT pc;
00166
00167 pFrame->GetWindowRect(&frect);
00168 GetClientRect(&crect);
00169
00170 pc.x = pt.x - (frect.right -frect.left) + (crect.right -crect.left);
00171 pc.y = pt.y - (frect.bottom-frect.top) + (crect.bottom-crect.top);
00172 return pc;
00173 }
00174
00175
00176
00177 POINT CExTextView::GetWindowReSize(POINT pt)
00178 {
00179 int minxs = GetSystemMetrics(SM_CXMINTRACK);
00180 int minys = GetSystemMetrics(SM_CYMINTRACK);
00181
00182 if (pt.x<minxs) pt.x = minxs;
00183 if (pt.y<minys) pt.y = minys;
00184
00185
00186 if (cnstSize) {
00187 pt.x = initXSize;
00188 pt.y = initYSize;
00189 }
00190 else if (cnstXSize || cnstYSize || cnstXYRate) {
00191 if (cnstXSize && !cnstYSize) {
00192 pt.x = initXSize;
00193 pt.y = Min(pt.y, maxYSize);
00194 }
00195 else if (!cnstXSize && cnstYSize) {
00196 pt.x = Min(pt.x, maxXSize);
00197 pt.y = initYSize;
00198 }
00199 else if (cnstXYRate) {
00200 TCHAR* cur = GetMouseCursorType();
00201 if (cur==IDC_SIZENS) {
00202 pt.y = Min(pt.y, maxYSize);
00203 pt.x = (int)(pt.y/sizeXYRate + 0.5);
00204 }
00205 else {
00206 pt.x = Min(pt.x, maxXSize);
00207 pt.y = (int)(pt.x*sizeXYRate + 0.5);
00208 }
00209 }
00210 }
00211
00212 return pt;
00213 }
00214
00215
00216
00217 POINT CExTextView::ExecWindowReSize(int cxsize, int cysize)
00218 {
00219 POINT pt;
00220 pt.x = cxsize;
00221 pt.y = cysize;
00222
00223 if (doReSize) {
00224 pt = GetWindowReSize(pt);
00225 if (!cnstSize && (cnstXSize || cnstYSize || cnstXYRate)) {
00226 pt = SetWindowSize(pt.x, pt.y, FALSE);
00227 }
00228 }
00229
00230 doReSize = false;
00231 return pt;
00232 }
00233
00234
00235
00236
00238
00239
00240 void CExTextView::SetTitle(LPCTSTR title)
00241 {
00242 this->Title = title;
00243 pFrame->Title = title;
00244 pFrame->SetTitle(title);
00245 pFrame->SetWindowText(title);
00246 pDoc->SetTitle(title);
00247
00248 return;
00249 }
00250
00251
00252
00253
00255
00256
00257 void CExTextView::OnInitialUpdate()
00258 {
00259 CScrollView::OnInitialUpdate();
00260
00261 if ((cnstXSize&&cnstYSize) || (cnstXSize&&cnstXYRate) || (cnstYSize&&cnstXYRate )) {
00262 cnstSize = true;
00263 cnstXSize = cnstYSize = cnstXYRate = false;
00264 }
00265 }
00266
00267
00268
00269 void CExTextView::OnDraw(CDC* pDC)
00270 {
00271 ExecWindowReSize(clientRect.right, clientRect.bottom);
00272 }
00273
00274
00275
00276 void CExTextView::OnActivateView(BOOL bActivate, CScrollView* pActivateView, CScrollView* pDeactiveView)
00277 {
00278 activeWin = false;
00279 if (bActivate && pActivateView==this) {
00280 activeWin = true;
00281 }
00282
00283 CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);
00284 }
00285
00286
00287
00288 void CExTextView::OnSize(UINT nType, int cx, int cy)
00289 {
00290 CScrollView::OnSize(nType, cx, cy);
00291
00292 doReSize = true;
00293 if (pFrame!=NULL) GetClientRect(&clientRect);
00294 }
00295
00296
00297
00298 BOOL CExTextView::OnEraseBkgnd(CDC* pDC)
00299 {
00300 return CScrollView::OnEraseBkgnd(pDC);
00301 }
00302
00303