00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "a2dprec.h"
00012
00013 #ifdef __BORLANDC__
00014 #pragma hdrstop
00015 #endif
00016
00017 #ifndef WX_PRECOMP
00018 #include "wx/wx.h"
00019 #endif
00020
00021 #include "a2dprivate.h"
00022
00023 #if wxART2D_USE_CANEXTOBJ
00024
00025 #include "wx/canvas/canmod.h"
00026 #include "wx/filename.h"
00027
00028 #include "wx/editor/sttool.h"
00029 #include "wx/editor/sttoolext.h"
00030
00031 IMPLEMENT_CLASS(a2dRenderImageZoomTool,a2dStTool)
00032
00033 const a2dCommandId a2dRenderImageZoomTool::COMID_PushTool_RenderImageZoom( wxT("PushTool_RenderImageZoom") );
00034
00035 A2D_BEGIN_EVENT_TABLE(a2dRenderImageZoomTool,a2dStTool)
00036 A2D_EVT_CHAR(a2dRenderImageZoomTool::OnChar)
00037 A2D_EVT_MOUSE_EVENTS(a2dRenderImageZoomTool::OnMouseEvent)
00038 A2D_END_EVENT_TABLE()
00039
00040 a2dRenderImageZoomTool::a2dRenderImageZoomTool(a2dStToolContr* controller):a2dStTool(controller)
00041 {
00042 GetCanvasView()->SetMouseEvents(false);
00043 m_stcontroller=controller;
00044 m_toolcursor= a2dCanvasGlobals->GetCursor( a2dCURSOR_MAGNIFIER );
00045 m_stroke = a2dStroke(*wxBLACK, 0 ,a2dSTROKE_LONG_DASH);
00046 }
00047
00048 a2dRenderImageZoomTool::~a2dRenderImageZoomTool()
00049 {
00050 }
00051
00052 void a2dRenderImageZoomTool::OnChar(wxKeyEvent& event)
00053 {
00054 if (GetBusy())
00055 {
00056 switch(event.GetKeyCode())
00057 {
00058 case WXK_SPACE:
00059 {
00060 FinishBusyMode();
00061
00062 m_canvasobject=0;
00063 }
00064 break;
00065 default:
00066 event.Skip();
00067 }
00068 }
00069 else
00070 event.Skip();
00071
00072 }
00073
00074 void a2dRenderImageZoomTool::OnMouseEvent(wxMouseEvent& event)
00075 {
00076 if (!m_active)
00077 {
00078 event.Skip();
00079 return;
00080 }
00081
00082 if ( GetBusy() )
00083 GetCanvasView()->SetCursor( a2dCanvasGlobals->GetCursor( a2dCURSOR_CROSS ) );
00084 else
00085 GetCanvasView()->SetCursor( m_toolcursor );
00086
00087 int x = event.GetX();
00088 int y = event.GetY();
00089
00090
00091 double xw = GetDrawer2D()->DeviceToWorldX( x );
00092 double yw = GetDrawer2D()->DeviceToWorldY( y );
00093
00094 wxPoint pos = event.GetPosition();
00095
00096 if (event.LeftDClick() && !GetBusy())
00097 {
00098 a2dCanvasObject* object;
00099 object = GetCanvasView()->IsHitWorld( xw, yw );
00100
00101 if (!object)
00102 return;
00103 if (0==wxDynamicCast(object , a2dRenderImage))
00104 {
00105 m_renderimage=0;
00106 return;
00107 }
00108 m_renderimage=(a2dRenderImage*)object;
00109
00110 m_renderimage->SetMappingWidthHeight( m_renderimage->GetShowObject()->GetBboxMinX(),
00111 m_renderimage->GetShowObject()->GetBboxMinY(),
00112 m_renderimage->GetShowObject()->GetBboxWidth(),
00113 m_renderimage->GetShowObject()->GetBboxHeight()
00114 );
00115 }
00116 else if (event.LeftDown())
00117 {
00118 a2dCanvasObject* object;
00119 object = GetCanvasView()->IsHitWorld( xw, yw );
00120
00121 if (!object)
00122 return;
00123 if (0==wxDynamicCast(object , a2dRenderImage))
00124 {
00125 m_renderimage=0;
00126 return;
00127 }
00128
00129 m_renderimage=(a2dRenderImage*)object;
00130
00131 m_zoom_x1=m_zoom_x2=x;
00132 m_zoom_y1=m_zoom_y2=y;
00133 EnterBusyMode();
00134 event.Skip();
00135 }
00136 else if (event.RightDown())
00137 {
00138 event.Skip();
00139 }
00140 else if (event.LeftUp() && GetBusy())
00141 {
00142
00143
00144 if (abs(m_zoom_x1-m_zoom_x2) <3 && abs(m_zoom_y1-m_zoom_y2)<3)
00145 {
00146 FinishBusyMode();
00147 GetDisplayWindow()->Refresh();
00148 if (m_oneshot)
00149 StopTool();
00150 event.Skip();
00151 }
00152 else
00153 {
00154 m_zoom_x2=pos.x;
00155 m_zoom_y2=pos.y;
00156
00157
00158 int topx=wxMin(m_zoom_x1,m_zoom_x2);
00159 int topy=wxMin(m_zoom_y1,m_zoom_y2);
00160 int botx=wxMax(m_zoom_x1,m_zoom_x2);
00161 int boty=wxMax(m_zoom_y1,m_zoom_y2);
00162
00163 double x1=GetDrawer2D()->DeviceToWorldX(topx);
00164 double y1=GetDrawer2D()->DeviceToWorldY(topy);
00165 double x2=GetDrawer2D()->DeviceToWorldX(botx);
00166 double y2=GetDrawer2D()->DeviceToWorldY(boty);
00167
00168 a2dIterC ic( GetCanvasView() );
00169 if (m_renderimage->GetYaxis())
00170 m_renderimage->SetMappingAbs( ic, x1,y2,fabs(x1-x2),fabs(y1-y2));
00171 else
00172 m_renderimage->SetMappingAbs( ic, x1,y1,fabs(x1-x2),fabs(y1-y2));
00173
00174 FinishBusyMode();
00175 event.Skip();
00176 }
00177 }
00178 else if (event.Dragging()&& event.m_leftDown && GetBusy() )
00179 {
00180 wxClientDC dc( GetDisplayWindow() );
00181 GetDisplayWindow()->PrepareDC(dc);
00182 wxPen pen( m_stroke.GetColour(),0,wxSOLID );
00183 dc.SetPen(pen);
00184 dc.SetBrush(wxNullBrush);
00185 dc.SetLogicalFunction(wxINVERT);
00186 dc.DrawRectangle(m_zoom_x1,m_zoom_y1,m_zoom_x2-m_zoom_x1,m_zoom_y2-m_zoom_y1 );
00187 m_zoom_x2=pos.x;
00188 m_zoom_y2=pos.y;
00189 dc.DrawRectangle(m_zoom_x1,m_zoom_y1,m_zoom_x2-m_zoom_x1,m_zoom_y2-m_zoom_y1 );
00190 dc.SetBrush(wxNullBrush);
00191 dc.SetPen(wxNullPen);
00192 }
00193 else
00194 event.Skip();
00195 }
00196
00197 #endif // wxART2D_USE_CANEXTOBJ