00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "3d.h"
00020 #include "input.h"
00021 #include "controlEngine.h"
00022 #include "window.h"
00023 #include "mylist.h"
00024
00025 extern ControlEngine ce;
00026
00027
00028
00029 Window::Window()
00030 {
00031
00032 name="Window";
00033 titleDock=top;
00034
00035
00036 canResize=TRUE;
00037 canRotate=TRUE;
00038
00039 title.onTitle.close.connect(this,OnClose);
00040 onControl.mouse.left.down.connect(this,OnLMRButton);
00041 onControl.mouse.mid.down.connect(this,OnLMRButton);
00042 onControl.mouse.right.down.connect(this,OnLMRButton);
00043 }
00044
00045 Window::~Window()
00046 {
00047 }
00048
00049
00050
00051 #define DEFAULT_XSIZE_WINDOW 400
00052 #define DEFAULT_YSIZE_WINDOW 300
00053
00068 void Window::Create(double depth)
00069 {
00070 SetParent();
00071
00072 faceNode = ce.primitive.AddBox(name,id,depth,TRUE);
00073 faceNode->elem->material.SetDS(0.5,0.5,0.5);
00074
00075 ce.Push(this);
00076 ce.primitive.GoTo(FACE_FRONT);
00077
00078 title.Create(this);
00079 switch (titleDock)
00080 {
00081 case top:
00082 title.faceNode->elem->center.Set(0,-1);
00083 title.faceNode->elem->position.y.Set(-2,0.5,&faceNode->elem->computeSize.y);
00084 title.faceNode->elem->size.x.Set(-4,1,&faceNode->elem->computeSize.x);
00085 title.faceNode->elem->size.y=24;
00086
00087 client.Create();
00088 client.faceNode->elem->center.Set(0,1);
00089 client.faceNode->elem->position.y.Set(2,-0.5,&faceNode->elem->computeSize.y);
00090 client.faceNode->elem->size.x.Set(-4,1,&faceNode->elem->computeSize.x);
00091 client.faceNode->elem->size.y.Set(-28,1,&faceNode->elem->computeSize.y);
00092 break;
00093 case bottom:
00094 title.faceNode->elem->center.Set(0,1);
00095 title.faceNode->elem->position.y.Set(2,-0.5,&faceNode->elem->computeSize.y);
00096 title.faceNode->elem->size.x.Set(-4,1,&faceNode->elem->computeSize.x);
00097 title.faceNode->elem->size.y=24;
00098
00099 client.Create();
00100 client.faceNode->elem->center.Set(0,-1);
00101 client.faceNode->elem->position.y.Set(-2,0.5,&faceNode->elem->computeSize.y);
00102 client.faceNode->elem->size.x.Set(-4,1,&faceNode->elem->computeSize.x);
00103 client.faceNode->elem->size.y.Set(-28,1,&faceNode->elem->computeSize.y);
00104 break;
00105 case left:
00106 title.faceNode->elem->center.Set(0,-1);
00107 title.faceNode->elem->angle.Set(0,0,90);
00108 title.faceNode->elem->position.x.Set(2,-0.5,&faceNode->elem->computeSize.x);
00109 title.faceNode->elem->size.x.Set(-4,1,&faceNode->elem->computeSize.y);
00110 title.faceNode->elem->size.y=24;
00111
00112 client.Create();
00113 client.faceNode->elem->center.Set(1,0);
00114 client.faceNode->elem->position.x.Set(30,-0.5,&faceNode->elem->computeSize.x);
00115 client.faceNode->elem->size.x.Set(-32,1,&faceNode->elem->computeSize.x);
00116 client.faceNode->elem->size.y.Set(-2,1,&faceNode->elem->computeSize.y);
00117 break;
00118 case right:
00119 title.faceNode->elem->center.Set(0,-1);
00120 title.faceNode->elem->angle.Set(0,0,-90);
00121 title.faceNode->elem->position.x.Set(-2,0.5,&faceNode->elem->computeSize.x);
00122 title.faceNode->elem->size.x.Set(-4,1,&faceNode->elem->computeSize.y);
00123 title.faceNode->elem->size.y=24;
00124
00125 client.Create();
00126 client.faceNode->elem->center.Set(-1,0);
00127 client.faceNode->elem->position.x.Set(-30,0.5,&faceNode->elem->computeSize.x);
00128 client.faceNode->elem->size.x.Set(-32,1,&faceNode->elem->computeSize.x);
00129 client.faceNode->elem->size.y.Set(-2,1,&faceNode->elem->computeSize.y);
00130 break;
00131 }
00132 ce.Pop();
00133 }
00134
00135
00136
00137
00138 int Window::OnClose()
00139 {
00140 Debug0Param("Window::OnClose()");
00141 Delete();
00142 return 1;
00143 }
00144
00145 int Window::OnLMRButton(StateMouse *mouse,int face)
00146 {
00147 DebugMouse2("Window::OnLMRButton",mouse,face);
00148 title.GotFocus();
00149 return 1;
00150 }
00151
00152 void Window::ToString(MyString &str)
00153 {
00154 str.AddFormat("name: %s canResize:%d",name,canResize);
00155 }
00156
00157
00158
00159 ResizingAndRotateControl::ResizingAndRotateControl()
00160 {
00161 trackButton = NULL;
00162 onControl.mouse.move.connect(this,OnHover);
00163 }
00164
00165 ResizingAndRotateControl::~ResizingAndRotateControl()
00166 {
00167
00168 }
00169
00171
00172 int ResizingAndRotateControl::OnHover(StateMouse *mouse,int deltaX,int deltaY,int numFace)
00173 {
00174
00175 double dx = 10;
00176 double dy = 10;
00177
00178 Face *face = faceNode->Elems(numFace);
00179 if (face->computeSize.x<(3.0*dx)) dx=face->computeSize.x/3.0;
00180 if (face->computeSize.y<(3.0*dy)) dy=face->computeSize.y/3.0;
00181
00182 Point2D<double> localPos;
00183 Point2D<double> pos(mouse->pos.x,mouse->pos.y);
00184 localPos = GetLocalPos(numFace,pos);
00185 BOOL isOnLeft = fabs(localPos.x)<=dx;
00186 BOOL isOnRight = (localPos.x>=0)&&(fabs(face->computeSize.x-localPos.x)<=dx);
00187 BOOL isOnTop = fabs(localPos.y)<=dy;
00188 BOOL isOnBottom = (localPos.y>=0)&&(fabs(face->computeSize.y-localPos.y)<=dy);
00189 if (isOnLeft||isOnRight||isOnTop||isOnBottom)
00190 {
00191 if (!trackButton)
00192 {
00193 ce.Push(this);
00194 ce.primitive.GoTo(numFace);
00195 trackButton = new TrackButton;
00196 trackButton->SetResizeAndRotate(canResize,canRotate);
00197 if (trackButton->Create(20))
00198 {
00199 trackButton->faceNode->elem->position.z=-8;
00200 trackButton->SetResizeAndRotate(canResize,canRotate);
00201 trackButton->onControl.over.out.connect(this,OnTrackButtonOver);
00202 }
00203 ce.Pop();
00204 }
00205 int orientation =
00206 (isOnLeft?left:0) |
00207 (isOnRight?right:0) |
00208 (isOnTop?top:0) |
00209 (isOnBottom?bottom:0);
00210 trackButton->SetMode((DockPos)orientation);
00211
00212 if (isOnTop) trackButton->YDockTop(0,16,TRUE);
00213 else if (isOnBottom) trackButton->YDockBottom(0,16,TRUE);
00214 else trackButton->YDockTop(localPos.y,16,TRUE);
00215
00216 if (isOnLeft) trackButton->XDockLeft(0,16,TRUE);
00217 else if (isOnRight) trackButton->XDockRight(0,16,TRUE);
00218 else trackButton->XDockLeft(localPos.x,16,TRUE);
00219 return 1;
00220 }
00221 if (trackButton) ce.timerRefresh.onTimer.connect(this,OnNextFrame);
00222 return 0;
00223 }
00224
00225 int ResizingAndRotateControl::OnNextFrame(Timer *timer)
00226 {
00227 timer->onTimer.disconnect(this);
00228 ce.pickingCursor.ResetCurrent();
00229 delete trackButton;
00230 trackButton = NULL;
00231 return 0;
00232 }
00233
00234 int ResizingAndRotateControl::OnTrackButtonOver(Control *newControl,int face)
00235 {
00236 Debug2Param("ResizingAndRotateControl::OnTrackButtonOver(newCtrl:%s,int face)",newControl,face);
00237 ce.timerRefresh.onTimer.connect(this,OnNextFrame);
00238 return 0;
00239 }