433 lines
12 KiB
C++
433 lines
12 KiB
C++
|
/************************/
|
|||
|
/* modedit_onclick.cpp */
|
|||
|
/************************/
|
|||
|
|
|||
|
#ifdef __GNUG__
|
|||
|
#pragma implementation
|
|||
|
#endif
|
|||
|
|
|||
|
#include "fctsys.h"
|
|||
|
#include "common.h"
|
|||
|
|
|||
|
#include "pcbnew.h"
|
|||
|
|
|||
|
#include "bitmaps.h"
|
|||
|
#include "protos.h"
|
|||
|
#include "id.h"
|
|||
|
|
|||
|
#include "Edit_Module.xpm"
|
|||
|
#include "Rotate_Module+.xpm"
|
|||
|
#include "Move_Field.xpm"
|
|||
|
#include "Rotate_Field.xpm"
|
|||
|
#include "Move_Pad.xpm"
|
|||
|
#include "Global_Options_Pad.xpm"
|
|||
|
#include "Delete_Pad.xpm"
|
|||
|
#include "Export_Options_Pad.xpm"
|
|||
|
#include "Width_Segment.xpm"
|
|||
|
#include "Select_Layer_Pair.xpm"
|
|||
|
|
|||
|
/*************************************************************************/
|
|||
|
void WinEDA_ModuleEditFrame::OnLeftClick(wxDC * DC, const wxPoint& MousePos)
|
|||
|
/*************************************************************************/
|
|||
|
/* Traite les commandes declench<63>e par le bouton gauche de la souris,
|
|||
|
quand un outil est deja selectionn<EFBFBD>
|
|||
|
*/
|
|||
|
{
|
|||
|
EDA_BaseStruct * DrawStruct = m_CurrentScreen->m_CurrentItem;
|
|||
|
|
|||
|
DrawPanel->CursorOff(DC);
|
|||
|
if ( m_ID_current_state == 0 )
|
|||
|
{
|
|||
|
if ( DrawStruct && DrawStruct->m_Flags ) // Commande "POPUP" en cours
|
|||
|
{
|
|||
|
switch (DrawStruct->m_StructType )
|
|||
|
{
|
|||
|
case TYPETEXTEMODULE:
|
|||
|
SaveCopyInUndoList(m_Pcb->m_Modules);
|
|||
|
PlaceTexteModule( (TEXTE_MODULE *) DrawStruct, DC);
|
|||
|
break;
|
|||
|
|
|||
|
case TYPEEDGEMODULE:
|
|||
|
SaveCopyInUndoList(m_Pcb->m_Modules);
|
|||
|
Place_EdgeMod( (EDGE_MODULE *) DrawStruct, DC);
|
|||
|
break;
|
|||
|
|
|||
|
case TYPEPAD:
|
|||
|
PlacePad((D_PAD *)DrawStruct, DC);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
{
|
|||
|
wxString msg;
|
|||
|
msg.Printf(
|
|||
|
wxT("WinEDA_ModEditFrame::ProcessCommand err: m_Flags != 0\nStruct @%p, type %d m_Flag %X")
|
|||
|
, DrawStruct, DrawStruct->m_StructType, DrawStruct->m_Flags);
|
|||
|
DisplayError(this, msg);
|
|||
|
DrawStruct->m_Flags = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
DrawStruct = m_CurrentScreen->m_CurrentItem;
|
|||
|
if ( ! DrawStruct || (DrawStruct->m_Flags == 0) )
|
|||
|
{
|
|||
|
m_CurrentScreen->m_CurrentItem = DrawStruct = ModeditLocateAndDisplay();
|
|||
|
}
|
|||
|
|
|||
|
switch ( m_ID_current_state )
|
|||
|
{
|
|||
|
case 0:
|
|||
|
break;
|
|||
|
|
|||
|
case ID_NO_SELECT_BUTT:
|
|||
|
break;
|
|||
|
|
|||
|
case ID_PCB_CIRCLE_BUTT:
|
|||
|
case ID_PCB_ARC_BUTT:
|
|||
|
case ID_LINE_COMMENT_BUTT:
|
|||
|
if ( ! DrawStruct || DrawStruct->m_Flags == 0)
|
|||
|
{
|
|||
|
int shape = S_SEGMENT;
|
|||
|
if ( m_ID_current_state == ID_PCB_CIRCLE_BUTT) shape = S_CIRCLE;
|
|||
|
if ( m_ID_current_state == ID_PCB_ARC_BUTT) shape = S_ARC;
|
|||
|
|
|||
|
m_CurrentScreen->m_CurrentItem =
|
|||
|
Begin_Edge_Module((EDGE_MODULE *) NULL, DC, shape);
|
|||
|
}
|
|||
|
|
|||
|
else if ( (DrawStruct->m_Flags & IS_NEW) )
|
|||
|
{
|
|||
|
if ( ((EDGE_MODULE*)DrawStruct)->m_Shape == S_CIRCLE )
|
|||
|
{
|
|||
|
End_Edge_Module((EDGE_MODULE *) DrawStruct, DC);
|
|||
|
m_CurrentScreen->m_CurrentItem = NULL;
|
|||
|
}
|
|||
|
else if ( ((EDGE_MODULE*)DrawStruct)->m_Shape == S_ARC )
|
|||
|
{
|
|||
|
End_Edge_Module((EDGE_MODULE *) DrawStruct, DC);
|
|||
|
m_CurrentScreen->m_CurrentItem = NULL;
|
|||
|
}
|
|||
|
else if ( ((EDGE_MODULE*)DrawStruct)->m_Shape == S_SEGMENT )
|
|||
|
{
|
|||
|
m_CurrentScreen->m_CurrentItem =
|
|||
|
Begin_Edge_Module((EDGE_MODULE *) DrawStruct, DC, 0);
|
|||
|
}
|
|||
|
else DisplayError(this, wxT("ProcessCommand error: DrawStruct/ flags error"));
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case ID_MODEDIT_DELETE_ITEM_BUTT:
|
|||
|
if ( !DrawStruct || (DrawStruct->m_Flags == 0) )
|
|||
|
{
|
|||
|
DrawStruct = ModeditLocateAndDisplay();
|
|||
|
if ( DrawStruct && (DrawStruct->m_Flags == 0) )
|
|||
|
{
|
|||
|
SaveCopyInUndoList(m_Pcb->m_Modules);
|
|||
|
RemoveStruct(DrawStruct, DC);
|
|||
|
m_CurrentScreen->m_CurrentItem = DrawStruct = NULL;
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case ID_MODEDIT_PLACE_ANCHOR:
|
|||
|
SaveCopyInUndoList(m_Pcb->m_Modules);
|
|||
|
Place_Ancre(m_Pcb->m_Modules, DC);
|
|||
|
m_Pcb->m_Modules->m_Flags = 0;
|
|||
|
m_CurrentScreen->m_Curseur = wxPoint(0,0);
|
|||
|
Recadre_Trace(TRUE);
|
|||
|
Place_Module(m_Pcb->m_Modules, DC);
|
|||
|
RedrawActiveWindow(DC, TRUE);
|
|||
|
SetToolID( 0, wxCURSOR_ARROW, wxEmptyString);
|
|||
|
m_CurrentScreen->m_CurrentItem = NULL;
|
|||
|
break;
|
|||
|
|
|||
|
case ID_TEXT_COMMENT_BUTT:
|
|||
|
SaveCopyInUndoList(m_Pcb->m_Modules);
|
|||
|
CreateTextModule(m_Pcb->m_Modules, DC);
|
|||
|
break;
|
|||
|
|
|||
|
case ID_MODEDIT_ADD_PAD:
|
|||
|
if ( m_Pcb->m_Modules )
|
|||
|
{
|
|||
|
SaveCopyInUndoList(m_Pcb->m_Modules);
|
|||
|
AddPad(m_Pcb->m_Modules, DC);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
default :
|
|||
|
DrawPanel->SetCursor(wxCURSOR_ARROW);
|
|||
|
DisplayError(this, wxT("WinEDA_ModuleEditFrame::ProcessCommand error"));
|
|||
|
m_ID_current_state = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
DrawPanel->CursorOn(DC);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*********************************************************************/
|
|||
|
void WinEDA_ModuleEditFrame::OnRightClick(const wxPoint& MousePos,
|
|||
|
wxMenu * PopMenu)
|
|||
|
/*********************************************************************/
|
|||
|
/* Prepare le menu PullUp affich<63> par un click sur le bouton droit
|
|||
|
de la souris.
|
|||
|
Ce menu est ensuite compl<EFBFBD>t<EFBFBD> par la liste des commandes de ZOOM
|
|||
|
*/
|
|||
|
{
|
|||
|
EDA_BaseStruct *DrawStruct = m_CurrentScreen->m_CurrentItem;
|
|||
|
wxString msg;
|
|||
|
bool append_set_width = FALSE;
|
|||
|
bool BlockActive = (m_CurrentScreen->BlockLocate.m_Command != BLOCK_IDLE);
|
|||
|
|
|||
|
// Simple localisation des elements si possible
|
|||
|
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
|
|||
|
{
|
|||
|
m_CurrentScreen->m_CurrentItem = DrawStruct = ModeditLocateAndDisplay();
|
|||
|
}
|
|||
|
|
|||
|
// Si commande en cours: affichage fin de commande
|
|||
|
if ( m_ID_current_state )
|
|||
|
{
|
|||
|
if ( DrawStruct && DrawStruct->m_Flags )
|
|||
|
{
|
|||
|
ADD_MENUITEM(PopMenu, ID_POPUP_CANCEL_CURRENT_COMMAND,
|
|||
|
_("Cancel"), cancel_xpm);
|
|||
|
}
|
|||
|
else
|
|||
|
ADD_MENUITEM(PopMenu, ID_POPUP_CLOSE_CURRENT_TOOL,
|
|||
|
_("End Tool"), cancel_tool_xpm );
|
|||
|
PopMenu->AppendSeparator();
|
|||
|
}
|
|||
|
|
|||
|
else
|
|||
|
{
|
|||
|
if ( (DrawStruct && DrawStruct->m_Flags) || BlockActive )
|
|||
|
{
|
|||
|
if ( BlockActive ) // Put block commnands in list
|
|||
|
{
|
|||
|
ADD_MENUITEM(PopMenu, ID_POPUP_CANCEL_CURRENT_COMMAND,
|
|||
|
_("Cancel Block"), cancel_xpm );
|
|||
|
ADD_MENUITEM(PopMenu, ID_POPUP_ZOOM_BLOCK,
|
|||
|
_("Zoom Block (Midd butt drag)"), zoom_selected_xpm );
|
|||
|
PopMenu->AppendSeparator();
|
|||
|
ADD_MENUITEM(PopMenu, ID_POPUP_PLACE_BLOCK,
|
|||
|
_("Place Block"), apply_xpm );
|
|||
|
ADD_MENUITEM(PopMenu, ID_POPUP_COPY_BLOCK,
|
|||
|
_("Copy Block (shift + drag mouse)"), copyblock_xpm );
|
|||
|
ADD_MENUITEM(PopMenu, ID_POPUP_MIRROR_X_BLOCK,
|
|||
|
_("Mirror Block (alt + drag mouse)"), mirror_H_xpm );
|
|||
|
ADD_MENUITEM(PopMenu, ID_POPUP_ROTATE_BLOCK,
|
|||
|
_("Rotate Block (ctrl + drag mouse)"), rotate_pos_xpm );
|
|||
|
ADD_MENUITEM(PopMenu, ID_POPUP_DELETE_BLOCK,
|
|||
|
_("Delete Block (shift+ctrl + drag mouse)"), delete_xpm );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ADD_MENUITEM(PopMenu, ID_POPUP_CANCEL_CURRENT_COMMAND,
|
|||
|
_("Cancel"), cancel_xpm);
|
|||
|
}
|
|||
|
PopMenu->AppendSeparator();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if ( DrawStruct == NULL ) return;
|
|||
|
|
|||
|
int flags = DrawStruct->m_Flags;
|
|||
|
|
|||
|
switch ( DrawStruct->m_StructType )
|
|||
|
{
|
|||
|
case TYPEMODULE:
|
|||
|
{
|
|||
|
wxMenu * transform_choice = new wxMenu;
|
|||
|
ADD_MENUITEM(transform_choice, ID_MODEDIT_MODULE_ROTATE,
|
|||
|
_("Rotate"), rotate_module_pos_xpm);
|
|||
|
ADD_MENUITEM(transform_choice, ID_MODEDIT_MODULE_MIRROR,
|
|||
|
_("Mirror"), mirror_H_xpm);
|
|||
|
#if 0
|
|||
|
transform_choice->Append(ID_MODEDIT_MODULE_SCALE, _("Scale"));
|
|||
|
transform_choice->Append(ID_MODEDIT_MODULE_SCALE, _("Scale X"));
|
|||
|
transform_choice->Append(ID_MODEDIT_MODULE_SCALE, _("Scale Y"));
|
|||
|
#endif
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_EDIT_MODULE,
|
|||
|
_("Edit Module"), Edit_Module_xpm);
|
|||
|
ADD_MENUITEM_WITH_SUBMENU(PopMenu, transform_choice,
|
|||
|
ID_MODEDIT_TRANSFORM_MODULE,
|
|||
|
_("Transform Module"), edit_xpm);
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case TYPEPAD:
|
|||
|
if( !flags )
|
|||
|
{
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_MOVE_PAD_REQUEST,
|
|||
|
_("Move Pad"), move_pad_xpm);
|
|||
|
}
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_EDIT_PAD, _("Edit Pad"), options_pad_xpm);
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_IMPORT_PAD_SETTINGS,
|
|||
|
_("New Pad Settings"), options_new_pad_xpm);
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_EXPORT_PAD_SETTINGS,
|
|||
|
_("Export Pad Settings"), Export_Options_Pad_xpm);
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_DELETE_PAD,
|
|||
|
_("delete Pad"), Delete_Pad_xpm);
|
|||
|
if( !flags )
|
|||
|
{
|
|||
|
PopMenu->AppendSeparator();
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_GLOBAL_IMPORT_PAD_SETTINGS,
|
|||
|
_("Global Pad Settings"), global_options_pad_xpm);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case TYPETEXTEMODULE:
|
|||
|
if( !flags )
|
|||
|
{
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_MOVE_TEXTMODULE_REQUEST,
|
|||
|
_("Move Text Mod."), Move_Field_xpm );
|
|||
|
}
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_ROTATE_TEXTMODULE,
|
|||
|
_("Rotate Text Mod."), Rotate_Field_xpm);
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_EDIT_TEXTMODULE,
|
|||
|
_("Edit Text Mod."), edit_text_xpm);
|
|||
|
if ( ((TEXTE_MODULE*)DrawStruct)->m_Type == TEXT_is_DIVERS)
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_DELETE_TEXTMODULE,
|
|||
|
_("Delete Text Mod."), delete_text_xpm);
|
|||
|
break;
|
|||
|
|
|||
|
case TYPEEDGEMODULE:
|
|||
|
{
|
|||
|
if( (flags & IS_NEW) )
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_STOP_CURRENT_DRAWING,
|
|||
|
_("End edge"), apply_xpm);
|
|||
|
if( !flags )
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_MOVE_EDGE,
|
|||
|
_("Move edge"), move_line_xpm);
|
|||
|
if( (flags & (IS_NEW|IS_MOVED)) == IS_MOVED)
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_PLACE_EDGE,
|
|||
|
_("Place edge"), apply_xpm);
|
|||
|
wxMenu * edit_mnu = new wxMenu;
|
|||
|
ADD_MENUITEM_WITH_SUBMENU(PopMenu, edit_mnu,
|
|||
|
ID_POPUP_PCB_EDIT_EDGE, _("Edit"), edit_xpm);
|
|||
|
ADD_MENUITEM(edit_mnu, ID_POPUP_PCB_EDIT_WIDTH_CURRENT_EDGE,
|
|||
|
_("Edit Width (Current)"), width_segment_xpm);
|
|||
|
ADD_MENUITEM(edit_mnu, ID_POPUP_PCB_EDIT_WIDTH_ALL_EDGE,
|
|||
|
_("Edit Width (All)"), width_segment_xpm);
|
|||
|
ADD_MENUITEM(edit_mnu, ID_POPUP_PCB_EDIT_LAYER_CURRENT_EDGE,
|
|||
|
_("Edit Layer (Current)"), select_layer_pair_xpm);
|
|||
|
ADD_MENUITEM(edit_mnu, ID_POPUP_PCB_EDIT_LAYER_ALL_EDGE,
|
|||
|
_("Edit Layer (All)"), select_layer_pair_xpm);
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_DELETE_EDGE,
|
|||
|
_("Delete edge"), delete_xpm);
|
|||
|
append_set_width = TRUE;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case TYPEDRAWSEGMENT:
|
|||
|
case TYPETEXTE:
|
|||
|
case TYPEVIA:
|
|||
|
case TYPETRACK:
|
|||
|
case TYPEZONE:
|
|||
|
case TYPEMARQUEUR:
|
|||
|
case TYPECOTATION:
|
|||
|
case TYPEMIRE:
|
|||
|
break;
|
|||
|
|
|||
|
case TYPESCREEN:
|
|||
|
case TYPE_NOT_INIT:
|
|||
|
case TYPEPCB:
|
|||
|
case PCB_EQUIPOT_STRUCT_TYPE:
|
|||
|
msg.Printf(
|
|||
|
wxT("WinEDA_ModuleEditFrame::OnRightClick Error: illegal DrawType %d"),
|
|||
|
DrawStruct->m_StructType);
|
|||
|
DisplayError(this, msg );
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
msg.Printf(
|
|||
|
wxT("WinEDA_ModuleEditFrame::OnRightClick Error: unknown DrawType %d"),
|
|||
|
DrawStruct->m_StructType);
|
|||
|
DisplayError(this, msg );
|
|||
|
break;
|
|||
|
}
|
|||
|
PopMenu->AppendSeparator();
|
|||
|
|
|||
|
if ( append_set_width ||
|
|||
|
( m_ID_current_state && ((m_ID_current_state == ID_LINE_COMMENT_BUTT) ||
|
|||
|
(m_ID_current_state == ID_PCB_CIRCLE_BUTT) ||
|
|||
|
(m_ID_current_state == ID_PCB_ARC_BUTT)) ) )
|
|||
|
{
|
|||
|
ADD_MENUITEM(PopMenu,ID_POPUP_PCB_ENTER_EDGE_WIDTH,
|
|||
|
_("Set Width"), width_segment_xpm);
|
|||
|
PopMenu->AppendSeparator();
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/****************************************************************************/
|
|||
|
void WinEDA_ModuleEditFrame::OnLeftDClick(wxDC * DC, const wxPoint& MousePos)
|
|||
|
/****************************************************************************/
|
|||
|
/* Appel<65> sur un double click:
|
|||
|
pour un <EFBFBD>l<EFBFBD>ment editable (textes, composant):
|
|||
|
appel de l'editeur correspondant.
|
|||
|
*/
|
|||
|
{
|
|||
|
EDA_BaseStruct * DrawStruct = m_CurrentScreen->m_CurrentItem;
|
|||
|
wxPoint pos = GetPosition();
|
|||
|
wxClientDC dc(DrawPanel);
|
|||
|
|
|||
|
DrawPanel->PrepareGraphicContext(&dc);
|
|||
|
|
|||
|
switch ( m_ID_current_state )
|
|||
|
{
|
|||
|
case 0:
|
|||
|
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
|
|||
|
{
|
|||
|
DrawStruct = PcbGeneralLocateAndDisplay();
|
|||
|
}
|
|||
|
|
|||
|
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags != 0) )
|
|||
|
break;
|
|||
|
|
|||
|
// Element localis<69>
|
|||
|
m_CurrentScreen->m_CurrentItem = DrawStruct;
|
|||
|
switch ( DrawStruct->m_StructType )
|
|||
|
{
|
|||
|
case TYPEPAD:
|
|||
|
InstallPadOptionsFrame(
|
|||
|
(D_PAD *)DrawStruct, &dc, pos);
|
|||
|
DrawPanel->MouseToCursorSchema();
|
|||
|
break;
|
|||
|
|
|||
|
case TYPEMODULE:
|
|||
|
InstallModuleOptionsFrame((MODULE *)DrawStruct,
|
|||
|
&dc, pos);
|
|||
|
DrawPanel->MouseToCursorSchema();
|
|||
|
break;
|
|||
|
|
|||
|
case TYPETEXTEMODULE:
|
|||
|
InstallTextModOptionsFrame((TEXTE_MODULE *)DrawStruct,
|
|||
|
&dc, pos);
|
|||
|
DrawPanel->MouseToCursorSchema();
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
break; // end case 0
|
|||
|
|
|||
|
case ID_LINE_COMMENT_BUTT:
|
|||
|
{
|
|||
|
if ( DrawStruct && (DrawStruct->m_Flags & IS_NEW) )
|
|||
|
{
|
|||
|
End_Edge_Module((EDGE_MODULE *) DrawStruct, DC);
|
|||
|
m_CurrentScreen->m_CurrentItem = NULL;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|