EESchema find dialog improvements.

* Add option to disable warping mouse to item found.
* Add code to warp mouse when dialog is closed.
This commit is contained in:
Wayne Stambaugh 2011-02-03 16:57:02 -05:00
parent 50f063da07
commit 828790017b
7 changed files with 132 additions and 51 deletions

View File

@ -93,7 +93,7 @@
<property name="name">leftSizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<object class="sizeritem" expanded="1">
<property name="border">6</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">0</property>
@ -921,6 +921,63 @@
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">6</property>
<property name="flag">wxBOTTOM|wxLEFT|wxRIGHT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="1">
<property name="bg"></property>
<property name="checked">0</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Do not warp cursor to found item</property>
<property name="maximum_size"></property>
<property name="minimum_size"></property>
<property name="name">m_checkNoWarpCursor</property>
<property name="permission">protected</property>
<property name="pos"></property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnCheckBox"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="1">

View File

@ -25,6 +25,7 @@ DIALOG_SCH_FIND::DIALOG_SCH_FIND( wxWindow* aParent, wxFindReplaceData* aData,
m_radioBackward->SetValue( ( flags & wxFR_DOWN ) == 0 );
m_checkMatchCase->SetValue( flags & wxFR_MATCHCASE );
m_checkWholeWord->SetValue( flags & wxFR_WHOLEWORD );
m_checkNoWarpCursor->SetValue( flags & FR_NO_WARP_CURSOR );
/* Whole word and wild card searches are mutually exclusive. */
if( !( flags & wxFR_WHOLEWORD ) )
@ -131,6 +132,9 @@ void DIALOG_SCH_FIND::SendEvent( const wxEventType& aEventType )
if( m_checkCurrentSheetOnly->GetValue() )
flags |= FR_CURRENT_SHEET_ONLY;
if( m_checkNoWarpCursor->GetValue() )
flags |= FR_NO_WARP_CURSOR;
m_findReplaceData->SetFindString( event.GetFindString() );
if( HasFlag( wxFR_REPLACEDIALOG )

View File

@ -38,7 +38,10 @@ enum SchematicFindReplaceFlags
FR_MATCH_WILDCARD = wxFR_MATCHCASE << 4,
/* Wrap around the beginning or end of search list. */
FR_SEARCH_WRAP = wxFR_MATCHCASE << 5
FR_SEARCH_WRAP = wxFR_MATCHCASE << 5,
/* Don't warp cursor to found item until the dialog is closed. */
FR_NO_WARP_CURSOR = wxFR_MATCHCASE << 6
};

View File

@ -89,6 +89,9 @@ DIALOG_SCH_FIND_BASE::DIALOG_SCH_FIND_BASE( wxWindow* parent, wxWindowID id, con
m_checkCurrentSheetOnly = new wxCheckBox( this, wxID_ANY, _("Search the current sheet on&ly"), wxDefaultPosition, wxDefaultSize, 0 );
leftSizer->Add( m_checkCurrentSheetOnly, 0, wxBOTTOM|wxLEFT|wxRIGHT, 6 );
m_checkNoWarpCursor = new wxCheckBox( this, wxID_ANY, _("Do not warp cursor to found item"), wxDefaultPosition, wxDefaultSize, 0 );
leftSizer->Add( m_checkNoWarpCursor, 0, wxBOTTOM|wxLEFT|wxRIGHT, 6 );
mainSizer->Add( leftSizer, 1, wxALL|wxEXPAND, 6 );
wxBoxSizer* rightSizer;

View File

@ -48,6 +48,7 @@ class DIALOG_SCH_FIND_BASE : public wxDialog
wxCheckBox* m_checkAllFields;
wxCheckBox* m_checkAllPins;
wxCheckBox* m_checkCurrentSheetOnly;
wxCheckBox* m_checkNoWarpCursor;
wxButton* m_buttonFind;
wxButton* m_buttonReplace;
wxButton* m_buttonReplaceAll;

View File

@ -42,12 +42,13 @@ void SCH_EDIT_FRAME::OnFindDrcMarker( wxFindDialogEvent& event )
SCH_SHEET_PATH* sheetFoundIn = NULL;
bool wrap = ( event.GetFlags() & FR_SEARCH_WRAP ) != 0;
wxRect clientRect( wxPoint( 0, 0 ), GetClientSize() );
bool warpCursor = ( ( event.GetId() == wxEVT_COMMAND_FIND_CLOSE ) ||
!( event.GetFlags() & FR_NO_WARP_CURSOR ) );
if( event.GetFlags() & FR_CURRENT_SHEET_ONLY )
{
sheetFoundIn = m_CurrentSheet;
lastMarker = (SCH_MARKER*) m_CurrentSheet->FindNextItem( SCH_MARKER_T,
lastMarker, wrap );
lastMarker = (SCH_MARKER*) m_CurrentSheet->FindNextItem( SCH_MARKER_T, lastMarker, wrap );
}
else
{
@ -66,7 +67,7 @@ void SCH_EDIT_FRAME::OnFindDrcMarker( wxFindDialogEvent& event )
sheetFoundIn->LastScreen()->m_Curseur = lastMarker->m_Pos;
RedrawScreen( TRUE );
RedrawScreen( warpCursor );
wxString path = sheetFoundIn->Path();
wxString units = GetAbbreviatedUnitsLabel();
@ -109,69 +110,71 @@ SCH_ITEM* SCH_EDIT_FRAME::FindComponentAndItem( const wxString& component_refere
SCH_COMPONENT* Component = NULL;
wxSize DrawAreaSize = DrawPanel->GetClientSize();
wxPoint pos, curpos;
bool DoCenterAndRedraw = FALSE;
bool DoCenterAndRedraw = false;
bool NotFound = true;
wxString msg;
LIB_PIN* pin;
SCH_SHEET_LIST SheetList;
sheet = SheetList.GetFirst();
if( !Find_in_hierarchy )
sheet = m_CurrentSheet;
for( ; sheet != NULL; sheet = SheetList.GetNext() )
{
DrawList = (SCH_ITEM*) sheet->LastDrawList();
for( ; ( DrawList != NULL ) && ( NotFound == true );
DrawList = DrawList->Next() )
for( ; ( DrawList != NULL ) && ( NotFound == true ); DrawList = DrawList->Next() )
{
if( DrawList->Type() == SCH_COMPONENT_T )
if( DrawList->Type() != SCH_COMPONENT_T )
continue;
SCH_COMPONENT* pSch = (SCH_COMPONENT*) DrawList;
if( component_reference.CmpNoCase( pSch->GetRef( sheet ) ) == 0 )
{
SCH_COMPONENT* pSch;
pSch = (SCH_COMPONENT*) DrawList;
if( component_reference.CmpNoCase( pSch->GetRef( sheet ) ) == 0 )
Component = pSch;
SheetWithComponentFound = sheet;
switch( SearchType )
{
Component = pSch;
SheetWithComponentFound = sheet;
default:
case 0: // Find component only
NotFound = false;
pos = pSch->m_Pos;
break;
switch( SearchType )
{
default:
case 0: // Find component only
NotFound = FALSE;
pos = pSch->m_Pos;
case 1: // find a pin
pos = pSch->m_Pos; /* temporary: will be changed if the pin is found */
pin = pSch->GetPin( text_to_find );
if( pin == NULL )
break;
case 1: // find a pin
pos = pSch->m_Pos; /* temporary: will be changed if
* the pin is found */
pin = pSch->GetPin( text_to_find );
NotFound = false;
pos += pin->GetPosition();
break;
if( pin == NULL )
break;
case 2: // find reference
NotFound = false;
pos = pSch->GetField( REFERENCE )->m_Pos;
break;
NotFound = FALSE;
pos += pin->GetPosition();
case 3: // find value
pos = pSch->m_Pos;
if( text_to_find.CmpNoCase( pSch->GetField( VALUE )->m_Text ) != 0 )
break;
case 2: // find reference
NotFound = FALSE;
pos = pSch->GetField( REFERENCE )->m_Pos;
break;
case 3: // find value
pos = pSch->m_Pos;
if( text_to_find.CmpNoCase( pSch->GetField( VALUE )->m_Text ) != 0 )
break;
NotFound = FALSE;
pos = pSch->GetField( VALUE )->m_Pos;
break;
}
NotFound = false;
pos = pSch->GetField( VALUE )->m_Pos;
break;
}
}
}
if( (Find_in_hierarchy == FALSE) || (NotFound == FALSE) )
if( (Find_in_hierarchy == false) || (NotFound == false) )
break;
}
@ -184,8 +187,9 @@ SCH_ITEM* SCH_EDIT_FRAME::FindComponentAndItem( const wxString& component_refere
sheet->LastScreen()->SetZoom( GetScreen()->GetZoom() );
*m_CurrentSheet = *sheet;
m_CurrentSheet->UpdateAllScreenReferences();
DoCenterAndRedraw = TRUE;
DoCenterAndRedraw = true;
}
wxPoint delta;
pos -= Component->m_Pos;
delta = Component->GetTransform().TransformCoordinate( pos );
@ -196,9 +200,8 @@ SCH_ITEM* SCH_EDIT_FRAME::FindComponentAndItem( const wxString& component_refere
curpos = DrawPanel->CursorScreenPosition();
DrawPanel->GetViewStart(
&( GetScreen()->m_StartVisu.x ),
&( GetScreen()->m_StartVisu.y ) );
DrawPanel->GetViewStart( &( GetScreen()->m_StartVisu.x ),
&( GetScreen()->m_StartVisu.y ) );
// Calculating cursor position with original screen.
curpos -= GetScreen()->m_StartVisu;
@ -299,18 +302,24 @@ void SCH_EDIT_FRAME::OnFindSchematicItem( wxFindDialogEvent& event )
* note: the actual matched item can be a
* part of lastItem (for instance a field in a component
*/
static wxPoint lastItemPosition; // the actual position of the matched sub item
static wxPoint lastItemPosition; // the actual position of the matched sub item
SCH_SHEET_LIST schematic;
wxString msg;
SCH_SHEET_PATH* sheetFoundIn = NULL;
wxFindReplaceData searchCriteria;
bool warpCursor = !( event.GetFlags() & FR_NO_WARP_CURSOR );
searchCriteria.SetFlags( event.GetFlags() );
searchCriteria.SetFindString( event.GetFindString() );
searchCriteria.SetReplaceString( event.GetReplaceString() );
if( event.GetFlags() & FR_CURRENT_SHEET_ONLY && g_RootSheet->CountSheets() > 1 )
if( event.GetEventType() == wxEVT_COMMAND_FIND_CLOSE )
{
sheetFoundIn = m_CurrentSheet;
warpCursor = true;
}
else if( event.GetFlags() & FR_CURRENT_SHEET_ONLY && g_RootSheet->CountSheets() > 1 )
{
sheetFoundIn = m_CurrentSheet;
lastItem = m_CurrentSheet->MatchNextItem( searchCriteria, lastItem, &lastItemPosition );
@ -330,9 +339,9 @@ void SCH_EDIT_FRAME::OnFindSchematicItem( wxFindDialogEvent& event )
m_CurrentSheet->UpdateAllScreenReferences();
}
// sheetFoundIn->LastScreen()->m_Curseur = lastItem->GetBoundingBox().Centre();
sheetFoundIn->LastScreen()->m_Curseur = lastItemPosition;
RedrawScreen( true );
RedrawScreen( warpCursor );
msg = event.GetFindString() + _( " found in " ) + sheetFoundIn->PathHumanReadable();
SetStatusText( msg );

View File

@ -609,6 +609,10 @@ void SCH_EDIT_FRAME::OnFindItems( wxCommandEvent& event )
void SCH_EDIT_FRAME::OnFindDialogClose( wxFindDialogEvent& event )
{
// If the user dismissed the dialog with the mouse, this will send the cursor back
// to the last item found.
OnFindSchematicItem( event );
if( m_dlgFindReplace )
{
m_findDialogPosition = m_dlgFindReplace->GetPosition();
@ -619,7 +623,7 @@ void SCH_EDIT_FRAME::OnFindDialogClose( wxFindDialogEvent& event )
m_dlgFindReplace = NULL;
}
this->DrawPanel->m_IgnoreMouseEvents = FALSE;
DrawPanel->m_IgnoreMouseEvents = false;
}