Commit 0b9f39fa authored by jean-pierre charras's avatar jean-pierre charras

Fix 3D frame issue when iconized (Windows only).

parent 04bf11c2
......@@ -106,7 +106,7 @@ DISPLAY_FOOTPRINTS_FRAME::DISPLAY_FOOTPRINTS_FRAME( CVPCB_MAINFRAME* father,
wxAuiPaneInfo( vert ).Name( wxT( "m_VToolBar" ) ).Right() );
m_auimgr.AddPane( DrawPanel,
wxAuiPaneInfo().Name( wxT( "DrawFrame" ) ).CentrePane() );
wxAuiPaneInfo().Name( wxT( "DisplayFrame" ) ).CentrePane() );
m_auimgr.AddPane( MsgPanel,
wxAuiPaneInfo( horiz ).Name( wxT( "MsgPanel" ) ).Bottom() );
......@@ -126,7 +126,7 @@ DISPLAY_FOOTPRINTS_FRAME::~DISPLAY_FOOTPRINTS_FRAME()
delete GetScreen();
SetScreen( NULL );
( (CVPCB_MAINFRAME*) wxGetApp().GetTopWindow() )->DrawFrame = NULL;
( (CVPCB_MAINFRAME*) wxGetApp().GetTopWindow() )->m_DisplayFootprintFrame = NULL;
}
/* Called when the frame is closed
......@@ -134,12 +134,8 @@ DISPLAY_FOOTPRINTS_FRAME::~DISPLAY_FOOTPRINTS_FRAME()
*/
void DISPLAY_FOOTPRINTS_FRAME::OnCloseWindow( wxCloseEvent& event )
{
wxPoint pos;
wxSize size;
size = GetSize();
pos = GetPosition();
if( m_Draw3DFrame )
m_Draw3DFrame->Close(true);
SaveSettings();
Destroy();
}
......@@ -408,6 +404,10 @@ void DISPLAY_FOOTPRINTS_FRAME::Show3D_Frame( wxCommandEvent& event )
{
if( m_Draw3DFrame )
{
// Raising the window does not show the window on Windows if iconized.
// This should work on any platform.
if( m_Draw3DFrame->IsIconized() )
m_Draw3DFrame->Iconize( false );
m_Draw3DFrame->Raise();
// Raising the window does not set the focus on Linux. This should work on any platform.
......
......@@ -244,7 +244,7 @@ void FOOTPRINTS_LISTBOX::OnLeftClick( wxListEvent& event )
Module = GetParent()->m_footprints.GetModuleInfo( FootprintName );
wxASSERT(Module);
if( GetParent()->DrawFrame )
if( GetParent()->m_DisplayFootprintFrame )
{
GetParent()->CreateScreenCmp(); /* refresh general */
}
......
......@@ -32,83 +32,67 @@ static const wxString FootprintDocFileEntry( wxT( "footprints_doc_file" ) );
BEGIN_EVENT_TABLE( CVPCB_MAINFRAME, EDA_BASE_FRAME )
EVT_MENU_RANGE( wxID_FILE1, wxID_FILE9, CVPCB_MAINFRAME::LoadNetList )
EVT_MENU_RANGE( wxID_FILE1, wxID_FILE9, CVPCB_MAINFRAME::LoadNetList )
// Menu events
EVT_MENU( ID_LOAD_PROJECT,
// Menu events
EVT_MENU( ID_LOAD_PROJECT,
CVPCB_MAINFRAME::LoadNetList )
EVT_MENU( ID_SAVE_PROJECT,
EVT_MENU( ID_SAVE_PROJECT,
CVPCB_MAINFRAME::SaveQuitCvpcb )
EVT_MENU( wxID_EXIT,
EVT_MENU( wxID_EXIT,
CVPCB_MAINFRAME::OnQuit )
EVT_MENU( wxID_HELP,
EVT_MENU( wxID_HELP,
CVPCB_MAINFRAME::GetKicadHelp )
EVT_MENU( wxID_ABOUT,
EVT_MENU( wxID_ABOUT,
CVPCB_MAINFRAME::GetKicadAbout )
EVT_MENU( wxID_PREFERENCES,
EVT_MENU( wxID_PREFERENCES,
CVPCB_MAINFRAME::ConfigCvpcb )
EVT_MENU( ID_CONFIG_SAVE,
EVT_MENU( ID_CONFIG_SAVE,
CVPCB_MAINFRAME::Update_Config )
EVT_MENU( ID_CVPCB_CONFIG_KEEP_OPEN_ON_SAVE,
EVT_MENU( ID_CVPCB_CONFIG_KEEP_OPEN_ON_SAVE,
CVPCB_MAINFRAME::OnKeepOpenOnSave )
EVT_MENU_RANGE( ID_LANGUAGE_CHOICE,
EVT_MENU_RANGE( ID_LANGUAGE_CHOICE,
ID_LANGUAGE_CHOICE_END,
CVPCB_MAINFRAME::SetLanguage )
// Toolbar events
EVT_TOOL( ID_CVPCB_QUIT,
CVPCB_MAINFRAME::OnQuit )
EVT_TOOL( ID_CVPCB_READ_INPUT_NETLIST,
CVPCB_MAINFRAME::LoadNetList )
EVT_TOOL( ID_CVPCB_SAVEQUITCVPCB,
CVPCB_MAINFRAME::SaveQuitCvpcb )
EVT_TOOL( ID_CVPCB_CREATE_CONFIGWINDOW,
CVPCB_MAINFRAME::ConfigCvpcb )
EVT_TOOL( ID_CVPCB_CREATE_SCREENCMP,
CVPCB_MAINFRAME::DisplayModule )
EVT_TOOL( ID_CVPCB_GOTO_FIRSTNA,
CVPCB_MAINFRAME::ToFirstNA )
EVT_TOOL( ID_CVPCB_GOTO_PREVIOUSNA,
CVPCB_MAINFRAME::ToPreviousNA )
EVT_TOOL( ID_CVPCB_DEL_ASSOCIATIONS,
CVPCB_MAINFRAME::DelAssociations )
EVT_TOOL( ID_CVPCB_AUTO_ASSOCIE,
CVPCB_MAINFRAME::AssocieModule )
EVT_TOOL( ID_CVPCB_CREATE_STUFF_FILE,
CVPCB_MAINFRAME::WriteStuffList )
EVT_TOOL( ID_PCB_DISPLAY_FOOTPRINT_DOC,
CVPCB_MAINFRAME::DisplayDocFile )
EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST,
// Toolbar events
EVT_TOOL( ID_CVPCB_QUIT, CVPCB_MAINFRAME::OnQuit )
EVT_TOOL( ID_CVPCB_READ_INPUT_NETLIST, CVPCB_MAINFRAME::LoadNetList )
EVT_TOOL( ID_CVPCB_SAVEQUITCVPCB, CVPCB_MAINFRAME::SaveQuitCvpcb )
EVT_TOOL( ID_CVPCB_CREATE_CONFIGWINDOW, CVPCB_MAINFRAME::ConfigCvpcb )
EVT_TOOL( ID_CVPCB_CREATE_SCREENCMP, CVPCB_MAINFRAME::DisplayModule )
EVT_TOOL( ID_CVPCB_GOTO_FIRSTNA, CVPCB_MAINFRAME::ToFirstNA )
EVT_TOOL( ID_CVPCB_GOTO_PREVIOUSNA, CVPCB_MAINFRAME::ToPreviousNA )
EVT_TOOL( ID_CVPCB_DEL_ASSOCIATIONS, CVPCB_MAINFRAME::DelAssociations )
EVT_TOOL( ID_CVPCB_AUTO_ASSOCIE, CVPCB_MAINFRAME::AssocieModule )
EVT_TOOL( ID_CVPCB_CREATE_STUFF_FILE, CVPCB_MAINFRAME::WriteStuffList )
EVT_TOOL( ID_PCB_DISPLAY_FOOTPRINT_DOC, CVPCB_MAINFRAME::DisplayDocFile )
EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST,
CVPCB_MAINFRAME::OnSelectFilteringFootprint )
EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST,
EVT_TOOL( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST,
CVPCB_MAINFRAME::OnSelectFilteringFootprint )
// Frame events
EVT_CHAR( CVPCB_MAINFRAME::OnChar )
EVT_CLOSE( CVPCB_MAINFRAME::OnCloseWindow )
EVT_SIZE( CVPCB_MAINFRAME::OnSize )
// Frame events
EVT_CHAR( CVPCB_MAINFRAME::OnChar )
EVT_CLOSE( CVPCB_MAINFRAME::OnCloseWindow )
EVT_SIZE( CVPCB_MAINFRAME::OnSize )
// List item events
EVT_LIST_ITEM_SELECTED( ID_CVPCB_FOOTPRINT_LIST,
CVPCB_MAINFRAME::OnLeftClick )
EVT_LIST_ITEM_ACTIVATED( ID_CVPCB_FOOTPRINT_LIST,
CVPCB_MAINFRAME::OnLeftDClick )
EVT_LIST_ITEM_SELECTED( ID_CVPCB_COMPONENT_LIST,
CVPCB_MAINFRAME::OnSelectComponent )
// List item events
EVT_LIST_ITEM_SELECTED( ID_CVPCB_FOOTPRINT_LIST, CVPCB_MAINFRAME::OnLeftClick )
EVT_LIST_ITEM_ACTIVATED( ID_CVPCB_FOOTPRINT_LIST, CVPCB_MAINFRAME::OnLeftDClick )
EVT_LIST_ITEM_SELECTED( ID_CVPCB_COMPONENT_LIST, CVPCB_MAINFRAME::OnSelectComponent )
EVT_UPDATE_UI( ID_CVPCB_CONFIG_KEEP_OPEN_ON_SAVE,
EVT_UPDATE_UI( ID_CVPCB_CONFIG_KEEP_OPEN_ON_SAVE,
CVPCB_MAINFRAME::OnUpdateKeepOpenOnSave )
END_EVENT_TABLE()
CVPCB_MAINFRAME::CVPCB_MAINFRAME( const wxString& title, long style ) :
END_EVENT_TABLE() CVPCB_MAINFRAME::CVPCB_MAINFRAME( const wxString& title, long style ) :
EDA_BASE_FRAME( NULL, CVPCB_FRAME, title, wxDefaultPosition, wxDefaultSize, style )
{
m_FrameName = wxT( "CvpcbFrame" );
m_ListCmp = NULL;
m_FootprintList = NULL;
DrawFrame = NULL;
m_DisplayFootprintFrame = NULL;
m_HToolBar = NULL;
m_modified = false;
m_isEESchemaNetlist = false;
......@@ -129,7 +113,7 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( const wxString& title, long style ) :
SetIcon( wxICON( icon_cvpcb ) );
#endif
SetAutoLayout( TRUE );
SetAutoLayout( true );
LoadSettings();
if( m_FrameSize.x < FRAME_MIN_SIZE_X )
......@@ -174,7 +158,7 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( const wxString& title, long style ) :
if( m_ListCmp )
m_auimgr.AddPane( m_ListCmp,
wxAuiPaneInfo(horiz).Name( wxT( "m_ListCmp" ) ).CentrePane() );
wxAuiPaneInfo( horiz ).Name( wxT( "m_ListCmp" ) ).CentrePane() );
if( m_FootprintList )
m_auimgr.AddPane( m_FootprintList,
......@@ -245,7 +229,7 @@ void CVPCB_MAINFRAME::OnSize( wxSizeEvent& event )
void CVPCB_MAINFRAME::OnQuit( wxCommandEvent& event )
{
Close( TRUE );
Close( true );
}
......@@ -295,7 +279,7 @@ void CVPCB_MAINFRAME::OnCloseWindow( wxCloseEvent& Event )
{
if( wxGetApp().m_HtmlCtrl->GetFrame() ) // returns NULL if no help
// frame active
wxGetApp().m_HtmlCtrl->GetFrame()->Close( TRUE );
wxGetApp().m_HtmlCtrl->GetFrame()->Close( true );
}
if( m_NetlistFileName.IsOk() )
......@@ -303,6 +287,9 @@ void CVPCB_MAINFRAME::OnCloseWindow( wxCloseEvent& Event )
UpdateFileHistory( m_NetlistFileName.GetFullPath() );
}
// Close module display frame
if( m_DisplayFootprintFrame )
m_DisplayFootprintFrame->Close( true );
m_modified = false;
SaveSettings();
Destroy();
......@@ -344,8 +331,7 @@ void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event )
if( selection < 0 )
selection = 0;
BOOST_FOREACH( COMPONENT & component, m_components )
{
BOOST_FOREACH( COMPONENT & component, m_components ) {
if( component.m_Module.IsEmpty() && ii > selection )
{
m_ListCmp->SetSelection( ii );
......@@ -372,8 +358,7 @@ void CVPCB_MAINFRAME::ToPreviousNA( wxCommandEvent& event )
if( selection < 0 )
selection = m_ListCmp->GetCount() - 1;
BOOST_REVERSE_FOREACH( COMPONENT & component, m_components )
{
BOOST_REVERSE_FOREACH( COMPONENT & component, m_components ) {
if( component.m_Module.IsEmpty() && ii < selection )
{
m_ListCmp->SetSelection( ii );
......@@ -391,7 +376,7 @@ void CVPCB_MAINFRAME::SaveQuitCvpcb( wxCommandEvent& event )
{
m_modified = false;
if( !m_KeepCvpcbOpen )
Close( TRUE );
Close( true );
}
}
......@@ -407,8 +392,7 @@ void CVPCB_MAINFRAME::DelAssociations( wxCommandEvent& event )
{
m_ListCmp->SetSelection( 0 );
BOOST_FOREACH( COMPONENT & component, m_components )
{
BOOST_FOREACH( COMPONENT & component, m_components ) {
component.m_Module.Empty();
SetNewPkg( wxEmptyString );
}
......@@ -488,7 +472,7 @@ void CVPCB_MAINFRAME::OnKeepOpenOnSave( wxCommandEvent& event )
void CVPCB_MAINFRAME::DisplayModule( wxCommandEvent& event )
{
CreateScreenCmp();
DrawFrame->RedrawScreen( wxPoint( 0, 0 ), false );
m_DisplayFootprintFrame->RedrawScreen( wxPoint( 0, 0 ), false );
}
......@@ -526,20 +510,20 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
if( !m_HToolBar->GetToolState( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST ) )
{
m_FootprintList->SetActiveFootprintList( TRUE, TRUE );
m_FootprintList->SetActiveFootprintList( true, true );
return;
}
selection = m_ListCmp->GetSelection();
if( selection < 0 )
{
m_FootprintList->SetActiveFootprintList( TRUE, TRUE );
m_FootprintList->SetActiveFootprintList( true, true );
return;
}
if( &m_components[ selection ] == NULL )
{
m_FootprintList->SetActiveFootprintList( TRUE, TRUE );
m_FootprintList->SetActiveFootprintList( true, true );
return;
}
......@@ -553,17 +537,20 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
*/
void CVPCB_MAINFRAME::OnSelectFilteringFootprint( wxCommandEvent& event )
{
switch (event.GetId() )
switch( event.GetId() )
{
case ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST:
m_HToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST, false );
break;
case ID_CVPCB_FOOTPRINT_DISPLAY_FULL_LIST:
m_HToolBar->ToggleTool( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST, false );
break;
default:
break;
}
wxListEvent l_event;
OnSelectComponent( l_event );
......@@ -582,6 +569,7 @@ void CVPCB_MAINFRAME::OnUpdateKeepOpenOnSave( wxUpdateUIEvent& event )
void CVPCB_MAINFRAME::DisplayStatus()
{
wxString msg;
msg.Printf( _( "Components: %d (free: %d)" ),
m_components.size(), m_undefinedComponentCnt );
SetStatusText( msg, 0 );
......@@ -602,6 +590,7 @@ void CVPCB_MAINFRAME::DisplayStatus()
SetStatusText( msg, 2 );
}
/*
* Read the list of libraries (*.mod files) and populates m_footprints
* ( list of availaible modules in libs ).
......@@ -610,7 +599,7 @@ void CVPCB_MAINFRAME::DisplayStatus()
* documentation string
* associated keywords
*/
bool CVPCB_MAINFRAME::LoadFootprintFiles( )
bool CVPCB_MAINFRAME::LoadFootprintFiles()
{
/* Check if there are footprint libraries in project file */
if( m_ModuleLibNames.GetCount() == 0 )
......@@ -620,24 +609,24 @@ bool CVPCB_MAINFRAME::LoadFootprintFiles( )
return false;
}
m_footprints.ReadFootprintFiles(m_ModuleLibNames);
m_footprints.ReadFootprintFiles( m_ModuleLibNames );
/* Display error messages, if any */
if( !m_footprints.m_filesNotFound.IsEmpty() || !m_footprints.m_filesInvalid.IsEmpty() )
{
DIALOG_LOAD_ERROR dialog(NULL);
DIALOG_LOAD_ERROR dialog( NULL );
if( !m_footprints.m_filesNotFound.IsEmpty() )
{
wxString message = _("Some files could not be found!");
dialog.MessageSet(message);
dialog.ListSet(m_footprints.m_filesNotFound);
wxString message = _( "Some files could not be found!" );
dialog.MessageSet( message );
dialog.ListSet( m_footprints.m_filesNotFound );
}
/* Display if there are invalid files */
if( !m_footprints.m_filesInvalid.IsEmpty() )
{
dialog.MessageSet( _("Some files are invalid!"));
dialog.ListSet(m_footprints.m_filesInvalid);
dialog.MessageSet( _( "Some files are invalid!" ) );
dialog.ListSet( m_footprints.m_filesInvalid );
}
dialog.ShowModal();
}
......
......@@ -17,7 +17,6 @@ class COMPONENTS_LISTBOX;
class DISPLAY_FOOTPRINTS_FRAME;
/**
* The CVPcb application main window.
*/
......@@ -28,7 +27,7 @@ public:
bool m_KeepCvpcbOpen;
FOOTPRINTS_LISTBOX* m_FootprintList;
COMPONENTS_LISTBOX* m_ListCmp;
DISPLAY_FOOTPRINTS_FRAME* DrawFrame;
DISPLAY_FOOTPRINTS_FRAME* m_DisplayFootprintFrame;
EDA_TOOLBAR* m_HToolBar;
wxFileName m_NetlistFileName;
wxArrayString m_ModuleLibNames;
......@@ -45,8 +44,7 @@ protected:
bool m_isEESchemaNetlist;
PARAM_CFG_ARRAY m_projectFileParams;
public:
CVPCB_MAINFRAME( const wxString& title,
public: CVPCB_MAINFRAME( const wxString& title,
long style = KICAD_DEFAULT_DRAWFRAME_STYLE );
~CVPCB_MAINFRAME();
......@@ -108,7 +106,7 @@ public:
* fills m_footprints
* @return true if libraries are found, false otherwise.
*/
bool LoadFootprintFiles( );
bool LoadFootprintFiles();
/**
* function GenNetlistPcbnew
......
......@@ -31,28 +31,32 @@ void CVPCB_MAINFRAME::CreateScreenCmp()
FootprintName = m_FootprintList->GetSelectedFootprint();
if( DrawFrame == NULL )
if( m_DisplayFootprintFrame == NULL )
{
DrawFrame = new DISPLAY_FOOTPRINTS_FRAME( this, _( "Module" ),
m_DisplayFootprintFrame = new DISPLAY_FOOTPRINTS_FRAME( this, _( "Module" ),
wxPoint( 0, 0 ),
wxSize( 600, 400 ),
KICAD_DEFAULT_DRAWFRAME_STYLE );
IsNew = true;
DrawFrame->Show( true );
m_DisplayFootprintFrame->Show( true );
}
else
{
DrawFrame->Raise();
// Raising the window does not show the window on Windows if iconized.
// This should work on any platform.
if( m_DisplayFootprintFrame->IsIconized() )
m_DisplayFootprintFrame->Iconize( false );
m_DisplayFootprintFrame->Raise();
// Raising the window does not set the focus on Linux. This should work on any platform.
if( wxWindow::FindFocus() != DrawFrame )
DrawFrame->SetFocus();
if( wxWindow::FindFocus() != m_DisplayFootprintFrame )
m_DisplayFootprintFrame->SetFocus();
}
if( !FootprintName.IsEmpty() )
{
msg = _( "Footprint: " ) + FootprintName;
DrawFrame->SetTitle( msg );
m_DisplayFootprintFrame->SetTitle( msg );
FOOTPRINT_INFO* Module = m_footprints.GetModuleInfo( FootprintName );
msg = _( "Lib: " );
......@@ -61,32 +65,32 @@ void CVPCB_MAINFRAME::CreateScreenCmp()
else
msg += wxT( "???" );
DrawFrame->SetStatusText( msg, 0 );
m_DisplayFootprintFrame->SetStatusText( msg, 0 );
if( DrawFrame->GetBoard()->m_Modules.GetCount() )
if( m_DisplayFootprintFrame->GetBoard()->m_Modules.GetCount() )
{
// there is only one module in the list
DrawFrame->GetBoard()->m_Modules.DeleteAll();
m_DisplayFootprintFrame->GetBoard()->m_Modules.DeleteAll();
}
MODULE* mod = DrawFrame->Get_Module( FootprintName );
MODULE* mod = m_DisplayFootprintFrame->Get_Module( FootprintName );
if( mod )
DrawFrame->GetBoard()->m_Modules.PushBack( mod );
m_DisplayFootprintFrame->GetBoard()->m_Modules.PushBack( mod );
DrawFrame->Zoom_Automatique( false );
DrawFrame->DrawPanel->Refresh();
DrawFrame->UpdateStatusBar(); /* Display new cursor coordinates and zoom value */
m_DisplayFootprintFrame->Zoom_Automatique( false );
m_DisplayFootprintFrame->DrawPanel->Refresh();
m_DisplayFootprintFrame->UpdateStatusBar(); /* Display new cursor coordinates and zoom value */
if( DrawFrame->m_Draw3DFrame )
DrawFrame->m_Draw3DFrame->NewDisplay();
if( m_DisplayFootprintFrame->m_Draw3DFrame )
m_DisplayFootprintFrame->m_Draw3DFrame->NewDisplay();
}
else if( !IsNew )
{
DrawFrame->Refresh();
m_DisplayFootprintFrame->Refresh();
if( DrawFrame->m_Draw3DFrame )
DrawFrame->m_Draw3DFrame->NewDisplay();
if( m_DisplayFootprintFrame->m_Draw3DFrame )
m_DisplayFootprintFrame->m_Draw3DFrame->NewDisplay();
}
}
......
......@@ -168,6 +168,8 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
}
else
{
if( m_ModuleEditFrame->IsIconized() )
m_ModuleEditFrame->Iconize( false );
m_ModuleEditFrame->Raise();
// Raising the window does not set the focus on Linux. This should work on
......
......@@ -325,6 +325,10 @@ void WinEDA_ModuleEditFrame::Show3D_Frame( wxCommandEvent& event )
{
if( m_Draw3DFrame )
{
// Raising the window does not show the window on Windows if iconized.
// This should work on any platform.
if( m_Draw3DFrame->IsIconized() )
m_Draw3DFrame->Iconize( false );
m_Draw3DFrame->Raise();
// Raising the window does not set the focus on Linux. This should work on any platform.
......
......@@ -483,6 +483,10 @@ void PCB_EDIT_FRAME::Show3D_Frame( wxCommandEvent& event )
{
if( m_Draw3DFrame )
{
// Raising the window does not show the window on Windows if iconized.
// This should work on any platform.
if( m_Draw3DFrame->IsIconized() )
m_Draw3DFrame->Iconize( false );
m_Draw3DFrame->Raise();
// Raising the window does not set the focus on Linux. This should work on any platform.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment