void WDL_CursesEditor::RunEditor() { int x; for(x=0;x<16;x++) { if (!CURSES_INSTANCE) break; int thischar = getch(); if (thischar==ERR) break; if (onChar(thischar)) break; } }
// general pollHandler input routine void serialPoll_t :: onDataAvail( void ) { debugPrint( "data avail\n" ); unsigned const spaceAvail = sizeof( inData_ )-inLength_-1 ; int numRead = ::read( fd_, inData_+inLength_, spaceAvail ); if( 0 <= numRead ) { inData_[inLength_+numRead] = '\0' ; if( 0 != terminator_ ) { char const *start = inData_ ; for( unsigned next = 0 ; (int)next < numRead ; next++ ) { if( terminator_ == start[inLength_] ) { addLine( start, inLength_ ); start = start + inLength_ + 1 ; inLength_ = 0 ; } else inLength_++ ; } if( start != inData_ ) { if( inLength_ ) memcpy( inData_, start, inLength_ ); // input past terminator } // read something off of the head if( 0 != lines_ ) onLineIn(); // printf("onDataAvail with terminator\n"); } // terminated else if( 0 != timer_ ) { inLength_ += numRead ; inData_[inLength_] = '\0' ; timer_->set( 10 ); // printf("onDataAvail with timeout\n"); } else { inLength_ += numRead ; inData_[inLength_] = '\0' ; onChar(); // printf("onDataAvail calling onChar\n"); } } }
LRESULT WebPopupMenuProxyWin::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { LRESULT lResult = 0; bool handled = true; switch (message) { case WM_MOUSEACTIVATE: lResult = onMouseActivate(hWnd, message, wParam, lParam, handled); break; case WM_SIZE: lResult = onSize(hWnd, message, wParam, lParam, handled); break; case WM_KEYDOWN: lResult = onKeyDown(hWnd, message, wParam, lParam, handled); break; case WM_CHAR: lResult = onChar(hWnd, message, wParam, lParam, handled); break; case WM_MOUSEMOVE: lResult = onMouseMove(hWnd, message, wParam, lParam, handled); break; case WM_LBUTTONDOWN: lResult = onLButtonDown(hWnd, message, wParam, lParam, handled); break; case WM_LBUTTONUP: lResult = onLButtonUp(hWnd, message, wParam, lParam, handled); break; case WM_MOUSEWHEEL: lResult = onMouseWheel(hWnd, message, wParam, lParam, handled); break; case WM_PAINT: lResult = onPaint(hWnd, message, wParam, lParam, handled); break; case WM_PRINTCLIENT: lResult = onPrintClient(hWnd, message, wParam, lParam, handled); break; default: handled = false; break; } if (!handled) lResult = ::DefWindowProc(hWnd, message, wParam, lParam); return lResult; }
bool DesktopWindow::onMessage(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_HSCROLL: return onHScroll(wParam, lParam); case WM_VSCROLL: return onVScroll(wParam, lParam); case WM_ERASEBKGND: return onEraseBackground(reinterpret_cast<HDC>(wParam)); case WM_DEADCHAR: case WM_SYSDEADCHAR: return onDeadChar(wParam, lParam); case WM_DRAWCLIPBOARD: return onDrawClipboard(); case WM_CREATE: return onCreate(reinterpret_cast<LPCREATESTRUCT>(lParam)); case WM_SIZE: return onSize(wParam, lParam); case WM_DESTROY: return onDestroy(); case WM_CHAR: case WM_SYSCHAR: return onChar(wParam, lParam); case WM_KEYDOWN: case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP: return onKey(wParam, lParam); case WM_SETFOCUS: m_rfbKeySym->processFocusRestoration(); return true; case WM_KILLFOCUS: m_rfbKeySym->processFocusLoss(); return true; } return false; }
int WDL_CursesEditor::onChar(int c) { if (m_state == -3 || m_state == -4) { switch (c) { case '\r': case '\n': m_state=0; runSearch(); break; case 27: m_state=0; draw(); setCursor(); draw_message("Find cancelled."); break; case KEY_BACKSPACE: if (s_search_string[0]) s_search_string[strlen(s_search_string)-1]=0; m_state=-4; break; default: if (VALIDATE_TEXT_CHAR(c)) { int l=m_state == -3 ? 0 : strlen(s_search_string); m_state = -4; if (l < (int)sizeof(s_search_string)-1) { s_search_string[l]=c; s_search_string[l+1]=0; } } break; } if (m_state) { attrset(m_color_message); bkgdset(m_color_message); mvaddstr(LINES-1,29,s_search_string); clrtoeol(); attrset(0); bkgdset(0); } return 0; } if (c==KEY_DOWN || c==KEY_UP || c==KEY_PPAGE||c==KEY_NPAGE || c==KEY_RIGHT||c==KEY_LEFT||c==KEY_HOME||c==KEY_END) { if (SHIFT_KEY_DOWN) { if (!m_selecting) { m_select_x2=m_select_x1=m_curs_x; m_select_y2=m_select_y1=m_curs_y; m_selecting=1; } } else if (m_selecting) { m_selecting=0; draw(); } } switch(c) { case 'O'-'A'+1: if (!SHIFT_KEY_DOWN && !ALT_KEY_DOWN) { if (m_pane_div <= 0.0 || m_pane_div >= 1.0) { onChar('P'-'A'+1); } if (m_pane_div > 0.0 && m_pane_div < 1.0) { m_curpane=!m_curpane; draw(); draw_status_state(); int paney[2], paneh[2]; GetPaneDims(paney, paneh); if (m_curs_y-m_paneoffs_y[m_curpane] < 0) m_curs_y=m_paneoffs_y[m_curpane]; else if (m_curs_y-m_paneoffs_y[m_curpane] >= paneh[m_curpane]) m_curs_y=paneh[m_curpane]+m_paneoffs_y[m_curpane]-1; setCursor(); } } break; case 'P'-'A'+1: if (!SHIFT_KEY_DOWN && !ALT_KEY_DOWN) { if (m_pane_div <= 0.0 || m_pane_div >= 1.0) { m_pane_div=0.5; m_paneoffs_y[1]=m_paneoffs_y[0]; } else { m_pane_div=1.0; if (m_curpane) m_paneoffs_y[0]=m_paneoffs_y[1]; m_curpane=0; } draw(); draw_status_state(); int paney[2], paneh[2]; const int pane_divy=GetPaneDims(paney, paneh); setCursor(); } break; case 407: case 'Z'-'A'+1: if (!SHIFT_KEY_DOWN && !ALT_KEY_DOWN) { if (m_undoStack_pos > 0) { m_undoStack_pos--; loadUndoState(m_undoStack.Get(m_undoStack_pos)); draw(); setCursor(); char buf[512]; snprintf(buf,sizeof(buf),"Undid action - %d items in undo buffer",m_undoStack_pos); draw_message(buf); } else { draw_message("Can't Undo"); } break; } // fall through case 'Y'-'A'+1: if ((c == 'Z'-'A'+1 || !SHIFT_KEY_DOWN) && !ALT_KEY_DOWN) { if (m_undoStack_pos < m_undoStack.GetSize()-1) { m_undoStack_pos++; loadUndoState(m_undoStack.Get(m_undoStack_pos)); draw(); setCursor(); char buf[512]; snprintf(buf,sizeof(buf),"Redid action - %d items in redo buffer",m_undoStack.GetSize()-m_undoStack_pos-1); draw_message(buf); } else { draw_message("Can't Redo"); } } break; case KEY_IC: if (!SHIFT_KEY_DOWN && !ALT_KEY_DOWN) { s_overwrite=!s_overwrite; setCursor(); break; } // fqll through case 'V'-'A'+1: if (!SHIFT_KEY_DOWN && !ALT_KEY_DOWN) { // generate a m_clipboard using win32 clipboard data WDL_PtrList<const char> lines; WDL_String buf; #ifdef WDL_IS_FAKE_CURSES if (CURSES_INSTANCE) { OpenClipboard(CURSES_INSTANCE->m_hwnd); HANDLE h=GetClipboardData(CF_TEXT); if (h) { char *t=(char *)GlobalLock(h); int s=GlobalSize(h); buf.Set(t,s); GlobalUnlock(t); } CloseClipboard(); } else #endif { buf.Set(s_fake_clipboard.Get()); } if (buf.Get() && buf.Get()[0]) { char *src=buf.Get(); while (*src) { char *seek=src; while (*seek && *seek != '\r' && *seek != '\n') seek++; char hadclr=*seek; if (*seek) *seek++=0; lines.Add(src); if (hadclr == '\r' && *seek == '\n') seek++; if (hadclr && !*seek) { lines.Add(""); } src=seek; } } if (lines.GetSize()) { removeSelect(); // insert lines at m_curs_y,m_curs_x if (m_curs_y >= m_text.GetSize()) m_curs_y=m_text.GetSize()-1; if (m_curs_y < 0) m_curs_y=0; preSaveUndoState(); WDL_FastString poststr; int x; int indent_to_pos = -1; for (x = 0; x < lines.GetSize(); x ++) { WDL_FastString *str=m_text.Get(m_curs_y); const char *tstr=lines.Get(x); if (!tstr) tstr=""; if (!x) { if (str) { if (m_curs_x < 0) m_curs_x=0; int tmp=str->GetLength(); if (m_curs_x > tmp) m_curs_x=tmp; poststr.Set(str->Get()+m_curs_x); str->SetLen(m_curs_x); const char *p = str->Get(); while (*p == ' ' || *p == '\t') p++; if (!*p && p > str->Get()) { if (lines.GetSize()>1) { while (*tstr == ' ' || *tstr == '\t') tstr++; } indent_to_pos = m_curs_x; } str->Append(tstr); } else { m_text.Insert(m_curs_y,(str=new WDL_FastString(tstr))); } if (lines.GetSize() > 1) { m_curs_y++; } else { m_curs_x = str->GetLength(); str->Append(poststr.Get()); } } else if (x == lines.GetSize()-1) { WDL_FastString *s=newIndentedFastString(tstr,indent_to_pos); m_curs_x = s->GetLength(); s->Append(poststr.Get()); m_text.Insert(m_curs_y,s); } else { m_text.Insert(m_curs_y,newIndentedFastString(tstr,indent_to_pos)); m_curs_y++; } } draw(); setCursor(); draw_message("Pasted"); saveUndoState(); } else { setCursor(); draw_message("Clipboard empty"); } } break; case KEY_DC: if (!SHIFT_KEY_DOWN && !ALT_KEY_DOWN) { WDL_FastString *s; if (m_selecting) { preSaveUndoState(); removeSelect(); draw(); saveUndoState(); setCursor(); } else if ((s=m_text.Get(m_curs_y))) { if (m_curs_x < s->GetLength()) { preSaveUndoState(); bool hadCom = LineCanAffectOtherLines(s->Get(),m_curs_x,1); s->DeleteSub(m_curs_x,1); if (!hadCom) hadCom = LineCanAffectOtherLines(s->Get(),-1,-1); draw(hadCom ? -1 : m_curs_y); saveUndoState(); setCursor(); } else // append next line to us { if (m_curs_y < m_text.GetSize()-1) { preSaveUndoState(); WDL_FastString *nl=m_text.Get(m_curs_y+1); if (nl) { s->Append(nl->Get()); } m_text.Delete(m_curs_y+1,true); draw(); saveUndoState(); setCursor(); } } } break; } case 'C'-'A'+1: case 'X'-'A'+1: if (!SHIFT_KEY_DOWN && !ALT_KEY_DOWN && m_selecting) { if (c!= 'C'-'A'+1) m_selecting=0; int miny,maxy,minx,maxx; int x; getselectregion(minx,miny,maxx,maxy); const char *status=""; char statusbuf[512]; if (minx != maxx|| miny != maxy) { int bytescopied=0; s_fake_clipboard.Set(""); int lht=0,fht=0; if (c != 'C'-'A'+1) preSaveUndoState(); for (x = miny; x <= maxy; x ++) { WDL_FastString *s=m_text.Get(x); if (s) { const char *str=s->Get(); int sx,ex; if (x == miny) sx=max(minx,0); else sx=0; int tmp=s->GetLength(); if (sx > tmp) sx=tmp; if (x == maxy) ex=min(maxx,tmp); else ex=tmp; bytescopied += ex-sx + (x!=maxy); if (s_fake_clipboard.Get() && s_fake_clipboard.Get()[0]) s_fake_clipboard.Append("\r\n"); s_fake_clipboard.Append(ex-sx?str+sx:"",ex-sx); if (c != 'C'-'A'+1) { if (sx == 0 && ex == tmp) // remove entire line { m_text.Delete(x,true); if (x==miny) miny--; x--; maxy--; } else { if (x==miny) fht=1; if (x == maxy) lht=1; s->DeleteSub(sx,ex-sx); } } } } if (fht && lht && miny+1 == maxy) { m_text.Get(miny)->Append(m_text.Get(maxy)->Get()); m_text.Delete(maxy,true); } if (c != 'C'-'A'+1) { m_curs_y=miny; if (m_curs_y < 0) m_curs_y=0; m_curs_x=minx; saveUndoState(); snprintf(statusbuf,sizeof(statusbuf),"Cut %d bytes",bytescopied); } else snprintf(statusbuf,sizeof(statusbuf),"Copied %d bytes",bytescopied); #ifdef WDL_IS_FAKE_CURSES if (CURSES_INSTANCE) { int l=s_fake_clipboard.GetLength()+1; HANDLE h=GlobalAlloc(GMEM_MOVEABLE,l); void *t=GlobalLock(h); memcpy(t,s_fake_clipboard.Get(),l); GlobalUnlock(h); OpenClipboard(CURSES_INSTANCE->m_hwnd); EmptyClipboard(); SetClipboardData(CF_TEXT,h); CloseClipboard(); } #endif status=statusbuf; } else status="No selection"; draw(); setCursor(); draw_message(status); } break; case 'A'-'A'+1: if (!SHIFT_KEY_DOWN && !ALT_KEY_DOWN) { m_selecting=1; m_select_x1=0; m_select_y1=0; m_select_y2=m_text.GetSize()-1; m_select_x2=0; if (m_text.Get(m_select_y2)) m_select_x2=m_text.Get(m_select_y2)->GetLength(); draw(); setCursor(); } break; case 27: if (!SHIFT_KEY_DOWN && !ALT_KEY_DOWN && m_selecting) { m_selecting=0; draw(); setCursor(); break; } break; case KEY_F3: case 'G'-'A'+1: if (!SHIFT_KEY_DOWN && !ALT_KEY_DOWN && s_search_string[0]) { runSearch(); return 0; } // fall through case 'F'-'A'+1: if (!SHIFT_KEY_DOWN && !ALT_KEY_DOWN) { draw_message(""); attrset(m_color_message); bkgdset(m_color_message); mvaddstr(LINES-1,0,"Find string (ESC to cancel): "); if (m_selecting && m_select_y1==m_select_y2) { WDL_FastString* s=m_text.Get(m_select_y1); if (s) { const char* p=s->Get(); int xlo=min(m_select_x1, m_select_x2); int xhi=max(m_select_x1, m_select_x2); int i; for (i=xlo; i < xhi; ++i) { if (!isalnum(p[i]) && p[i] != '_') break; } if (i == xhi && xhi > xlo && xhi-xlo < sizeof(s_search_string)) { lstrcpyn(s_search_string, p+xlo, xhi-xlo+1); } } } addstr(s_search_string); clrtoeol(); attrset(0); bkgdset(0); m_state=-3; // find, initial (m_state=4 when we've typed something) } break; case KEY_DOWN: { if (CTRL_KEY_DOWN) { int paney[2], paneh[2]; GetPaneDims(paney, paneh); int maxscroll=m_text.GetSize()-paneh[m_curpane]+4; if (m_paneoffs_y[m_curpane] < maxscroll-1) { m_paneoffs_y[m_curpane]++; if (m_curs_y < m_paneoffs_y[m_curpane]) m_curs_y=m_paneoffs_y[m_curpane]; draw(); } } else { m_curs_y++; if (m_curs_y>=m_text.GetSize()) m_curs_y=m_text.GetSize()-1; if (m_curs_y < 0) m_curs_y=0; } if (m_selecting) { setCursor(1); m_select_x2=m_curs_x; m_select_y2=m_curs_y; draw(); } setCursor(1); } break; case KEY_UP: { if (CTRL_KEY_DOWN) { if (m_paneoffs_y[m_curpane] > 0) { int paney[2], paneh[2]; GetPaneDims(paney, paneh); m_paneoffs_y[m_curpane]--; if (m_curs_y > m_paneoffs_y[m_curpane]+paneh[m_curpane]-1) m_curs_y = m_paneoffs_y[m_curpane]+paneh[m_curpane]-1; if (m_curs_y < 0) m_curs_y=0; draw(); } } else { if(m_curs_y>0) m_curs_y--; } if (m_selecting) { setCursor(1); m_select_x2=m_curs_x; m_select_y2=m_curs_y; draw(); } setCursor(1); } break; case KEY_PPAGE: { if (m_curs_y > m_paneoffs_y[m_curpane]) { m_curs_y=m_paneoffs_y[m_curpane]; if (m_curs_y < 0) m_curs_y=0; } else { int paney[2], paneh[2]; GetPaneDims(paney, paneh); m_curs_y -= paneh[m_curpane]; if (m_curs_y < 0) m_curs_y=0; m_paneoffs_y[m_curpane]=m_curs_y; } if (m_selecting) { setCursor(1); m_select_x2=m_curs_x; m_select_y2=m_curs_y; } draw(); setCursor(1); } break; case KEY_NPAGE: { int paney[2], paneh[2]; GetPaneDims(paney, paneh); if (m_curs_y >= m_paneoffs_y[m_curpane]+paneh[m_curpane]-1) m_paneoffs_y[m_curpane]=m_curs_y-1; m_curs_y = m_paneoffs_y[m_curpane]+paneh[m_curpane]-1; if (m_curs_y >= m_text.GetSize()) m_curs_y=m_text.GetSize()-1; if (m_curs_y < 0) m_curs_y=0; if (m_selecting) { setCursor(1); m_select_x2=m_curs_x; m_select_y2=m_curs_y; } draw(); setCursor(1); } break; case KEY_RIGHT: { if (1) // wrap across lines { WDL_FastString *s = m_text.Get(m_curs_y); if (s && m_curs_x >= s->GetLength() && m_curs_y < m_text.GetSize()) { m_curs_y++; m_curs_x = -1; } } if(m_curs_x<0) { m_curs_x=0; } else { if (CTRL_KEY_DOWN) { WDL_FastString *s = m_text.Get(m_curs_y); if (!s||m_curs_x >= s->GetLength()) break; int lastType = categorizeCharForWordNess(s->Get()[m_curs_x++]); while (m_curs_x < s->GetLength()) { int thisType = categorizeCharForWordNess(s->Get()[m_curs_x]); if (thisType != lastType && thisType != 0) break; lastType=thisType; m_curs_x++; } } else { m_curs_x++; } } if (m_selecting) { setCursor(); m_select_x2=m_curs_x; m_select_y2=m_curs_y; draw(); } setCursor(); } break; case KEY_LEFT: { bool doMove=true; if (1) // wrap across lines { WDL_FastString *s = m_text.Get(m_curs_y); if (s && m_curs_y>0 && m_curs_x == 0) { s = m_text.Get(--m_curs_y); if (s) { m_curs_x = s->GetLength(); doMove=false; } } } if(m_curs_x>0 && doMove) { if (CTRL_KEY_DOWN) { WDL_FastString *s = m_text.Get(m_curs_y); if (!s) break; if (m_curs_x > s->GetLength()) m_curs_x = s->GetLength(); m_curs_x--; int lastType = categorizeCharForWordNess(s->Get()[m_curs_x--]); while (m_curs_x >= 0) { int thisType = categorizeCharForWordNess(s->Get()[m_curs_x]); if (thisType != lastType && lastType != 0) break; lastType=thisType; m_curs_x--; } m_curs_x++; } else { m_curs_x--; } } if (m_selecting) { setCursor(); m_select_x2=m_curs_x; m_select_y2=m_curs_y; draw(); } setCursor(); } break; case KEY_HOME: { m_curs_x=0; if (CTRL_KEY_DOWN) m_curs_y=0; if (m_selecting) { setCursor(); m_select_x2=m_curs_x; m_select_y2=m_curs_y; draw(); } setCursor(); } break; case KEY_END: { if (m_text.Get(m_curs_y)) m_curs_x=m_text.Get(m_curs_y)->GetLength(); if (CTRL_KEY_DOWN) m_curs_y=m_text.GetSize(); if (m_selecting) { setCursor(); m_select_x2=m_curs_x; m_select_y2=m_curs_y; draw(); } setCursor(); } break; case KEY_BACKSPACE: // backspace, baby if (m_selecting) { preSaveUndoState(); removeSelect(); draw(); saveUndoState(); setCursor(); } else if (m_curs_x > 0) { WDL_FastString *tl=m_text.Get(m_curs_y); if (tl) { preSaveUndoState(); bool hadCom = LineCanAffectOtherLines(tl->Get(), m_curs_x-1,1); tl->DeleteSub(--m_curs_x,1); if (!hadCom) hadCom = LineCanAffectOtherLines(tl->Get(),-1,-1); draw(hadCom?-1:m_curs_y); saveUndoState(); setCursor(); } } else // append current line to previous line { WDL_FastString *fl=m_text.Get(m_curs_y-1), *tl=m_text.Get(m_curs_y); if (!tl) { m_curs_y--; if (fl) m_curs_x=fl->GetLength(); draw(); saveUndoState(); setCursor(); } else if (fl) { preSaveUndoState(); m_curs_x=fl->GetLength(); fl->Append(tl->Get()); m_text.Delete(m_curs_y--,true); draw(); saveUndoState(); setCursor(); } } break; case 'L'-'A'+1: if (!SHIFT_KEY_DOWN && !ALT_KEY_DOWN) { draw(); setCursor(); } break; case 13: //KEY_ENTER: //insert newline preSaveUndoState(); if (m_selecting) { removeSelect(); draw(); setCursor(); } if (m_curs_y >= m_text.GetSize()) { m_curs_y=m_text.GetSize(); m_text.Add(new WDL_FastString); } if (s_overwrite) { WDL_FastString *s = m_text.Get(m_curs_y); int plen=0; const char *pb=NULL; if (s) { pb = s->Get(); while (plen < m_curs_x && (pb[plen]== ' ' || pb[plen] == '\t')) plen++; } if (++m_curs_y >= m_text.GetSize()) { m_curs_y = m_text.GetSize(); WDL_FastString *ns=new WDL_FastString; if (plen>0) ns->Set(pb,plen); m_text.Insert(m_curs_y,ns); } s = m_text.Get(m_curs_y); if (s && plen > s->GetLength()) plen=s->GetLength(); m_curs_x=plen; } else { WDL_FastString *s = m_text.Get(m_curs_y); if (s) { if (m_curs_x > s->GetLength()) m_curs_x = s->GetLength(); WDL_FastString *nl = new WDL_FastString(); int plen=0; const char *pb = s->Get(); while (plen < m_curs_x && (pb[plen]== ' ' || pb[plen] == '\t')) plen++; if (plen>0) nl->Set(pb,plen); nl->Append(pb+m_curs_x); m_text.Insert(++m_curs_y,nl); s->SetLen(m_curs_x); m_curs_x=plen; } } m_offs_x=0; draw(); saveUndoState(); setCursor(); break; case '\t': if (m_selecting) { preSaveUndoState(); bool isRev = !!(GetAsyncKeyState(VK_SHIFT)&0x8000); indentSelect(isRev?-m_indent_size:m_indent_size); // indent selection: draw(); setCursor(); saveUndoState(); break; } default: //insert char if(VALIDATE_TEXT_CHAR(c)) { preSaveUndoState(); if (m_selecting) { removeSelect(); draw(); setCursor(); } if (!m_text.Get(m_curs_y)) m_text.Insert(m_curs_y,new WDL_FastString); WDL_FastString *ss; if ((ss=m_text.Get(m_curs_y))) { char str[64]; int slen ; if (c == '\t') { slen = min(m_indent_size,64); if (slen<1) slen=1; int x; for(x=0;x<slen;x++) str[x]=' '; } else { str[0]=c; slen = 1; } bool hadCom = LineCanAffectOtherLines(ss->Get(),-1,-1); if (s_overwrite) { if (!hadCom) hadCom = LineCanAffectOtherLines(ss->Get(),m_curs_x,slen); ss->DeleteSub(m_curs_x,slen); } ss->Insert(str,m_curs_x,slen); if (!hadCom) hadCom = LineCanAffectOtherLines(ss->Get(),m_curs_x,slen); m_curs_x += slen; draw(hadCom ? -1 : m_curs_y); } saveUndoState(); setCursor(); } break; } return 0; }
LRESULT Window::msgproc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_ACTIVATE: { boolean newActive = LOWORD( wParam ) == WA_ACTIVE; if( active != newActive ) { onActive( newActive ); active = newActive; } } break; case WM_ERASEBKGND: { } break; case WM_PAINT: { onPaint(); } break; case WM_ENTERSIZEMOVE: { updateFlag = false; onEnterSizeMove(); } break; case WM_SIZE: { boolean newActive = ( wParam != SIZE_MAXHIDE ) && ( wParam != SIZE_MINIMIZED ); if( active != newActive ) { onActive( newActive ); active = newActive; } onSize(); } break; case WM_EXITSIZEMOVE: { onExitSizeMove(); updateFlag = true; } break; case WM_SETCURSOR: { onSetCursor(); } break; case WM_CHAR: { onChar( static_cast<wchar>( wParam ) ); } break; case WM_INPUT: { onRawInput( reinterpret_cast<HRAWINPUT>( lParam ) ); } break; case WM_CLOSE: { onClose(); } break; case WM_DESTROY: { onDestroy(); } break; default: { } } return DefWindowProcA( hWnd, msg, wParam, lParam ); }
void AttributeParser::parseNumeric(MPlug plug, MFnNumericData::Type type) { MStatus status; MObject attrObj = plug.attribute(&status); if (!status) return; MFnAttribute attr(attrObj, &status); if (!status) return; MString name = attr.name(&status); if (!status) return; switch (type) { case MFnNumericData::kInvalid: //!< Invalid data. break; case MFnNumericData::kBoolean: //!< Boolean. { bool value; status = plug.getValue(value); if (!status) return; onBoolean(plug, name, value); } break; case MFnNumericData::kByte: //!< One byte. { char value; status = plug.getValue(value); if (!status) return; onByte(plug, name, value); } break; case MFnNumericData::kChar: //!< One character. { char value; status = plug.getValue(value); if (!status) return; onChar(plug, name, value); } break; case MFnNumericData::kShort: //!< One short. { short value; status = plug.getValue(value); if (!status) return; onShort(plug, name, value); } break; case MFnNumericData::k2Short: //!< Two shorts. { MObject object; status = plug.getValue(object); if (!status) return; MFnNumericData fnNumericData(object, &status); if (!status) return; short value[2]; status = fnNumericData.getData(value[0], value[1]); if (!status) return; onShort2(plug, name, value); } break; case MFnNumericData::k3Short: //!< Three shorts. { MObject object; status = plug.getValue(object); if (!status) return; MFnNumericData fnNumericData(object, &status); if (!status) return; short value[3]; status = fnNumericData.getData(value[0], value[1], value[2]); if (!status) return; onShort3(plug, name, value); } break; case MFnNumericData::kInt: //!< One long. Same as int since "long" is not platform-consistent. { int value; status = plug.getValue(value); if (!status) return; onInteger(plug, name, value); } break; case MFnNumericData::k2Int: //!< Two longs. Same as 2 ints since "long" is not platform-consistent. { MObject object; status = plug.getValue(object); if (!status) return; MFnNumericData fnNumericData(object, &status); if (!status) return; int value[2]; status = fnNumericData.getData(value[0], value[1]); if (!status) return; onInteger2(plug, name, value); } break; case MFnNumericData::k3Int: //!< Three longs. Same as 3 ints since "long" is not platform-consistent. { MObject object; status = plug.getValue(object); if (!status) return; MFnNumericData fnNumericData(object, &status); if (!status) return; int value[3]; status = fnNumericData.getData(value[0], value[1], value[2]); if (!status) return; onInteger3(plug, name, value); } break; case MFnNumericData::kFloat: //!< One float. { MFn::Type apiType = attrObj.apiType(); switch (apiType) { case MFn::kFloatAngleAttribute: { MAngle angle = plug.asMAngle(MDGContext::fsNormal, &status); if (!status) return; onAngle(plug, name, angle); } break; case MFn::kFloatLinearAttribute: { MDistance distance = plug.asMDistance(MDGContext::fsNormal, &status); if (!status) return; onDistance(plug, name, distance); } break; default: { float value = plug.asFloat(MDGContext::fsNormal, &status); if (!status) return; onFloat(plug, name, value); } break; } } break; case MFnNumericData::k2Float: //!< Two floats. { const unsigned int numChildren = 2; MPlug childPlugs[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { childPlugs[i] = plug.child(i, &status); if (!status) return; } MObject childAttr[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { childAttr[i] = childPlugs[i].attribute(&status); if (!status) return; } MFn::Type apiType = childAttr[0].apiType(); switch (apiType) { case MFn::kFloatAngleAttribute: { MAngle angles[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { angles[i] = childPlugs[i].asMAngle(MDGContext::fsNormal, &status); if (!status) return; } onAngle2(plug, name, angles); } break; case MFn::kFloatLinearAttribute: { MDistance distances[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { distances[i] = childPlugs[i].asMDistance(MDGContext::fsNormal, &status); if (!status) return; } onDistance2(plug, name, distances); } break; default: { float values[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { values[i] = childPlugs[i].asFloat(MDGContext::fsNormal, &status); if (!status) return; } onFloat2(plug, name, values); } break; } } break; case MFnNumericData::k3Float: //!< Three floats. { const unsigned int numChildren = 3; MPlug childPlugs[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { childPlugs[i] = plug.child(i, &status); if (!status) return; } MObject childAttr[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { childAttr[i] = childPlugs[i].attribute(&status); if (!status) return; } MFn::Type apiType = childAttr[0].apiType(); switch (apiType) { case MFn::kFloatAngleAttribute: { MAngle angles[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { angles[i] = childPlugs[i].asMAngle(MDGContext::fsNormal, &status); if (!status) return; } onAngle3(plug, name, angles); } break; case MFn::kFloatLinearAttribute: { MDistance distances[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { distances[i] = childPlugs[i].asMDistance(MDGContext::fsNormal, &status); if (!status) return; } onDistance3(plug, name, distances); } break; default: { float values[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { values[i] = childPlugs[i].asFloat(MDGContext::fsNormal, &status); if (!status) return; } onFloat3(plug, name, values); } break; } } break; case MFnNumericData::kDouble: //!< One double. { MFn::Type apiType = attrObj.apiType(); switch (apiType) { case MFn::kDoubleAngleAttribute: { MAngle angle = plug.asMAngle(MDGContext::fsNormal, &status); if (!status) return; onAngle(plug, name, angle); } break; case MFn::kDoubleLinearAttribute: { MDistance distance = plug.asMDistance(MDGContext::fsNormal, &status); if (!status) return; onDistance(plug, name, distance); } break; default: { double value = plug.asDouble(MDGContext::fsNormal, &status); if (!status) return; onDouble(plug, name, value); } break; } } break; case MFnNumericData::k2Double: //!< Two doubles. { const unsigned int numChildren = 2; MPlug childPlugs[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { childPlugs[i] = plug.child(i, &status); if (!status) return; } MObject childAttr[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { childAttr[i] = childPlugs[i].attribute(&status); if (!status) return; } MFn::Type apiType = childAttr[0].apiType(); switch (apiType) { case MFn::kDoubleAngleAttribute: { MAngle angles[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { angles[i] = childPlugs[i].asMAngle(MDGContext::fsNormal, &status); if (!status) return; } onAngle2(plug, name, angles); } break; case MFn::kDoubleLinearAttribute: { MDistance distances[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { distances[i] = childPlugs[i].asMDistance(MDGContext::fsNormal, &status); if (!status) return; } onDistance2(plug, name, distances); } break; default: { double values[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { values[i] = childPlugs[i].asDouble(MDGContext::fsNormal, &status); if (!status) return; } onDouble2(plug, name, values); } break; } } break; case MFnNumericData::k3Double: //!< Three doubles. { const unsigned int numChildren = 3; MPlug childPlugs[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { childPlugs[i] = plug.child(i, &status); if (!status) return; } MObject childAttr[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { childAttr[i] = childPlugs[i].attribute(&status); if (!status) return; } MFn::Type apiType = childAttr[0].apiType(); switch (apiType) { case MFn::kDoubleAngleAttribute: { MAngle angles[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { angles[i] = childPlugs[i].asMAngle(MDGContext::fsNormal, &status); if (!status) return; } onAngle3(plug, name, angles); } break; case MFn::kDoubleLinearAttribute: { MDistance distances[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { distances[i] = childPlugs[i].asMDistance(MDGContext::fsNormal, &status); if (!status) return; } onDistance3(plug, name, distances); } break; default: { double values[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { values[i] = childPlugs[i].asDouble(MDGContext::fsNormal, &status); if (!status) return; } onDouble3(plug, name, values); } break; } } break; case MFnNumericData::k4Double: //!< Four doubles. { const unsigned int numChildren = 4; MPlug childPlugs[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { childPlugs[i] = plug.child(i, &status); if (!status) return; } MObject childAttr[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { childAttr[i] = childPlugs[i].attribute(&status); if (!status) return; } MFn::Type apiType = childAttr[0].apiType(); switch (apiType) { case MFn::kDoubleAngleAttribute: { MAngle angles[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { angles[i] = childPlugs[i].asMAngle(MDGContext::fsNormal, &status); if (!status) return; } onAngle4(plug, name, angles); } break; case MFn::kDoubleLinearAttribute: { MDistance distances[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { distances[i] = childPlugs[i].asMDistance(MDGContext::fsNormal, &status); if (!status) return; } onDistance4(plug, name, distances); } break; default: { double values[numChildren]; for (unsigned int i = 0; i < numChildren; ++i) { values[i] = childPlugs[i].asDouble(MDGContext::fsNormal, &status); if (!status) return; } onDouble4(plug, name, values); } break; } } break; case MFnNumericData::kAddr: //!< An address. // TODO break; default: break; } }
MStatus AttributeParser::parseNumeric(MPlug plug, MFnNumericData::Type type) { MStatus status; MObject attrObj = plug.attribute(&status); if (!status) return status; MFnAttribute attr(attrObj, &status); if (!status) return status; MString name = attr.name(&status); if (!status) return status; switch (type) { case MFnNumericData::kInvalid: //!< Invalid data. break; case MFnNumericData::kBoolean: //!< Boolean. { bool value; MStatus status = plug.getValue(value); if (!status) return status; return onBoolean(plug, name, value); } break; case MFnNumericData::kByte: //!< One byte. { char value; MStatus status = plug.getValue(value); if (!status) return status; return onByte(plug, name, value); } break; case MFnNumericData::kChar: //!< One character. { char value; MStatus status = plug.getValue(value); if (!status) return status; return onChar(plug, name, value); } break; case MFnNumericData::kShort: //!< One short. { short value; MStatus status = plug.getValue(value); if (!status) return status; return onShort(plug, name, value); } break; case MFnNumericData::k2Short: //!< Two shorts. { MStatus status; short value[2]; MPlug plug0 = plug.child(0, &status); if (!status) return status; MPlug plug1 = plug.child(1, &status); if (!status) return status; status = plug0.getValue(value[0]); if (!status) return status; status = plug1.getValue(value[1]); if (!status) return status; return onShort2(plug, name, value); } break; case MFnNumericData::k3Short: //!< Three shorts. { MStatus status; short value[3]; MPlug plug0 = plug.child(0, &status); if (!status) return status; MPlug plug1 = plug.child(1, &status); if (!status) return status; MPlug plug2 = plug.child(2, &status); if (!status) return status; status = plug0.getValue(value[0]); if (!status) return status; status = plug1.getValue(value[1]); if (!status) return status; status = plug2.getValue(value[2]); if (!status) return status; return onShort3(plug, name, value); } break; case MFnNumericData::kLong: //!< One long. Same as int since "long" is not platform-consistent. { int value; MStatus status = plug.getValue(value); if (!status) return status; return onLong(plug, name, value); } break; //case MFnNumericData::Type::kInt: //!< One int. // break; case MFnNumericData::k2Long: //!< Two longs. Same as 2 ints since "long" is not platform-consistent. { MStatus status; int value[2]; MPlug plug0 = plug.child(0, &status); if (!status) return status; MPlug plug1 = plug.child(1, &status); if (!status) return status; status = plug0.getValue(value[0]); if (!status) return status; status = plug1.getValue(value[1]); if (!status) return status; return onLong2(plug, name, value); } break; //case MFnNumericData::Type::k2Int: //!< Two ints. // break; case MFnNumericData::k3Long: //!< Three longs. Same as 3 ints since "long" is not platform-consistent. { MStatus status; int value[3]; MPlug plug0 = plug.child(0, &status); if (!status) return status; MPlug plug1 = plug.child(1, &status); if (!status) return status; MPlug plug2 = plug.child(2, &status); if (!status) return status; status = plug0.getValue(value[0]); if (!status) return status; status = plug1.getValue(value[1]); if (!status) return status; status = plug2.getValue(value[2]); if (!status) return status; return onLong3(plug, name, value); } break; //case MFnNumericData::Type::k3Int: //!< Three ints. // break; case MFnNumericData::kFloat: //!< One float. { float value; MStatus status = plug.getValue(value); if (!status) return status; return onFloat(plug, name, value); } break; case MFnNumericData::k2Float: //!< Two floats. { MStatus status; float value[2]; MPlug plug0 = plug.child(0, &status); if (!status) return status; MPlug plug1 = plug.child(1, &status); if (!status) return status; status = plug0.getValue(value[0]); if (!status) return status; status = plug1.getValue(value[1]); if (!status) return status; return onFloat2(plug, name, value); } break; case MFnNumericData::k3Float: //!< Three floats. { MStatus status; float value[3]; MPlug plug0 = plug.child(0, &status); if (!status) return status; MPlug plug1 = plug.child(1, &status); if (!status) return status; MPlug plug2 = plug.child(2, &status); if (!status) return status; status = plug0.getValue(value[0]); if (!status) return status; status = plug1.getValue(value[1]); if (!status) return status; status = plug2.getValue(value[2]); if (!status) return status; return onFloat3(plug, name, value); } break; case MFnNumericData::kDouble: //!< One double. { double value; MStatus status = plug.getValue(value); if (!status) return status; return onDouble(plug, name, value); } break; case MFnNumericData::k2Double: //!< Two doubles. { MStatus status; double value[2]; MPlug plug0 = plug.child(0, &status); if (!status) return status; MPlug plug1 = plug.child(1, &status); if (!status) return status; status = plug0.getValue(value[0]); if (!status) return status; status = plug1.getValue(value[1]); if (!status) return status; return onDouble2(plug, name, value); } break; case MFnNumericData::k3Double: //!< Three doubles. { MStatus status; double value[3]; MPlug plug0 = plug.child(0, &status); if (!status) return status; MPlug plug1 = plug.child(1, &status); if (!status) return status; MPlug plug2 = plug.child(2, &status); if (!status) return status; status = plug0.getValue(value[0]); if (!status) return status; status = plug1.getValue(value[1]); if (!status) return status; status = plug2.getValue(value[2]); if (!status) return status; return onDouble3(plug, name, value); } break; case MFnNumericData::k4Double: //!< Four doubles. { MStatus status; double value[4]; MPlug plug0 = plug.child(0, &status); if (!status) return status; MPlug plug1 = plug.child(1, &status); if (!status) return status; MPlug plug2 = plug.child(2, &status); if (!status) return status; MPlug plug3 = plug.child(3, &status); if (!status) return status; status = plug0.getValue(value[0]); if (!status) return status; status = plug1.getValue(value[1]); if (!status) return status; status = plug2.getValue(value[2]); if (!status) return status; status = plug3.getValue(value[3]); if (!status) return status; return onDouble4(plug, name, value); } break; case MFnNumericData::kAddr: //!< An address. // TODO break; default: break; } return MS::kSuccess; }
void BUIEdit::Event(TEventUI& event) { if (event.type == uievent_setfocus) { m_pUIManager->CreateCaret(1, getContentRect().bottom - getContentRect().top); m_caretState = false; m_selectedBeginPalce = 0; m_selectedEndPlace = 0; Invalidate(); } if (event.type == uievent_killfocus) { m_pUIManager->DestroyCaret(); m_caretState = false; m_selectedBeginPalce = 0; m_selectedEndPlace = 0; Invalidate(); } if (event.type == uievent_buttondown) { m_selectedBeginPalce = 0; m_selectedEndPlace = 0; if (::PtInRect(&m_rcItem, event.ptMouse) && IsEnabled()) { m_caretPlace = locateCaretPlace(event.ptMouse.x); if (m_caretPlace == m_beginDrawPlace) { m_pUIManager->SetCaretPos(getContentRect().left, getContentRect().top); } else { SizeF szText = getTextSize(m_strText.substr(m_beginDrawPlace, m_caretPlace - m_beginDrawPlace)); m_pUIManager->SetCaretPos(getContentRect().left + ceil(szText.Width), getContentRect().top); } if (!m_caretState) { m_pUIManager->ShowCaret(); m_caretState = true; } } else { m_pUIManager->HideCaret(); m_caretState = false; } Invalidate(); } if (event.type == uievent_mouseenter) { if (!m_mouseState) { SetClassLong(m_pUIManager->GetPaintWindow(), GCL_HCURSOR, (LONG)LoadCursor(NULL,IDC_IBEAM)); m_mouseState = true; } } if (event.type == uievent_mousemove) { if (::PtInRect(&m_rcItem, event.ptMouse) && IsEnabled()) { if (::GetKeyState(VK_LBUTTON) < 0) { m_selectedBeginPalce = m_caretPlace; m_selectedEndPlace = locateCaretPlace(event.ptMouse.x); if (m_selectedBeginPalce > m_selectedEndPlace) { UINT caretPlace = m_selectedBeginPalce; m_selectedBeginPalce = m_selectedEndPlace; m_selectedEndPlace = caretPlace; } if (m_selectedBeginPalce < m_selectedEndPlace) { if (m_caretState) { m_pUIManager->HideCaret(); m_caretState = false; } } } Invalidate(); } } if (event.type == uievent_mouseleave) { if (m_mouseState) { SetClassLong(m_pUIManager->GetPaintWindow(), GCL_HCURSOR, (LONG)LoadCursor(NULL,IDC_ARROW)); m_mouseState = false; } } if (event.type == uievent_char) { onChar(event.chKey); Invalidate(); } if (event.type == uievent_keydown) { onKeyDown(event.chKey); Invalidate(); } BUILabel::Event(event); }