#include "wx/html/htmlwin.h"
#include "wx/html/htmlproc.h"
#include "wx/list.h"
+#include "wx/clipbrd.h"
#include "wx/arrimpl.cpp"
#include "wx/listimpl.cpp"
return false;
#endif
}
+
+
+wxString wxHtmlWindow::SelectionToText()
+{
+ if ( !m_selection )
+ return wxEmptyString;
+
+ const wxHtmlCell *end = m_selection->GetToCell();
+ wxString text;
+ wxHtmlTerminalCellsInterator i(m_selection->GetFromCell(), end);
+ if ( i )
+ {
+ text << i->ConvertToText(m_selection);
+ ++i;
+ }
+ const wxHtmlCell *prev = *i;
+ while ( i )
+ {
+ if ( prev->GetParent() != i->GetParent() )
+ text << _T('\n');
+ text << i->ConvertToText(*i == end ? m_selection : NULL);
+ prev = *i;
+ ++i;
+ }
+ return text;
+}
+
+void wxHtmlWindow::CopySelection(ClipboardType t)
+{
+#if wxUSE_CLIPBOARD
+ if ( m_selection )
+ {
+ wxTheClipboard->UsePrimarySelection(t == Primary);
+ wxString txt(SelectionToText());
+ if ( wxTheClipboard->Open() )
+ {
+ wxTheClipboard->SetData(new wxTextDataObject(txt));
+ wxTheClipboard->Close();
+ wxLogTrace(_T("wxhtmlselection"),
+ _("Copied to clipboard:\"%s\""), txt.c_str());
+ }
+ }
+#endif
+}
void wxHtmlWindow::OnLinkClicked(const wxHtmlLinkInfo& link)
if (goingDown)
{
m_tmpSelFromCell = m_Cell->FindCellByPos(x, y,
- wxHTML_FIND_NEAREST_BEFORE);
-#if 0 // FIXME -- needed or not?
+ wxHTML_FIND_NEAREST_AFTER);
if (!m_tmpSelFromCell)
m_tmpSelFromCell = m_Cell->GetFirstTerminal();
-#endif
}
else
{
m_tmpSelFromCell = m_Cell->FindCellByPos(x, y,
- wxHTML_FIND_NEAREST_AFTER);
+ wxHTML_FIND_NEAREST_BEFORE);
if (!m_tmpSelFromCell)
m_tmpSelFromCell = m_Cell->GetLastTerminal();
}
}
if ( m_selection )
{
- if (goingDown)
+ if ( m_tmpSelFromCell->IsBefore(selcell) )
{
m_selection->Set(m_tmpSelFromPos, m_tmpSelFromCell,
wxPoint(x,y), selcell);
m_tmpSelFromPos, m_tmpSelFromCell);
}
Refresh(); // FIXME - optimize!
+#ifdef __UNIX__
+ CopySelection(Primary);
+#endif
}
}
}
}
}
+#if wxUSE_CLIPBOARD
+void wxHtmlWindow::OnKeyUp(wxKeyEvent& event)
+{
+ if ( event.GetKeyCode() == 'C' && event.ControlDown() )
+ {
+ if ( m_selection )
+ CopySelection();
+ }
+ else
+ event.Skip();
+}
+
+void wxHtmlWindow::OnCopy(wxCommandEvent& event)
+{
+ if ( m_selection )
+ CopySelection();
+}
+#endif
+
+
IMPLEMENT_ABSTRACT_CLASS(wxHtmlProcessor,wxObject)
EVT_RIGHT_UP(wxHtmlWindow::OnMouseUp)
EVT_MOTION(wxHtmlWindow::OnMouseMove)
EVT_IDLE(wxHtmlWindow::OnIdle)
+#if wxUSE_CLIPBOARD
+ EVT_KEY_UP(wxHtmlWindow::OnKeyUp)
+ EVT_MENU(wxID_COPY, wxHtmlWindow::OnCopy)
+#endif
END_EVENT_TABLE()