#include "view.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* #include */ #include #include Tool::Tool ( View* v, ButtonState* b, const char* label ) : (label, b, this) { view = v; } Graphic* Tool::Select (Event& e) { const int slop = 2; BoxObj area( e.x-slop, e.y-slop, e.x+slop, e.y+slop ); Picture* p = view->GetPicture(); return p->LastGraphicIntersecting(area); } PenTool::PenTool ( View* v, ButtonState* b, ButtonState* size ) : (v, b, "pen") { penSize = size; painter = new Painter(); Color* blue = new Color(0, 0, 255); painter->SetBrush(new Brush(1)); painter->SetColors(blue, painter->GetBgColor()); } void PenTool::Press() { view->SetCursor(arrow); Tool::Press(); } void PenTool::Send(Event& e) { pr.msgType = PEN; pr.X = e.x; pr.Y = e.y; pr.size = s; if (sendto(view->socketToUA, (char *) &pr, sizeof(struct PenRecord), 0, &(view->toSocket), sizeof(struct sockaddr_un)) < 0) perror("sending datagram message"); } void PenTool::Setup (Event& e) { if (e.eventType == DownEvent) { char* size; penSize->GetValue(size); printf("penSize=%s\n", size); s = atoi(size); painter->FillRect(view->canvas, e.x, e.y, e.x+s-1, e.y-s+1); Send(e); } } boolean PenTool::Manipulating ( Event& e ) { if (e.eventType == DownEvent) { char* size; penSize->GetValue(size); s = atoi(size); painter->FillRect(view->canvas, e.x, e.y, e.x+s-1, e.y-s+1); Send(e); } else if(e.eventType == MotionEvent) { char* size; penSize->GetValue(size); s = atoi(size); painter->FillRect(view->canvas, e.x, e.y, e.x+s-1, e.y-s+1); Send(e); } else if (e.eventType == UpEvent) { return false; } return true; } void PenTool::DoIt (Event&) { } EraserTool::EraserTool ( View* v, ButtonState* b, ButtonState* size ) : (v, b, "eraser") { eraserSize = size; } void EraserTool::Press() { view->SetCursor(crosshairs); Tool::Press(); } void EraserTool::Send(Event& e) { er.msgType = ERASER; er.X = e.x; er.Y = e.y; er.size = s; if (sendto(view->socketToUA, (char *) &er, sizeof(struct EraserRecord), 0, &(view->toSocket), sizeof(struct sockaddr_un)) < 0) perror("sending datagram message"); } void EraserTool::Setup (Event& e) { if (e.eventType == DownEvent) { char* size; eraserSize->GetValue(size); printf("eraserSize=%s\n", size); s = atoi(size); view->output->ClearRect(view->canvas, e.x, e.y, e.x+s-1, e.y-s+1); Send(e); } } boolean EraserTool::Manipulating ( Event& e ) { if (e.eventType == DownEvent) { char* size; int s; eraserSize->GetValue(size); s = atoi(size); view->output->ClearRect(view->canvas, e.x, e.y, e.x+s-1, e.y-s+1); Send(e); } else if(e.eventType == MotionEvent) { char* size; int s; eraserSize->GetValue(size); s = atoi(size); view->output->ClearRect(view->canvas, e.x, e.y, e.x+s-1, e.y-s+1); Send(e); } else if (e.eventType == UpEvent) { return false; } return true; } void EraserTool::DoIt (Event&) { } TextTool::TextTool ( View* v, ButtonState* b ) : (v, b, "text") { } void TextTool::Press() { view->SetCursor(ltextCursor); Tool::Press(); } void TextTool::Setup (Event& e) { if (e.eventType == DownEvent) { x = e.x; y = e.y; i = -1; } } void TextTool::HandleKey(char c) { switch (c) { case '\010' /* ^H */: case '\177' /* DEL */: if (i == -1) break; tr.buf[i] = ' '; view->output->Text(view->canvas, tr.buf, i+1, x, y); if (i >= 0) i--; break; default: if (!iscntrl(c)) { tr.buf[++i] = c; view->output->Text(view->canvas, tr.buf, i+1, x, y); } break; } } void TextTool::Send() { tr.msgType = TEXT; tr.size = i+1; tr.X = x; tr.Y = y; if (sendto(view->socketToUA, (char *) &tr, tr.size+6, 0, &(view->toSocket), sizeof(struct sockaddr_un)) < 0) perror("sending datagram message"); } boolean TextTool::Manipulating ( Event& e ) { if (e.eventType == KeyEvent) { printf("TextTool keyEvent, KeyString=%s\n", e.keystring); } if (e.eventType == KeyEvent && e.len > 0) { if (e.keystring[0] == '\015') { Send(); i = -1; return false; } HandleKey(e.keystring[0]); } if (e.eventType == MotionEvent) { } else if (e.eventType == UpEvent) { // return false; } return true; } void TextTool::DoIt (Event&) { } CursorTool::CursorTool ( View* v, ButtonState* b ) : (v, b, "cursor") { } void CursorTool::Send(Event& e) { cr.msgType = CURSOR; cr.X = e.x; cr.Y = e.y; printf("send cursor record cr.X=%d, cr.Y=%d\n", cr.X, cr.Y); if (sendto(view->socketToUA, (char *) &cr, sizeof(struct CursorRecord), 0, &(view->toSocket), sizeof(struct sockaddr_un)) < 0) perror("sending datagram message"); } void CursorTool::Press() { view->SetCursor(arrow); Tool::Press(); } void CursorTool::Setup (Event& e) { printf("cursorTool Setup: get event\n"); } boolean CursorTool::Manipulating ( Event& e ) { printf("cursorTool Manipulating: get event\n"); if (e.eventType == MotionEvent) { Send(e); } else if (e.eventType == UpEvent) { return false; } return true; } void CursorTool::DoIt (Event&) { }