void WinEDA_SchematicFrame::EditComponentReference(EDA_SchComponentStruct * DrawLibItem, wxDC * DC) /**************************************************************************************************/ /* Edit the component text reference*/ { wxString msg; EDA_LibComponentStruct *Entry; int flag = 0; if( DrawLibItem == NULL ) return; Entry = FindLibPart(DrawLibItem->m_ChipName.GetData(), wxEmptyString, FIND_ROOT); if ( Entry == NULL ) return; if ( Entry->m_UnitCount > 1 ) flag = 1; PartTextStruct * TextField = &DrawLibItem->m_Field[REFERENCE]; msg = TextField->m_Text; Get_Message(_("Reference") , msg, this); if ( ! msg.IsEmpty() ) // New text entered { DrawTextField(DrawPanel, DC, &DrawLibItem->m_Field[REFERENCE], flag, g_XorMode); TextField->m_Text = msg; DrawTextField(DrawPanel, DC, &DrawLibItem->m_Field[REFERENCE], flag, DrawLibItem->m_Flags ? g_XorMode : GR_DEFAULT_DRAWMODE); GetScreen()->SetModify(); } DrawLibItem->Display_Infos(this); }
void WinEDA_SchematicFrame::EditComponentValue(EDA_SchComponentStruct * DrawLibItem, wxDC * DC) /*****************************************************************************************/ /* Routine de changement du texte selectionne */ { wxString msg; EDA_LibComponentStruct *Entry; int flag = 0; if( DrawLibItem == NULL ) return; Entry = FindLibPart(DrawLibItem->m_ChipName.GetData(), wxEmptyString, FIND_ROOT); if ( Entry == NULL ) return; if ( Entry->m_UnitCount > 1 ) flag = 1; PartTextStruct * TextField = &DrawLibItem->m_Field[VALUE]; msg = TextField->m_Text; Get_Message(_("Value") , msg, this); if ( ! msg.IsEmpty() ) { DrawTextField(DrawPanel, DC, &DrawLibItem->m_Field[VALUE], flag, g_XorMode); TextField->m_Text = msg; DrawTextField(DrawPanel, DC, &DrawLibItem->m_Field[VALUE], flag, DrawLibItem->m_Flags ? g_XorMode : GR_DEFAULT_DRAWMODE); m_CurrentScreen->SetModify(); } DrawLibItem->Display_Infos(this); }
void WinEDA_SchematicFrame::RotateCmpField(PartTextStruct * Field, wxDC * DC) /*********************************************************************************/ { int FieldNumber, flag; EDA_LibComponentStruct *Entry; if (Field == NULL ) return; if (Field->m_Text == wxEmptyString ) return; FieldNumber = Field->m_FieldId; flag = 0; if( FieldNumber == REFERENCE ) { Entry = FindLibPart( ((EDA_SchComponentStruct*)Field->m_Parent)->m_ChipName.GetData(), wxEmptyString, FIND_ROOT); if( Entry != NULL ) { if ( Entry->m_UnitCount > 1 ) flag = 1; } } DrawTextField(DrawPanel, DC, Field, flag, g_XorMode); if( Field->m_Orient == TEXT_ORIENT_HORIZ ) Field->m_Orient = TEXT_ORIENT_VERT; else Field->m_Orient = TEXT_ORIENT_HORIZ; DrawTextField(DrawPanel, DC, Field,flag, g_XorMode); GetScreen()->SetModify(); }
static void MoveCmpField(WinEDA_DrawPanel * panel, wxDC * DC, bool erase) /************************************************************************/ /* Routine de deplacement d'un texte type Field. Celle routine est normalement attachee au deplacement du curseur */ { #define TRF ((EDA_SchComponentStruct*)CurrentField->m_Parent)->m_Transform wxPoint pos; int x1, y1; int FieldNumber; if( CurrentField == NULL) return; FieldNumber = CurrentField->m_FieldId; /* Effacement: */ if( erase ) DrawTextField(panel, DC, CurrentField, Multiflag, g_XorMode); pos = ((EDA_SchComponentStruct*)CurrentField->m_Parent)->m_Pos; /* Les positions sont caculees par la matrice TRANSPOSEE de la matrice de rotation-miroir */ x1 = panel->GetScreen()->m_Curseur.x - pos.x; y1 = panel->GetScreen()->m_Curseur.y - pos.y; CurrentField->m_Pos.x = pos.x + TRF[0][0] * x1 + TRF[1][0] * y1; CurrentField->m_Pos.y = pos.y + TRF[0][1] * x1 + TRF[1][1] * y1; DrawTextField(panel, DC, CurrentField, Multiflag, g_XorMode); }
static void AbortMoveCmpField(WinEDA_DrawFrame * frame, wxDC * DC) /******************************************************************/ { frame->GetScreen()->ForceCloseManageCurseur = NULL; frame->GetScreen()->ManageCurseur = NULL; if ( CurrentField ) { DrawTextField(frame->DrawPanel, DC, CurrentField,Multiflag, g_XorMode); CurrentField->m_Flags = 0; CurrentField->m_Pos = OldPos; DrawTextField(frame->DrawPanel, DC, CurrentField,Multiflag, GR_DEFAULT_DRAWMODE); } CurrentField = NULL; }
void PartTextStruct::Place( WinEDA_DrawFrame * frame, wxDC * DC) /***************************************************************/ { int FieldNumber, flag; EDA_LibComponentStruct *Entry; frame->m_CurrentScreen->ManageCurseur = NULL; frame->m_CurrentScreen->ForceCloseManageCurseur = NULL; FieldNumber = m_FieldId; flag = 0; if( FieldNumber == REFERENCE ) { Entry = FindLibPart( ((EDA_SchComponentStruct*)m_Parent)->m_ChipName.GetData(), wxEmptyString, FIND_ROOT); if( Entry != NULL ) { if ( Entry->m_UnitCount > 1 ) flag = 1; } } DrawTextField(frame->DrawPanel, DC, this, flag, GR_DEFAULT_DRAWMODE); m_Flags = 0; frame->GetScreen()->m_CurrentItem = NULL; frame->GetScreen()->SetModify(); CurrentField = NULL; }
/***************************************************************************** * Routine to draw the given part at given position, transformed/mirror as * * specified, and in the given drawing mode. Only this one is visible... * *****************************************************************************/ bool DrawLibPart(WinEDA_DrawPanel * panel,wxDC * DC, EDA_SchComponentStruct *DrawLibItem, int DrawMode, int Color) { EDA_LibComponentStruct *Entry; int ii; bool dummy = FALSE; if( (Entry = FindLibPart(DrawLibItem->m_ChipName.GetData(),wxEmptyString,FIND_ROOT)) == NULL) { /* composant non trouvé, on affiche un composant "dummy" */ dummy = TRUE; if( DummyCmp == NULL ) CreateDummyCmp(); Entry = DummyCmp; } DrawLibPartAux(panel, DC, DrawLibItem, Entry, DrawLibItem->m_Pos, DrawLibItem->m_Transform, dummy ? 0 : DrawLibItem->m_Multi, dummy ? 0 : DrawLibItem->m_Convert, DrawMode); /* Trace des champs, avec placement et orientation selon orient. du composant */ if( ((DrawLibItem->m_Field[REFERENCE].m_Attributs & TEXT_NO_VISIBLE) == 0) && ! (DrawLibItem->m_Field[REFERENCE].m_Flags & IS_MOVED) ) { if ( Entry->m_UnitCount > 1 ) DrawTextField(panel, DC, &DrawLibItem->m_Field[REFERENCE],1,DrawMode); else DrawTextField(panel, DC, &DrawLibItem->m_Field[REFERENCE],0,DrawMode); } for( ii = VALUE; ii < NUMBER_OF_FIELDS; ii++ ) { if (DrawLibItem->m_Field[ii].m_Flags & IS_MOVED) continue; DrawTextField(panel, DC, &DrawLibItem->m_Field[ii],0,DrawMode); } return TRUE; }
void DrawControl(const struct zzControl* ctrl) { short state = GetControlState(ctrl); if(state == -1) return; switch ( ctrl->type ) { case BUTTON: DrawButton((struct zzButton*) ctrl); break; case LABEL: DrawLabel((struct zzLabel*) ctrl); break; case TEXTFIELD: DrawTextField((struct zzTextField*) ctrl); break; default: break; } }
void EvtKeyTextField(struct XObj *xobj,XKeyEvent *EvtKey) { int i,x2; char car[11]; char* carks2; char* carks = NULL; KeySym ks; int Size; int NewPos; /* Recherche du charactere */ i=XLookupString(EvtKey,car,10,&ks,NULL); NewPos=xobj->value; car[i]='\0'; carks2=XKeysymToString(ks); if (carks2!=NULL) { carks=(char*)calloc(sizeof(char),30); sprintf(carks,"%s",carks2); if (strcmp(carks,"Right")==0) { NewPos++; if (NewPos>strlen(xobj->title)) NewPos=strlen(xobj->title); } else if (strcmp(carks,"Left")==0) { NewPos--; if (NewPos<0) NewPos=0; } else if (strcmp(carks,"Return")==0) { ; } else if ((strcmp(carks,"Delete")==0)||(strcmp(carks,"BackSpace")==0)) { if (NewPos>0) { Size=strlen(xobj->title); memmove(&xobj->title[NewPos-1],&xobj->title[NewPos], Size-NewPos+1); xobj->title=(char*)realloc(xobj->title,(Size)*sizeof(char)); NewPos--; SendMsg(xobj,SingleClic); } } else if (i!=0) /* Cas d'un caractere normal */ { /* Insertion du caractere dans le titre */ /* a normal character: insertion in the title */ Size=strlen(xobj->title); xobj->title=(char*)realloc(xobj->title,(2+Size)*sizeof(char)); memmove(&xobj->title[NewPos+1],&xobj->title[NewPos], Size-NewPos+1); xobj->title[NewPos]=car[0]; NewPos++; SendMsg(xobj,SingleClic); } } if ((xobj->value!=NewPos)||(xobj->value2!=NewPos)) { XSetForeground(dpy,xobj->gc,xobj->TabColor[back]); x2=XTextWidth(xobj->xfont,xobj->title,strlen(xobj->title)); XFillRectangle(dpy,xobj->win,xobj->gc,x2+4,4,xobj->width-x2-8, xobj->height-8); xobj->value=NewPos; xobj->value2=NewPos; DrawPointTxt(xobj,xobj->TabColor[fore]); DrawTextField(xobj); } free(carks); }
void EvtMouseTextField(struct XObj *xobj,XButtonEvent *EvtButton) { unsigned int modif; int x1,x2,y1,y2,i; Window Win1,Win2; int PosCurs=0; int SizeBuf; char *str; int NewPos; Atom type; XEvent event; int ButPress=1; int format; unsigned long longueur,octets_restant; unsigned char *donnees=(unsigned char *)""; XRectangle rect; /* On deplace le curseur a la position de la souris */ /* On recupere la position de la souris */ /* We move the cursor at mouse position and we get the mouse position */ switch (EvtButton->button) { case Button1: XQueryPointer(dpy,*xobj->ParentWin,&Win1,&Win2,&x1,&y1,&x2,&y2,&modif); x2=x2-xobj->x; PosCurs=0; while ((PosCurs<strlen(xobj->title+xobj->value3))&& (x2>XTextWidth(xobj->xfont,xobj->title+xobj->value3,PosCurs)+8)) PosCurs++; DrawPointTxt(xobj,xobj->TabColor[back]); xobj->value=PosCurs+xobj->value3; xobj->value2=PosCurs+xobj->value3; DrawPointTxt(xobj,xobj->TabColor[fore]); DrawTextField(xobj); while (ButPress) { XNextEvent(dpy, &event); switch (event.type) { case MotionNotify: XQueryPointer(dpy,*xobj->ParentWin,&Win1,&Win2,&x1,&y1,&x2,&y2,&modif); x2=x2-xobj->x; PosCurs=0; while ((PosCurs<strlen(xobj->title+xobj->value3))&& (x2>XTextWidth(xobj->xfont,xobj->title+xobj->value3,PosCurs)+8)) PosCurs++; /* Limitation de la zone de dessin */ /* limitation of the drawing zone */ if (PosCurs>xobj->value2) { rect.x=XTextWidth(xobj->xfont,xobj->title+xobj->value3,xobj->value2); rect.y=0; rect.width=XTextWidth(xobj->xfont,xobj->title+xobj->value3,PosCurs+1) -rect.x+1; rect.height=xobj->height; xobj->value2=PosCurs+xobj->value3; DrawTextField(xobj); } else if (PosCurs<xobj->value2) { rect.x=XTextWidth(xobj->xfont,xobj->title+xobj->value3,PosCurs)-1; rect.y=0; rect.width=XTextWidth(xobj->xfont,xobj->title+xobj->value3, xobj->value2+1) - rect.x+2; rect.height=xobj->height; xobj->value2=PosCurs+xobj->value3; DrawTextField(xobj); } break; case ButtonRelease: ButPress=0; break; } } /* Enregistrement de la selection dans le presse papier */ /* Le programme devient proprietaire de la selection */ /* selection stuff: get the selection */ if (xobj->value!=xobj->value2) { str=(char*)GetText(xobj,xobj->value2); for (i=0;i<=7;i++) XStoreBuffer(dpy,str,strlen(str),i); Scrapt=(char*)realloc((void*)Scrapt,(strlen(str)+2)*sizeof(char)); Scrapt=strcpy(Scrapt,str); free(str); x11base->HaveXSelection=True; XSetSelectionOwner(dpy,XA_PRIMARY,x11base->win,EvtButton->time); SelectOneTextField(xobj); } break; case Button2: /* Colle le texte */ /* Si l'application possede pas la selection, elle la demande */ /* sinon elle lit son presse papier */ /* read the selection */ if (!x11base->HaveXSelection) { /* Demande de la selection */ /* ask for the selection */ XConvertSelection(dpy,XA_PRIMARY,XA_STRING,propriete,*xobj->ParentWin, EvtButton->time); while (!(XCheckTypedEvent(dpy,SelectionNotify,&event))) ; if (event.xselection.property!=None) if (event.xselection.selection==XA_PRIMARY) { XGetWindowProperty(dpy,event.xselection.requestor, event.xselection.property,0,8192,False, event.xselection.target,&type,&format, &longueur,&octets_restant,&donnees); if (longueur>0) { Scrapt=(char*)realloc((void*)Scrapt,(longueur+1)*sizeof(char)); Scrapt=strcpy(Scrapt,(char *)donnees); XDeleteProperty(dpy,event.xselection.requestor, event.xselection.property); XFree(donnees); } } } SizeBuf=strlen(Scrapt); if (SizeBuf>0) { NewPos=InsertText(xobj,Scrapt,SizeBuf); DrawPointTxt(xobj,xobj->TabColor[back]); xobj->value=NewPos; xobj->value2=NewPos; DrawPointTxt(xobj,xobj->TabColor[fore]); DrawTextField(xobj); SendMsg(xobj,SingleClic); } break; case Button3: /* Appuie sur le troisieme bouton */ XQueryPointer(dpy,*xobj->ParentWin,&Win1,&Win2,&x1,&y1,&x2,&y2,&modif); x2=x2-xobj->x; PosCurs=0; while ((PosCurs<strlen(xobj->title))&& (x2>XTextWidth(xobj->xfont,xobj->title+xobj->value3,PosCurs)+8)) PosCurs++; if ((PosCurs<xobj->value) && (xobj->value<xobj->value2)) xobj->value=xobj->value2; if ((PosCurs>xobj->value) && (xobj->value>xobj->value2)) xobj->value=xobj->value2; xobj->value2=PosCurs+xobj->value3; DrawTextField(xobj); while (ButPress) { XNextEvent(dpy, &event); switch (event.type) { case MotionNotify: XQueryPointer(dpy,*xobj->ParentWin,&Win1,&Win2,&x1,&y1,&x2,&y2,&modif); x2=x2-xobj->x; while ((PosCurs<strlen(xobj->title))&& (x2>XTextWidth(xobj->xfont,xobj->title+xobj->value3,PosCurs)+8)) PosCurs++; if (PosCurs>xobj->value2) { rect.x=XTextWidth(xobj->xfont,xobj->title+xobj->value3,xobj->value2); rect.y=0; rect.width=XTextWidth(xobj->xfont,xobj->title+xobj->value3,PosCurs+1) -rect.x+1; rect.height=xobj->height; xobj->value2=PosCurs; DrawTextField(xobj); } else if (PosCurs<xobj->value2) { rect.x=XTextWidth(xobj->xfont,xobj->title+xobj->value3,PosCurs)-1; rect.y=0; rect.width=XTextWidth(xobj->xfont,xobj->title+xobj->value3, xobj->value2+1)-rect.x+2; rect.height=xobj->height; xobj->value2=PosCurs+xobj->value3; DrawTextField(xobj); } PosCurs=0; break; case ButtonRelease: ButPress=0; break; } } if (xobj->value!=xobj->value2) { str=(char*)GetText(xobj,xobj->value2); for (i=0;i<=7;i++) XStoreBuffer(dpy,str,strlen(str),i); Scrapt=(char*)realloc((void*)Scrapt,(strlen(str)+2)*sizeof(char)); Scrapt=strcpy(Scrapt,str); free(str); x11base->HaveXSelection=True; XSetSelectionOwner(dpy,XA_PRIMARY,x11base->win,EvtButton->time); } break; } }
void EvtKeyTextField(struct XObj *xobj,XKeyEvent *EvtKey) { int i,x2; char car[11]; char* carks2; char* carks = NULL; KeySym ks; int Size; int NewPos; int new_value; /* Recherche du charactere */ i=XLookupString(EvtKey,car,10,&ks,NULL); /* calculate byte offset from current position */ NewPos = getByteOffsetBoundsCheck(xobj->Ffont, xobj->title, xobj->value); car[i]='\0'; carks2=XKeysymToString(ks); if (carks2!=NULL) { carks=(char*)calloc(sizeof(char),30); sprintf(carks,"%s",carks2); if (strcmp(carks,"Right")==0) { /* if we are at the end, don't go further */ if (NewPos >= strlen(xobj->title)) NewPos = strlen(xobj->title); /* otherwise step forward as many bytes as the next charcter at the insertion point is wide */ else NewPos += FlocaleStringNumberOfBytes( xobj->Ffont, xobj->title + NewPos); } else if (strcmp(carks,"Left")==0) { /* if we are at the beginning, don't go further */ if (NewPos <= 0) NewPos=0; /* otherwise step back as many bytes as the chacter behind the insertion point */ else NewPos = FlocaleStringCharToByteOffset( xobj->Ffont, xobj->title, xobj->value - 1); } else if (strcmp(carks,"Return")==0) { ; } else if ((strcmp(carks,"Delete")==0)|| (strcmp(carks,"BackSpace")==0)) { if (NewPos>0) { /* need to delete the "right" amount of bytes from the string, we might be using multi-byte strings */ int PrevPos; Size=strlen(xobj->title); PrevPos = FlocaleStringCharToByteOffset( xobj->Ffont, xobj->title, xobj->value - 1); memmove( &xobj->title[PrevPos], &xobj->title[NewPos], Size-NewPos+1); xobj->title=(char*)realloc( xobj->title, (Size - (NewPos - PrevPos) + 1) * sizeof(char)); NewPos = PrevPos; SendMsg(xobj,SingleClic); } } else if (i!=0) /* Cas d'un caractere normal */ { /* Insertion du caractere dans le titre */ /* a normal character: insertion in the title */ /* here "i" is the number of bytes returned need not be 1 incase of MB locale */ Size=strlen(xobj->title); fprintf(stderr, "Current size: %d\n", Size); /* make room for more the new text */ /* shouldn't saferealloc be used here? */ xobj->title=(char*)realloc( xobj->title,(Size+i+1)*sizeof(char)); /* new text will be inserted at NewPos */ /* move string currently in wiget's buffer to make room for new text */ memmove(&xobj->title[NewPos+i],&xobj->title[NewPos], Size - NewPos + 1); /* and insert new text */ memcpy(&xobj->title[NewPos],car,i); NewPos += i; SendMsg(xobj,SingleClic); } } new_value = getCharOffsetBoundsCheck(xobj->Ffont, xobj->title, NewPos); if ((xobj->value != new_value) || (xobj->value2 != new_value)) { XSetForeground(dpy,xobj->gc,xobj->TabColor[back]); x2=FlocaleTextWidth( xobj->Ffont,xobj->title,strlen(xobj->title)); XFillRectangle(dpy,xobj->win,xobj->gc,x2+4,4,xobj->width-x2-8, xobj->height-8); /* convert back to char offsets */ xobj->value = new_value; /*FlocaleStringByteToCharOffset(xobj->Ffont, xobj->title, NewPos);*/ xobj->value2 = new_value; /*FlocaleStringByteToCharOffset(xobj->Ffont, xobj->title, NewPos);*/ DrawPointTxt(xobj,xobj->TabColor[fore]); DrawTextField(xobj,NULL); } free(carks); }
void EvtMouseTextField(struct XObj *xobj,XButtonEvent *EvtButton) { unsigned int modif; int x1,x2,y1,y2,i; Window Win1,Win2; int PosCurs=0; int SizeBuf; char *str; int NewPos; Atom type; XEvent event; int ButPress=1; int format; unsigned long longueur,octets_restant; unsigned char *donnees=(unsigned char *)""; XRectangle rect; int start_pos, selection_pos, curs_pos; /* On deplace le curseur a la position de la souris */ /* On recupere la position de la souris */ /* We move the cursor at mouse position and we get the mouse position */ switch (EvtButton->button) { case Button1: FQueryPointer( dpy,*xobj->ParentWin,&Win1,&Win2,&x1,&y1,&x2,&y2, &modif); x2=x2-xobj->x; /* see where we clicked */ PosCurs=0; /* byte position of first visible character */ start_pos = getByteOffsetBoundsCheck(xobj->Ffont, xobj->title, xobj->value3); /* cursor offset in bytes */ curs_pos = 0; while ((curs_pos < strlen(xobj->title + start_pos)) && (x2 > FlocaleTextWidth( xobj->Ffont,xobj->title + start_pos, curs_pos) + 8)) { curs_pos += FlocaleStringNumberOfBytes( xobj->Ffont, xobj->title + start_pos + curs_pos); PosCurs++; } DrawPointTxt(xobj,xobj->TabColor[back]); /* set selection start and end where clicked */ /* first visible char + position clicked */ xobj->value = PosCurs + xobj->value3; xobj->value2 = PosCurs + xobj->value3; /* byte offset corresponding to the above */ start_pos = getByteOffsetBoundsCheck(xobj->Ffont, xobj->title, xobj->value3); selection_pos = getByteOffsetBoundsCheck(xobj->Ffont, xobj->title, xobj->value3); DrawPointTxt(xobj,xobj->TabColor[fore]); DrawTextField(xobj,NULL); while (ButPress) { FNextEvent(dpy, &event); switch (event.type) { case MotionNotify: FQueryPointer( dpy,*xobj->ParentWin,&Win1,&Win2,&x1, &y1,&x2,&y2,&modif); x2=x2-xobj->x; PosCurs=0; curs_pos = 0; /* determine how far in the mouse is now */ while ((curs_pos < strlen( xobj->title + start_pos)) && (x2 > FlocaleTextWidth( xobj->Ffont,xobj->title+ start_pos, curs_pos) + 8)) { curs_pos += FlocaleStringNumberOfBytes( xobj->Ffont, xobj->title + start_pos + curs_pos); PosCurs++; } /* Limitation de la zone de dessin */ /* limitation of the drawing zone */ /* these 2 if-statements updates current cursor position of the widget if needed */ if (PosCurs > (xobj->value2 - xobj->value3)) { /* select made "forward" */ rect.x= FlocaleTextWidth( xobj->Ffont, xobj->title+ start_pos, selection_pos - start_pos); rect.y=0; rect.width= FlocaleTextWidth( xobj->Ffont, xobj->title+ start_pos, curs_pos) -rect.x+1; rect.height=xobj->height; xobj->value2 = PosCurs + xobj->value3; DrawTextField(xobj,NULL); } else if (PosCurs < (xobj->value2 - xobj->value3)) { /* selection made "backwards" */ rect.x=FlocaleTextWidth( xobj->Ffont, xobj->title+ start_pos, curs_pos) - 1; rect.y=0; rect.width=FlocaleTextWidth( xobj->Ffont, xobj->title+ start_pos, selection_pos - start_pos) - rect.x+2; rect.height=xobj->height; xobj->value2= PosCurs + xobj->value3; DrawTextField(xobj,NULL); } break; case ButtonRelease: ButPress=0; break; } } /* Enregistrement de la selection dans le presse papier */ /* Le programme devient proprietaire de la selection */ /* selection stuff: get the selection */ if (xobj->value != xobj->value2) { str=(char*)GetText(xobj, xobj->value2); for (i=0;i<=7;i++) XStoreBuffer(dpy,str,strlen(str),i); Scrapt = (char*)realloc( (void*)Scrapt, (strlen(str)+2)*sizeof(char)); Scrapt = strcpy(Scrapt,str); free(str); x11base->HaveXSelection=True; XSetSelectionOwner( dpy,XA_PRIMARY,x11base->win,EvtButton->time); SelectOneTextField(xobj); } break; case Button2: /* Colle le texte */ /* Si l'application possede pas la selection, elle la demande */ /* sinon elle lit son presse papier */ /* read the selection */ if (!x11base->HaveXSelection) { /* Demande de la selection */ /* ask for the selection */ XConvertSelection( dpy,XA_PRIMARY,XA_STRING,propriete, *xobj->ParentWin, EvtButton->time); while (!(FCheckTypedEvent(dpy,SelectionNotify,&event))) ; if (event.xselection.property!=None) if (event.xselection.selection==XA_PRIMARY) { XGetWindowProperty( dpy,event.xselection.requestor, event.xselection.property,0L, 8192L,False, event.xselection.target,&type, &format, &longueur, &octets_restant,&donnees); if (longueur>0) { Scrapt=(char*)realloc( (void*)Scrapt, (longueur+1)* sizeof(char)); Scrapt=strcpy( Scrapt,(char *)donnees); XDeleteProperty( dpy, event.xselection. requestor, event.xselection. property); XFree(donnees); } } } SizeBuf=strlen(Scrapt); if (SizeBuf>0) { NewPos=InsertText(xobj,Scrapt,SizeBuf); DrawPointTxt(xobj,xobj->TabColor[back]); xobj->value=NewPos; xobj->value2=NewPos; DrawPointTxt(xobj,xobj->TabColor[fore]); DrawTextField(xobj,NULL); SendMsg(xobj,SingleClic); } break; case Button3: /* Appuie sur le troisieme bouton */ FQueryPointer( dpy,*xobj->ParentWin,&Win1,&Win2,&x1,&y1,&x2,&y2, &modif); x2=x2-xobj->x; PosCurs=0; while ((PosCurs<strlen(xobj->title))&& (x2>FlocaleTextWidth( xobj->Ffont,xobj->title+xobj->value3, PosCurs)+8)) PosCurs++; if ((PosCurs<xobj->value) && (xobj->value<xobj->value2)) xobj->value=xobj->value2; if ((PosCurs>xobj->value) && (xobj->value>xobj->value2)) xobj->value=xobj->value2; xobj->value2=PosCurs+xobj->value3; DrawTextField(xobj,NULL); while (ButPress) { FNextEvent(dpy, &event); switch (event.type) { case MotionNotify: FQueryPointer( dpy,*xobj->ParentWin,&Win1,&Win2,&x1, &y1,&x2,&y2,&modif); x2=x2-xobj->x; while ((PosCurs<strlen(xobj->title))&& (x2 > FlocaleTextWidth( xobj->Ffont, xobj->title+xobj->value3, PosCurs)+8)) PosCurs++; if (PosCurs>xobj->value2) { rect.x= FlocaleTextWidth( xobj->Ffont, xobj->title+ xobj->value3, xobj->value2); rect.y=0; rect.width= FlocaleTextWidth( xobj->Ffont, xobj->title+ xobj->value3,PosCurs+1) -rect.x+1; rect.height=xobj->height; xobj->value2=PosCurs; DrawTextField(xobj,NULL); } else if (PosCurs<xobj->value2) { rect.x=FlocaleTextWidth( xobj->Ffont, xobj->title+ xobj->value3, PosCurs)-1; rect.y=0; rect.width=FlocaleTextWidth( xobj->Ffont, xobj->title+xobj-> value3, xobj->value2+1)- rect.x+2; rect.height=xobj->height; xobj->value2= PosCurs+xobj->value3; DrawTextField(xobj,NULL); } PosCurs=0; break; case ButtonRelease: ButPress=0; break; } } if (xobj->value!=xobj->value2) { str=(char*)GetText(xobj,xobj->value2); for (i=0;i<=7;i++) XStoreBuffer(dpy,str,strlen(str),i); Scrapt=(char*)realloc( (void*)Scrapt,(strlen(str)+2)*sizeof(char)); Scrapt=strcpy(Scrapt,str); free(str); x11base->HaveXSelection=True; XSetSelectionOwner( dpy,XA_PRIMARY,x11base->win,EvtButton->time); } break; } }
void WinEDA_SchematicFrame::EditCmpFieldText(PartTextStruct * Field, wxDC *DC) /**********************************************************************************/ /* Routine de changement du texte selectionne */ { int FieldNumber, flag; EDA_LibComponentStruct *Entry; if( Field == NULL ) { DisplayError(this, _("No Field To Edit"), 10); return; } FieldNumber = Field->m_FieldId; if( FieldNumber == VALUE ) { Entry = FindLibPart( ((EDA_SchComponentStruct*)Field->m_Parent)->m_ChipName.GetData(), wxEmptyString, FIND_ROOT); if( Entry && (Entry->m_Options == ENTRY_POWER) ) { DisplayInfo(this, _("Part is a POWER, value cannot be modified!\nYou must create a new power") ); return; } } flag = 0; if( FieldNumber == REFERENCE ) { Entry = FindLibPart( ((EDA_SchComponentStruct*)Field->m_Parent)->m_ChipName.GetData(), wxEmptyString, FIND_ROOT); if( Entry != NULL ) { if ( Entry->m_UnitCount > 1 ) flag = 1; } } wxString newtext = Field->m_Text; Get_Message(DrawPartStruct::ReturnFieldName(FieldNumber), newtext, this); DrawTextField(DrawPanel, DC, Field, flag, g_XorMode); if ( ! newtext.IsEmpty() ) { if (Field->m_Text.IsEmpty()) { Field->m_Pos = ((EDA_SchComponentStruct*)Field->m_Parent)->m_Pos; Field->m_Size.x = Field->m_Size.y = TextFieldSize; } Field->m_Text = newtext; } else /* Nouveau texte NULL */ { if( FieldNumber == REFERENCE ) { DisplayError(this, _("Reference needed !, No change")); } else if( FieldNumber == VALUE ) { DisplayError(this, _("Value needed !, No change")); } else { Field->m_Text = wxT("~"); } } DrawTextField(DrawPanel, DC, Field, flag, g_XorMode); ((EDA_SchComponentStruct*)Field->m_Parent)->Display_Infos(this); m_CurrentScreen->SetModify(); }