void WinEDA_SchematicFrame::OnLeftDClick(wxDC * DC, const wxPoint& MousePos) /***************************************************************************/ /* Appelé sur un double click: pour un élément editable (textes, composant): appel de l'editeur correspondant. pour une connexion en cours: termine la connexion */ { EDA_BaseStruct * DrawStruct = m_CurrentScreen->m_CurrentItem; wxPoint pos = GetPosition(); switch ( m_ID_current_state ) { case 0: if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) { DrawStruct = SchematicGeneralLocateAndDisplay(); } if ( (DrawStruct == NULL) || (DrawStruct->m_Flags != 0) ) break; // Element localisé switch ( DrawStruct->m_StructType ) { case DRAW_SHEET_STRUCT_TYPE: InstallNextScreen((DrawSheetStruct *) DrawStruct); break; case DRAW_LIB_ITEM_STRUCT_TYPE: InstallCmpeditFrame(this, pos, (EDA_SchComponentStruct *) DrawStruct); DrawPanel->MouseToCursorSchema(); break; case DRAW_TEXT_STRUCT_TYPE: case DRAW_LABEL_STRUCT_TYPE: case DRAW_GLOBAL_LABEL_STRUCT_TYPE: EditSchematicText( (DrawTextStruct*)DrawStruct, DC); break; case DRAW_PART_TEXT_STRUCT_TYPE: EditCmpFieldText( (PartTextStruct *)DrawStruct, DC); DrawPanel->MouseToCursorSchema(); break; default: break; } break; // end case 0 case ID_BUS_BUTT: case ID_WIRE_BUTT: if ( DrawStruct && (DrawStruct->m_Flags & IS_NEW) ) EndSegment(DC); break; } }
EDA_BaseStruct * WinEDA_SchematicFrame::CreateNewText(wxDC * DC, int type) /*************************************************************************/ /* Routine to create new text struct (GraphicText, label or Glabel). */ { DrawTextStruct * NewText = NULL; g_ItemToRepeat = NULL; switch( type ) { case LAYER_NOTES: NewText = new DrawTextStruct(m_CurrentScreen->m_Curseur); NewText->m_Size.x = NewText->m_Size.y = TextLabelSize; break; case LAYER_LOCLABEL: { NewText = new DrawLabelStruct(m_CurrentScreen->m_Curseur); NewText->m_Size.x = NewText->m_Size.y = TextLabelSize; } break; case LAYER_GLOBLABEL: NewText = new DrawGlobalLabelStruct(m_CurrentScreen->m_Curseur); NewText->m_Size.x = NewText->m_Size.y = TextLabelSize; ((DrawGlobalLabelStruct*)NewText)->m_Shape = ShapeGLabel; break; default: DisplayError(this, wxT("Editexte: Internal error") ); break; } NewText->m_Flags = IS_NEW | IS_MOVED; EditSchematicText(NewText, DC); if ( NewText->m_Text.IsEmpty() ) { delete NewText; return NULL; } RedrawOneStruct(DrawPanel, DC, NewText, GR_DEFAULT_DRAWMODE); m_CurrentScreen->ManageCurseur = ShowWhileMoving; m_CurrentScreen->ForceCloseManageCurseur = ExitMoveTexte; m_CurrentScreen->m_CurrentItem = NewText; return NewText; }
void SCH_EDIT_FRAME::OnEditItem( wxCommandEvent& aEvent ) { SCH_SCREEN* screen = GetScreen(); SCH_ITEM* item = screen->GetCurItem(); INSTALL_UNBUFFERED_DC( dc, m_canvas ); if( item == NULL ) { // If we didn't get here by a hot key, then something has gone wrong. if( aEvent.GetInt() == 0 ) return; EDA_HOTKEY_CLIENT_DATA* data = (EDA_HOTKEY_CLIENT_DATA*) aEvent.GetClientObject(); wxCHECK_RET( data != NULL, wxT( "Invalid hot key client object." ) ); // Set the locat filter, according to the edit command const KICAD_T* filterList = SCH_COLLECTOR::EditableItems; const KICAD_T* filterListAux = NULL; switch( aEvent.GetId() ) { case ID_SCH_EDIT_COMPONENT_REFERENCE: filterList = SCH_COLLECTOR::CmpFieldReferenceOnly; filterListAux = SCH_COLLECTOR::ComponentsOnly; break; case ID_SCH_EDIT_COMPONENT_VALUE: filterList = SCH_COLLECTOR::CmpFieldValueOnly; filterListAux = SCH_COLLECTOR::ComponentsOnly; break; case ID_SCH_EDIT_COMPONENT_FOOTPRINT: filterList = SCH_COLLECTOR::CmpFieldFootprintOnly; filterListAux = SCH_COLLECTOR::ComponentsOnly; break; default: break; } item = LocateAndShowItem( data->GetPosition(), filterList, aEvent.GetInt() ); // If no item found, and if an auxiliary filter exists, try to use it if( !item && filterListAux ) item = LocateAndShowItem( data->GetPosition(), filterListAux, aEvent.GetInt() ); // Exit if no item found at the current location or the item is already being edited. if( (item == NULL) || (item->GetFlags() != 0) ) return; } switch( item->Type() ) { case SCH_COMPONENT_T: { switch( aEvent.GetId() ) { case ID_SCH_EDIT_COMPONENT_REFERENCE: EditComponentFieldText( ( (SCH_COMPONENT*) item )->GetField( REFERENCE ) ); break; case ID_SCH_EDIT_COMPONENT_VALUE: EditComponentFieldText( ( (SCH_COMPONENT*) item )->GetField( VALUE ) ); break; case ID_SCH_EDIT_COMPONENT_FOOTPRINT: EditComponentFieldText( ( (SCH_COMPONENT*) item )->GetField( FOOTPRINT ) ); break; case ID_SCH_EDIT_ITEM: EditComponent( (SCH_COMPONENT*) item ); break; default: wxFAIL_MSG( wxString::Format( wxT( "Invalid schematic component edit command ID %d" ), aEvent.GetId() ) ); } break; } case SCH_SHEET_T: EditSheet( (SCH_SHEET*) item, &dc ); break; case SCH_SHEET_PIN_T: EditSheetPin( (SCH_SHEET_PIN*) item, &dc ); break; case SCH_TEXT_T: case SCH_LABEL_T: case SCH_GLOBAL_LABEL_T: case SCH_HIERARCHICAL_LABEL_T: EditSchematicText( (SCH_TEXT*) item ); break; case SCH_FIELD_T: EditComponentFieldText( (SCH_FIELD*) item ); break; case SCH_BITMAP_T: EditImage( (SCH_BITMAP*) item ); break; default: wxFAIL_MSG( wxString::Format( wxT( "Cannot edit schematic item type %s." ), GetChars( item->GetClass() ) ) ); } if( item->GetFlags() == 0 ) screen->SetCurItem( NULL ); }
/** * Function OnLeftDClick * called on a double click event from the drawpanel mouse handler * if an editable item is found (text, component) * Call the suitable dialog editor. * Id a create command is in progress: * validate and finish the command */ void SCH_EDIT_FRAME::OnLeftDClick( wxDC* aDC, const wxPoint& aPosition ) { EDA_ITEM* item = GetScreen()->GetCurItem(); switch( GetToolId() ) { case ID_NO_TOOL_SELECTED: if( ( item == NULL ) || ( item->GetFlags() == 0 ) ) { item = LocateAndShowItem( aPosition ); } if( ( item == NULL ) || ( item->GetFlags() != 0 ) ) break; switch( item->Type() ) { case SCH_SHEET_T: m_CurrentSheet->push_back( (SCH_SHEET*) item ); DisplayCurrentSheet(); break; case SCH_COMPONENT_T: EditComponent( (SCH_COMPONENT*) item ); GetCanvas()->MoveCursorToCrossHair(); if( item->GetFlags() == 0 ) GetScreen()->SetCurItem( NULL ); GetCanvas()->Refresh(); break; case SCH_TEXT_T: case SCH_LABEL_T: case SCH_GLOBAL_LABEL_T: case SCH_HIERARCHICAL_LABEL_T: EditSchematicText( (SCH_TEXT*) item ); break; case SCH_BITMAP_T: EditImage( (SCH_BITMAP*) item ); break; case SCH_FIELD_T: EditComponentFieldText( (SCH_FIELD*) item ); GetCanvas()->MoveCursorToCrossHair(); break; case SCH_MARKER_T: ( (SCH_MARKER*) item )->DisplayMarkerInfo( this ); break; default: break; } break; case ID_BUS_BUTT: case ID_WIRE_BUTT: case ID_LINE_COMMENT_BUTT: if( item && item->IsNew() ) EndSegment( aDC ); break; } }
SCH_TEXT* SCH_EDIT_FRAME::CreateNewText( wxDC* aDC, int aType ) { SCH_TEXT* textItem = NULL; SetRepeatItem( NULL ); switch( aType ) { case LAYER_NOTES: textItem = new SCH_TEXT( GetCrossHairPosition() ); break; case LAYER_LOCLABEL: textItem = new SCH_LABEL( GetCrossHairPosition() ); break; case LAYER_HIERLABEL: textItem = new SCH_HIERLABEL( GetCrossHairPosition() ); textItem->SetShape( lastGlobalLabelShape ); break; case LAYER_GLOBLABEL: textItem = new SCH_GLOBALLABEL( GetCrossHairPosition() ); textItem->SetShape( lastGlobalLabelShape ); break; default: DisplayError( this, wxT( "SCH_EDIT_FRAME::CreateNewText() Internal error" ) ); return NULL; } textItem->SetBold( lastTextBold ); textItem->SetItalic( lastTextItalic ); textItem->SetOrientation( lastTextOrientation ); textItem->SetSize( wxSize( GetDefaultTextSize(), GetDefaultTextSize() ) ); textItem->SetFlags( IS_NEW | IS_MOVED ); EditSchematicText( textItem ); if( textItem->GetText().IsEmpty() ) { delete textItem; return NULL; } lastTextBold = textItem->IsBold(); lastTextItalic = textItem->IsItalic(); lastTextOrientation = textItem->GetOrientation(); if( ( textItem->Type() == SCH_GLOBAL_LABEL_T ) || ( textItem->Type() == SCH_HIERARCHICAL_LABEL_T ) ) { lastGlobalLabelShape = textItem->GetShape(); } // Prepare display to move the new item textItem->Draw( m_canvas, aDC, wxPoint( 0, 0 ), g_XorMode ); PrepareMoveItem( (SCH_ITEM*) textItem, aDC ); return textItem; }