# pragma implementation "wxlwindow.h"
#endif
-#include "wxlwindow.h"
+//#include "Mpch.h"
-#define VAR(x) cout << #x"=" << x << endl;
+#ifdef M_BASEDIR
+# ifndef USE_PCH
+# include "Mcommon.h"
+# include "gui/wxMenuDefs.h"
+# endif // USE_PCH
+# include "gui/wxlwindow.h"
+#else
+# ifdef __WXMSW__
+# include <windows.h>
+
+# undef FindWindow
+# undef GetCharWidth
+# undef StartDoc
+# endif
+
+# include "wxlwindow.h"
+# define TRACEMESSAGE(x)
+#endif
+# define WXL_VAR(x) cerr << #x " = " << x ;
BEGIN_EVENT_TABLE(wxLayoutWindow,wxScrolledWindow)
EVT_PAINT (wxLayoutWindow::OnPaint)
EVT_CHAR (wxLayoutWindow::OnChar)
- EVT_LEFT_DOWN(wxLayoutWindow::OnMouse)
+
+ EVT_LEFT_DOWN(wxLayoutWindow::OnLeftMouseClick)
+ EVT_RIGHT_DOWN(wxLayoutWindow::OnRightMouseClick)
+ EVT_LEFT_DCLICK(wxLayoutWindow::OnMouseDblClick)
+ EVT_MENU(WXLOWIN_MENU_LARGER, wxLayoutWindow::OnMenu)
+ EVT_MENU(WXLOWIN_MENU_SMALLER, wxLayoutWindow::OnMenu)
+ EVT_MENU(WXLOWIN_MENU_UNDERLINE, wxLayoutWindow::OnMenu)
+ EVT_MENU(WXLOWIN_MENU_BOLD, wxLayoutWindow::OnMenu)
+ EVT_MENU(WXLOWIN_MENU_ITALICS, wxLayoutWindow::OnMenu)
+ EVT_MENU(WXLOWIN_MENU_ROMAN, wxLayoutWindow::OnMenu)
+ EVT_MENU(WXLOWIN_MENU_TYPEWRITER, wxLayoutWindow::OnMenu)
+ EVT_MENU(WXLOWIN_MENU_SANSSERIF, wxLayoutWindow::OnMenu)
END_EVENT_TABLE()
wxLayoutWindow::wxLayoutWindow(wxWindow *parent)
{
m_ScrollbarsSet = false;
- m_EventId = -1;
+ m_doSendEvents = false;
+ m_ViewStartX = 0; m_ViewStartY = 0;
+ m_DoPopupMenu = true;
+ m_PopupMenu = NULL;
+
+ CoordType
+ max_x, max_y, lineHeight;
+ m_llist.GetSize(&max_x, &max_y, &lineHeight);
+ SetScrollbars(10, lineHeight, max_x/10+1, max_y/lineHeight+1);
+ EnableScrolling(true,true);
}
#ifdef __WXMSW__
}
#endif //MSW
-
void
-wxLayoutWindow::OnMouse(wxMouseEvent& event)
+wxLayoutWindow::Update(void)
{
- SetFocus();
+ wxClientDC dc(this);
+ PrepareDC(dc);
+ if(IsDirty())
+ {
+ DoPaint(dc);
+ UpdateScrollbars();
+ ResetDirty();
+ }
+ m_llist.DrawCursor(dc);
+}
- if(m_EventId == -1) // nothing to do
+void
+wxLayoutWindow::OnMouse(int eventId, wxMouseEvent& event)
+{
+ if(!m_doSendEvents) // nothing to do
return;
+
+ wxPaintDC dc( this );
+ PrepareDC( dc );
+ SetFocus();
- m_FindPos.x = event.GetX();
- m_FindPos.y = event.GetY();
- m_FoundObject = NULL;
+ wxPoint findPos;
+ findPos.x = dc.DeviceToLogicalX(event.GetX());
+ findPos.y = dc.DeviceToLogicalY(event.GetY());
-#ifdef WXLAYOUT_DEBUG
- //doesn't work, undefined functions
- //wxLogTrace("OnMouse: (%d, %d)", m_FindPos.x, m_FindPos.y);
-#endif
- Refresh();
- if(m_FoundObject)
+ TRACEMESSAGE(("wxLayoutWindow::OnMouse: (%d, %d) -> (%d, %d)",
+ event.GetX(), event.GetY(), findPos.x, findPos.y));
+
+ if(eventId == WXLOWIN_MENU_RCLICK && m_DoPopupMenu && m_llist.IsEditable())
{
- if(m_EventId != -1)
- {
- wxCommandEvent commandEvent(wxEVENT_TYPE_MENU_COMMAND, m_EventId);
- commandEvent.SetEventObject( this );
- commandEvent.SetClientData((char *)m_FoundObject);
- m_ClickPosition = wxPoint(event.GetX(), event.GetY());
- GetEventHandler()->ProcessEvent(commandEvent);
- }
+ // when does this menu get freed?
+ // how do we handle toggling? FIXME
+ PopupMenu(MakeFormatMenu(), event.GetX(), event.GetY());
+ return;
+ }
+ // find the object at this position
+ wxLayoutObjectBase *obj = m_llist.Find(findPos);
+ if(obj)
+ {
+ wxCommandEvent commandEvent(wxEVENT_TYPE_MENU_COMMAND, eventId);
+ commandEvent.SetEventObject( this );
+ commandEvent.SetClientData((char *)obj);
+ GetEventHandler()->ProcessEvent(commandEvent);
}
}
break;
case WXK_END:
p = m_llist.GetCursor();
- p.x = m_llist.GetLineLength(m_llist.FindCurrentObject(NULL));
+ p.x = m_llist.GetLineLength(m_llist.GetCurrentObject());
m_llist.SetCursor(p);
break;
case WXK_DELETE :
if(event.ControlDown()) // delete to end of line
{
help = m_llist.GetLineLength(
- m_llist.FindCurrentObject(NULL))
+ m_llist.GetCurrentObject())
- m_llist.GetCursor().x;
m_llist.Delete(help ? help : 1);
}
m_llist.Delete(1);
break;
case WXK_BACK: // backspace
- if(m_llist.MoveCursor(-1))
+ if(m_llist.MoveCursor(-1)) {
m_llist.Delete(1);
+ }
break;
case WXK_RETURN:
m_llist.LineBreak();
break;
-#ifdef WXLAYOUT_DEBUG
+
+#ifdef WXLAYOUT_DEBUG
case WXK_F1:
m_llist.Debug();
break;
-#endif
+ case WXK_F2:
+ m_llist.WrapLine();
+ break;
+#endif
+
default:
if(keyCode < 256 && keyCode >= 32)
{
String tmp;
tmp += keyCode;
m_llist.Insert(tmp);
+ m_llist.WrapLine();
}
break;
}
- Refresh();
- UpdateScrollbars();
+
+ /** Scroll so that cursor is visible! */
+ int x0,y0,x1,y1,ux,uy;
+ ViewStart(&x0,&y0);
+ GetScrollPixelsPerUnit(&ux,&uy);
+ x0*=ux; y0*=uy;
+ GetClientSize(&x1,&y1);
+
+ wxPoint cc = m_llist.GetCursorCoords();
+ int nx = x0, ny = y0;
+ // when within 10% of borders, scroll to center
+ if(cc.y > y0+(9*y1)/10)
+ ny = cc.y - y1/5;
+ else if (cc.y < y0+y1/10)
+ {
+ ny = cc.y-y1/2;
+ if(ny < 0) ny = 0;
+ }
+ if(cc.x > x0+(9*x1)/10)
+ nx = cc.x - x1/5;
+ else if (cc.x < x0+x1/10)
+ {
+ nx = cc.x-x1/2;
+ if(nx < 0) nx = 0;
+ }
+ Scroll(nx,ny);
+
+ Update();
}
void
-wxLayoutWindow::OnPaint( wxPaintEvent &WXUNUSED(event)w) // or: OnDraw(wxDC& dc)
+wxLayoutWindow::OnPaint( wxPaintEvent &WXUNUSED(event)) // or: OnDraw(wxDC& dc)
{
- wxPaintDC dc( this ); // only when used as OnPaint for OnDraw we
- PrepareDC( dc ); // can skip the first two lines
+ wxPaintDC dc( this );
+ PrepareDC( dc );
+
+ DoPaint(dc);
+
+// wxGTK: wxMemoryDC broken?
+#if 0
+ int x0,y0,x1,y1;
+ ViewStart(&x0,&y0);
+ GetSize(&x1,&y1);
+ WXL_VAR(x0); WXL_VAR(y0);
+ WXL_VAR(x1); WXL_VAR(y1);
+
+ wxMemoryDC(memdc);
+ wxBitmap bm(x1,y1);
+ memdc.SelectObject(bm);
+
+ // make temporary copy and edit this
+ memdc.SetDeviceOrigin(x0,y0);
+ memdc.Blit(x0,y0,x1,y1,&dc,x0,y0,wxCOPY,FALSE);
+ DoPaint(memdc);
+ // blit it back
+ dc.Blit(x0,y0,x1,y1,&memdc,x0,y0,wxCOPY,FALSE);
+#endif
+
+}
+
+// does the actual painting
+void
+wxLayoutWindow::DoPaint(wxDC &dc)
+{
+ m_llist.EraseAndDraw(dc);
+ m_llist.DrawCursor(dc);
+ // FIXME: not strictly correct, this does only work for changes behind
+ // the cursor position, not complete redraws
- if(m_EventId != -1) // look for keyclicks
- m_FoundObject = m_llist.Draw(dc,true,m_FindPos);
- else
- m_llist.Draw(dc);
if(! m_ScrollbarsSet)
{
m_ScrollbarsSet = true; // avoid recursion
{
CoordType
max_x, max_y, lineHeight;
-
+
+ ViewStart(&m_ViewStartX, &m_ViewStartY);
m_llist.GetSize(&max_x, &max_y, &lineHeight);
- SetScrollbars(10, lineHeight, max_x/10+1, max_y/lineHeight+1);
- EnableScrolling(true,true);
+ SetScrollbars(10, lineHeight, max_x/10+1, max_y/lineHeight+1,m_ViewStartX,m_ViewStartY,true);
+ //EnableScrolling(true,true);
+ //Scroll(m_ViewStartX, m_ViewStartY);
}
void
wxLayoutWindow::Print(void)
{
- VAR(wxThePrintSetupData);
-
wxPostScriptDC dc("layout.ps",true,this);
if (dc.Ok() && dc.StartDoc((char *)_("Printing message...")))
{
dc.EndDoc();
}
}
+
+wxMenu *
+wxLayoutWindow::MakeFormatMenu()
+{
+ if(m_PopupMenu)
+ return m_PopupMenu;
+
+ wxMenu *m = new wxMenu();
+
+ m->Append(WXLOWIN_MENU_LARGER ,_("&Larger"),_("Switch to larger font."), false);
+ m->Append(WXLOWIN_MENU_SMALLER ,_("&Smaller"),_("Switch to smaller font."), false);
+ m->AppendSeparator();
+ m->Append(WXLOWIN_MENU_UNDERLINE,_("&Underline"),_("Toggle underline mode."), true);
+ m->Append(WXLOWIN_MENU_BOLD ,_("&Bold"),_("Toggle bold mode."), true);
+ m->Append(WXLOWIN_MENU_ITALICS ,_("&Italics"),_("Toggle italics mode."), true);
+ m->AppendSeparator();
+ m->Append(WXLOWIN_MENU_ROMAN ,_("&Roman"),_("Toggle underline mode."), false);
+ m->Append(WXLOWIN_MENU_TYPEWRITER,_("&Typewriter"),_("Toggle bold mode."), false);
+ m->Append(WXLOWIN_MENU_SANSSERIF ,_("&Sans Serif"),_("Toggle italics mode."), false);
+
+ return m_PopupMenu = m;
+}
+
+void wxLayoutWindow::OnMenu(wxCommandEvent& event)
+{
+ if(! m_llist.IsEditable())
+ return;
+
+ switch (event.GetId())
+ {
+ case WXLOWIN_MENU_LARGER:
+ m_llist.SetFontLarger();
+ break;
+ case WXLOWIN_MENU_SMALLER:
+ m_llist.SetFontSmaller();
+ break;
+ case WXLOWIN_MENU_UNDERLINE:
+ m_llist.SetFontUnderline(
+ m_PopupMenu->IsChecked(WXLOWIN_MENU_UNDERLINE) ? false : true
+ );
+ break;
+ case WXLOWIN_MENU_BOLD:
+ m_llist.SetFontWeight(
+ m_PopupMenu->IsChecked(WXLOWIN_MENU_BOLD) ? wxNORMAL : wxBOLD
+ );
+ case WXLOWIN_MENU_ITALICS:
+ m_llist.SetFontStyle(
+ m_PopupMenu->IsChecked(WXLOWIN_MENU_ITALICS) ? wxNORMAL : wxITALIC
+ );
+ break;
+ case WXLOWIN_MENU_ROMAN:
+ m_llist.SetFontFamily(wxROMAN); break;
+ case WXLOWIN_MENU_TYPEWRITER:
+ m_llist.SetFontFamily(wxFIXED); break;
+ case WXLOWIN_MENU_SANSSERIF:
+ m_llist.SetFontFamily(wxSWISS); break;
+ }
+}