void XDebugManager::OnGotFocusFromXDebug(XDebugEvent& e) { e.Skip(); // Make sure codelite is "Raised" wxFrame* frame = EventNotifier::Get()->TopFrame(); if ( frame->IsIconized() || !frame->IsShown() ) { frame->Raise(); } CL_DEBUG("CodeLite: opening file %s:%d", e.GetFileName(), e.GetLineNumber()+1 ); // The user sees the line number from 1 (while scintilla counts them from 0) // Mark the debugger line / file IEditor *editor = m_plugin->GetManager()->FindEditor( e.GetFileName() ); if ( !editor && wxFileName::Exists(e.GetFileName()) ) { // Try to open the editor if ( m_plugin->GetManager()->OpenFile(e.GetFileName(), "", e.GetLineNumber()) ) { editor = m_plugin->GetManager()->GetActiveEditor(); } } if ( editor ) { m_plugin->GetManager()->SelectPage( editor->GetSTC() ); SetDebuggerMarker( editor->GetSTC(), e.GetLineNumber() ); } // Update the callstack/locals views DoRefreshDebuggerViews(); // Re-apply any new breakpoints DoApplyBreakpoints(); }
void ZoomNavigator::OnPreviewClicked(wxMouseEvent& e) { IEditor *curEditor = m_mgr->GetActiveEditor(); // user clicked on the preview CHECK_CONDITION(m_startupCompleted); CHECK_CONDITION(curEditor); CHECK_CONDITION(m_enabled); // the first line is taken from the preview int pos = m_text->PositionFromPoint(e.GetPosition()); if ( pos == wxSTC_INVALID_POSITION ) { return; } int first = m_text->LineFromPosition( pos ); int nLinesOnScreen = curEditor->GetSTC()->LinesOnScreen(); first -= (nLinesOnScreen/2); if ( first < 0 ) first = 0; // however, the last line is set according to the actual editor int last = nLinesOnScreen + first; PatchUpHighlights( first, last ); curEditor->GetSTC()->SetFirstVisibleLine( first ); curEditor->SetCaretAt( curEditor->PosFromLine( first + (nLinesOnScreen / 2) ) ) ; // reset the from/last members to avoid unwanted movements in the 'OnTimer' function m_markerFirstLine = curEditor->GetSTC()->GetFirstVisibleLine(); m_markerLastLine = m_markerFirstLine + curEditor->GetSTC()->LinesOnScreen(); }
void LLDBPlugin::OnToggleBreakpoint(clDebugEvent& event) { // Call Skip() here since we want codelite to manage the breakpoint as well ( in term of serilization in the session // file ) CHECK_IS_LLDB_SESSION(); // check to see if we are removing a breakpoint or adding one LLDBBreakpoint::Ptr_t bp(new LLDBBreakpoint(event.GetFileName(), event.GetInt())); IEditor* editor = m_mgr->GetActiveEditor(); if(editor) { // get the marker type set on the line int markerType = editor->GetSTC()->MarkerGet(bp->GetLineNumber() - 1); for(size_t type = smt_FIRST_BP_TYPE; type <= smt_LAST_BP_TYPE; ++type) { int markerMask = (1 << type); if(markerType & markerMask) { // removing a breakpoint. "DeleteBreakpoint" will handle the interactive/non-interactive mode // of the debugger m_connector.MarkBreakpointForDeletion(bp); m_connector.DeleteBreakpoints(); return; } } // if we got here, its a new breakpoint, add it // Add the breakpoint to the list of breakpoints m_connector.AddBreakpoint(bp->GetFilename(), bp->GetLineNumber()); // apply it. In case the debugger can not interact with, it will be interrupted and the interrupt reason // will be set to ApplyBreakpoints m_connector.ApplyBreakpoints(); } }
void OutlineTab::OnFilesTagged(wxCommandEvent& e) { e.Skip(); IEditor* editor = m_mgr->GetActiveEditor(); if( editor ) { m_tree->BuildTree( editor->GetFileName() ); if(editor->GetSTC()) { // make sure we dont steal the focus from the editor... editor->GetSTC()->SetFocus(); } } else { m_tree->Clear(); } }
void wxCodeCompletionBoxManager::InsertSelectionTemplateFunction(const wxString& selection) { IManager* manager = ::clGetManager(); IEditor* editor = manager->GetActiveEditor(); if(editor) { wxStyledTextCtrl* ctrl = editor->GetSTC(); // Default behviour: remove the partial text from teh editor and replace it // with the selection int start = ctrl->WordStartPosition(ctrl->GetCurrentPos(), true); int end = ctrl->GetCurrentPos(); ctrl->SetSelection(start, end); wxString entryText = selection; if(entryText.Find("(") != wxNOT_FOUND) { // a function like wxString textToInsert = entryText.BeforeFirst('('); textToInsert << "<>()"; ctrl->ReplaceSelection(textToInsert); // Place the caret between the angle brackets int caretPos = start + textToInsert.Len() - 3; ctrl->SetCurrentPos(caretPos); ctrl->SetSelection(caretPos, caretPos); } else { ctrl->ReplaceSelection(entryText); } } }
void ZoomNavigator::DoUpdate() { // sanity tests CHECK_CONDITION( m_enabled ); CHECK_CONDITION( !m_mgr->IsShutdownInProgress() ); IEditor* curEditor = m_mgr->GetActiveEditor(); if ( !curEditor && !m_text->IsEmpty()) { DoCleanup(); } CHECK_CONDITION(curEditor); wxStyledTextCtrl* stc = curEditor->GetSTC(); CHECK_CONDITION( stc ); if ( curEditor->GetFileName().GetFullPath() != m_curfile ) { SetEditorText( curEditor ); } int first = stc->GetFirstVisibleLine(); int last = stc->LinesOnScreen()+first; if ( m_markerFirstLine != first || m_markerLastLine != last ) { PatchUpHighlights( first, last ); SetZoomTextScrollPosToMiddle( stc ); } }
void LLDBDebuggerPlugin::OnLLDBStopped(LLDBEvent& event) { event.Skip(); wxFileName fn( event.GetFileName() ); CL_DEBUG(wxString() << "CODELITE>> LLDB stopped at " << event.GetFileName() << ":" << event.GetLinenumber() ); if ( fn.FileExists() ) { if ( m_mgr->OpenFile( fn.GetFullPath(), "", event.GetLinenumber() ) ) { IEditor* editor = m_mgr->GetActiveEditor(); if ( editor ) { editor->GetSTC()->ScrollToLine( event.GetLinenumber() ); } } } }
void XDebugManager::OnDeleteBreakpoint(PHPEvent& e) { e.Skip(); wxString filename = e.GetFileName(); int line = e.GetLineNumber(); int bpid = e.GetInt(); if ( bpid != wxNOT_FOUND ) { // breakpoint was applied DoDeleteBreakpoint(bpid); } IEditor * editor = m_plugin->GetManager()->FindEditor( filename ); if ( editor ) { editor->GetSTC()->MarkerDelete(line-1, smt_breakpoint); } m_breakpointsMgr.DeleteBreakpoint(filename, line); }
void wxCodeCompletionBoxManager::InsertSelection(const wxString& selection) { IManager* manager = ::clGetManager(); IEditor* editor = manager->GetActiveEditor(); if(editor) { wxStyledTextCtrl* ctrl = editor->GetSTC(); // Default behviour: remove the partial text from teh editor and replace it // with the selection int start = ctrl->WordStartPosition(ctrl->GetCurrentPos(), true); int end = ctrl->GetCurrentPos(); ctrl->SetSelection(start, end); wxString entryText = selection; if(entryText.Find("(") != wxNOT_FOUND) { // a function like wxString textToInsert = entryText.BeforeFirst('('); // Build the function signature wxString funcSig = entryText.AfterFirst('('); funcSig = funcSig.BeforeLast(')'); funcSig.Trim().Trim(false); CL_DEBUG("Inserting selection: %s", textToInsert); CL_DEBUG("Signature is: %s", funcSig); textToInsert << "()"; ctrl->ReplaceSelection(textToInsert); if(!funcSig.IsEmpty()) { // Place the caret between the parenthesis int caretPos = start + textToInsert.Len() - 1; ctrl->SetCurrentPos(caretPos); ctrl->SetSelection(caretPos, caretPos); // trigger a code complete for function calltip. // We do this by simply mimicing the user action of going to the menubar: // Edit->Display Function Calltip wxCommandEvent event(wxEVT_MENU, XRCID("function_call_tip")); wxTheApp->GetTopWindow()->GetEventHandler()->AddPendingEvent(event); } } else { ctrl->ReplaceSelection(entryText); } } }
void clAuiMainNotebookTabArt::DoSetColours() { // Set the colours // based on the selected book theme if(!m_bgColour.IsOk()) { DoInitializeColoursFromTheme(); } // If we have an active editor, update the colours, if not - keep the old ones IEditor* editor = m_manager->GetActiveEditor(); // We use the colour theme based on the active editor if(editor) { // Change lightness ranges between 0-200 // 0 would be completely black, 200 completely white an ialpha of 100 returns the same colour. m_activeTabBgColour = editor->GetSTC()->StyleGetBackground(0); if(DrawingUtils::IsDark(m_activeTabBgColour)) { // adjust some colours m_activeTabTextColour = *wxWHITE; m_tabTextColour = *wxWHITE; m_activeTabPenColour = m_activeTabBgColour.ChangeLightness(80); m_tabBgColour = m_activeTabBgColour.ChangeLightness(110); #ifdef __WXMAC__ m_bgColour = m_activeTabBgColour.ChangeLightness(150); #else m_bgColour = m_activeTabBgColour.ChangeLightness(130); #endif m_penColour = m_activeTabPenColour.ChangeLightness(110); m_innerPenColour = m_penColour.ChangeLightness(115); } else { wxColour tmp = m_activeTabBgColour; DoInitializeColoursFromTheme(); m_activeTabBgColour = tmp; } } }
void LLDBPlugin::OnLLDBStopped(LLDBEvent& event) { event.Skip(); CL_DEBUGS(wxString() << "CODELITE>> LLDB stopped at " << event.GetFileName() << ":" << event.GetLinenumber()); m_connector.SetCanInteract(true); if(event.GetInterruptReason() == kInterruptReasonNone) { if(m_raisOnBpHit) { EventNotifier::Get()->TopFrame()->Raise(); } // Mark the debugger line / file IEditor* editor = m_mgr->FindEditor(event.GetFileName()); if(!editor && wxFileName::Exists(event.GetFileName())) { // Try to open the editor if(m_mgr->OpenFile(event.GetFileName(), "", event.GetLinenumber() - 1)) { editor = m_mgr->GetActiveEditor(); } } if(editor) { // select it first if(editor != m_mgr->GetActiveEditor()) { m_mgr->SelectPage(editor->GetSTC()); } else { // just make sure that the page has the focus editor->SetActive(); } // clear the markers ClearDebuggerMarker(); SetDebuggerMarker(editor->GetSTC(), event.GetLinenumber() - 1); } else { ClearDebuggerMarker(); } // request for local variables m_connector.RequestLocals(); wxString message; if(!m_stopReasonPrompted && event.ShouldPromptStopReason(message)) { m_stopReasonPrompted = true; // show this message only once per debug session wxString msg; msg << "Program stopped\nStop reason: " << message; ::wxMessageBox(msg, "CodeLite", wxICON_ERROR | wxOK | wxCENTER); } } else if(event.GetInterruptReason() == kInterruptReasonApplyBreakpoints) { CL_DEBUG("Applying breakpoints and continue..."); m_connector.ApplyBreakpoints(); m_connector.Continue(); } else if(event.GetInterruptReason() == kInterruptReasonDeleteAllBreakpoints) { CL_DEBUG("Deleting all breakpoints"); m_connector.DeleteAllBreakpoints(); m_connector.Continue(); } else if(event.GetInterruptReason() == kInterruptReasonDeleteBreakpoint) { CL_DEBUG("Deleting all pending deletion breakpoints"); m_connector.DeleteBreakpoints(); m_connector.Continue(); } else if(event.GetInterruptReason() == kInterruptReasonDetaching) { CL_DEBUG("Detaching from process"); m_connector.Detach(); } }
wxCodeCompletionBox::wxCodeCompletionBox(wxWindow* parent, wxEvtHandler* eventObject, size_t flags) : wxCodeCompletionBoxBase(parent) , m_index(0) , m_stc(NULL) , m_startPos(wxNOT_FOUND) , m_useLightColours(false) , m_eventObject(eventObject) , m_tipWindow(NULL) , m_flags(flags) { m_ccFont = DrawingUtils::GetDefaultFixedFont(); SetCursor(wxCURSOR_HAND); // Calculate the size of the box int singleLineHeight = GetSingleLineHeight(); int boxHeight = singleLineHeight * LINES_PER_PAGE; int boxWidth = BOX_WIDTH; // 100 pixels wxSize boxSize = wxSize(boxWidth, boxHeight); wxRect rect(boxSize); // Set the default bitmap list BitmapLoader* bmpLoader = clGetManager()->GetStdIcons(); m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/class")); // 0 m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/struct")); // 1 m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/namespace")); // 2 m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/member_public")); // 3 m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/typedef")); // 4 m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/member_private")); // 5 m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/member_public")); // 6 m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/member_protected")); // 7 m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/function_private")); // 8 m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/function_public")); // 9 m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/function_protected")); // 10 m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/typedef")); // 11 m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/enum")); // 12 m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/enumerator")); // 13 m_bitmaps.push_back(bmpLoader->LoadBitmap("mime/16/cpp")); // 14 m_bitmaps.push_back(bmpLoader->LoadBitmap("mime/16/h")); // 15 m_bitmaps.push_back(bmpLoader->LoadBitmap("mime/16/text")); // 16 m_bitmaps.push_back(bmpLoader->LoadBitmap("cc/16/cpp_keyword")); // 17 // Increase the size by 2 pixel for each dimension rect.Inflate(2, 2); SetSize(rect); m_canvas->SetBackgroundStyle(wxBG_STYLE_PAINT); m_canvas->Bind(wxEVT_LEFT_DOWN, &wxCodeCompletionBox::OnLeftDClick, this); m_canvas->Bind(wxEVT_LEFT_DCLICK, &wxCodeCompletionBox::OnLeftDClick, this); // Default colorus (dark theme) clColourPalette palette = DrawingUtils::GetColourPalette(); m_lightBorder = wxColour("rgb(77, 77, 77)"); m_darkBorder = wxColour("rgb(54, 54, 54)"); m_penColour = palette.penColour; m_bgColour = palette.bgColour; m_textColour = palette.textColour; m_selectedTextColour = palette.selecteTextColour; m_selection = palette.selectionBgColour; m_scrollBgColour = wxColour("rgb(50, 50, 50)"); IManager* manager = ::clGetManager(); if(manager) { IEditor* editor = manager->GetActiveEditor(); if(editor) { wxColour bgColour = editor->GetSTC()->StyleGetBackground(0); if(!DrawingUtils::IsDark(bgColour)) { m_useLightColours = true; // Need bright colours m_lightBorder = *wxWHITE; m_darkBorder = wxColour("rgb(207, 207, 207)"); m_scrollBgColour = wxColour("rgb(198, 198, 198)"); } } } m_bmpDown = wxXmlResource::Get()->LoadBitmap("cc-box-down"); m_bmpDownEnabled = m_bmpDown.ConvertToDisabled(); m_bmpUp = wxXmlResource::Get()->LoadBitmap("cc-box-up"); m_bmpUpEnabled = m_bmpUp.ConvertToDisabled(); if(m_useLightColours) { // swap between the disabled and enabeld bitmaps { wxBitmap tmpBitmap; tmpBitmap = m_bmpDown; m_bmpDown = m_bmpDownEnabled; m_bmpDownEnabled = tmpBitmap; } { wxBitmap tmpBitmap; tmpBitmap = m_bmpUp; m_bmpUp = m_bmpUpEnabled; m_bmpUpEnabled = tmpBitmap; } } }
void CCBoxTipWindow::DoInitialize(const wxString& tip, size_t numOfTips, bool simpleTip) { IEditor* editor = ::clGetManager()->GetActiveEditor(); if(editor) { wxColour bgColour = editor->GetSTC()->StyleGetBackground(0); if(!DrawingUtils::IsDark(bgColour)) { m_useLightColours = true; } } m_tip = tip; m_numOfTips = numOfTips; // Invalidate the rectangles m_leftTipRect = wxRect(); m_rightTipRect = wxRect(); if(!simpleTip && m_numOfTips > 1) m_tip.Prepend(wxT("\n\n")); // Make room for the arrows Hide(); wxBitmap bmp(1, 1); wxMemoryDC dc(bmp); wxSize size; m_codeFont = DrawingUtils::GetDefaultFixedFont(); m_commentFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); wxString codePart, commentPart; wxString strippedTip = DoStripMarkups(); size_t from = 0; int hr_count = 0; size_t hrPos = strippedTip.find("<hr>"); while(hrPos != wxString::npos) { ++hr_count; from = hrPos + 4; hrPos = strippedTip.find("<hr>", from); } int where = strippedTip.Find("<hr>"); if(where != wxNOT_FOUND) { codePart = strippedTip.Mid(0, where); commentPart = strippedTip.Mid(where + 5); } else { codePart = strippedTip; } int commentWidth = 0; int codeWidth = 0; // Use bold font for measurements m_codeFont.SetWeight(wxFONTWEIGHT_BOLD); m_commentFont.SetWeight(wxFONTWEIGHT_BOLD); if(!simpleTip) { dc.GetMultiLineTextExtent(codePart, &codeWidth, NULL, NULL, &m_codeFont); dc.GetMultiLineTextExtent(commentPart, &commentWidth, NULL, NULL, &m_commentFont); } else { dc.GetMultiLineTextExtent(strippedTip, &codeWidth, NULL, NULL, &m_commentFont); } m_codeFont.SetWeight(wxFONTWEIGHT_NORMAL); m_commentFont.SetWeight(wxFONTWEIGHT_NORMAL); // Set the width commentWidth > codeWidth ? size.x = commentWidth : size.x = codeWidth; // Shrink the tip m_tip.Replace("\r", ""); while(m_tip.Replace("\n\n", "\n")) { } dc.GetTextExtent(wxT("Tp"), NULL, &m_lineHeight, NULL, NULL, &m_codeFont); int nLineCount = ::wxStringTokenize(m_tip, wxT("\r\n"), wxTOKEN_RET_EMPTY_ALL).GetCount(); size.y = nLineCount * m_lineHeight; size.y += (hr_count * 10) + 10; // each <hr> uses 10 pixels height size.x += 40; SetSize(size); Connect(wxEVT_PAINT, wxPaintEventHandler(CCBoxTipWindow::OnPaint), NULL, this); Connect(wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(CCBoxTipWindow::OnEraseBG), NULL, this); Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(CCBoxTipWindow::OnMouseLeft), NULL, this); }