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;
  }
}
示例#2
0
// 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;
}
示例#4
0
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;
}
示例#6
0
文件: Window.cpp 项目: yuen33/Neutron
		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;
	}
示例#9
0
文件: BUIEdit.cpp 项目: czbreborn/BUI
	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);
	}