///////////////////////////////////////////////////////////////////////////// // Name: view.cc // Purpose: View classes // Author: Daniel Horak // Modified by: // RCS-ID: $Id: view.cc,v 1.2 2003/06/06 17:46:05 horakdan Exp $ // Copyright: (c) Daniel Horak // Licence: GPL ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include #endif #if !wxUSE_DOC_VIEW_ARCHITECTURE #error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h! #endif #include "datadesigner.h" #include "project.h" #include "doc.h" #include "view.h" #include "schema.h" #include "servers/dbserver.h" /* * DataDesignerSplitter */ BEGIN_EVENT_TABLE(DataDesignerSplitter, wxSplitterWindow) END_EVENT_TABLE() // Define a constructor for my canvas DataDesignerSplitter::DataDesignerSplitter(wxView *v, wxMDIChildFrame *frame, const wxPoint& pos, const wxSize& size, long style): wxSplitterWindow(frame, -1, pos, size, style) { m_view = v; m_project = new DataDesignerProject(this); m_panel = new wxPanel(this); SplitVertically(m_project, m_panel, 200); SetAutoLayout(TRUE); } // Define the repainting behaviour void DataDesignerSplitter::OnDraw(wxDC& dc) { #ifdef ENABLE_DEBUG wxLogMessage("DataDesignerSplitter::OnDraw"); #endif if (m_view) m_view->OnDraw(& dc); } /* * DataDesignerView */ IMPLEMENT_DYNAMIC_CLASS(DataDesignerView, wxView) BEGIN_EVENT_TABLE(DataDesignerView, wxView) EVT_MENU(DataDesigner_Entity, DataDesignerView::OnObject) EVT_MENU(DataDesigner_Domain, DataDesignerView::OnObject) EVT_MENU(DataDesigner_View, DataDesignerView::OnObject) EVT_MENU(DataDesigner_Procedure, DataDesignerView::OnObject) EVT_MENU(DataDesigner_Relation, DataDesignerView::OnObject) EVT_MENU(DataDesigner_Sequence, DataDesignerView::OnObject) EVT_MENU(DataDesigner_ZoomIn, DataDesignerView::OnZoom) EVT_MENU(DataDesigner_ZoomOut, DataDesignerView::OnZoom) EVT_MENU(DataDesigner_Zoom100, DataDesignerView::OnZoom) EVT_MENU(DataDesigner_ExportDDL, DataDesignerView::OnExportDDL) END_EVENT_TABLE() DataDesignerView::DataDesignerView() : m_frame(NULL), m_splitter(NULL), m_zoom(100) { } DataDesignerView::~DataDesignerView() { } // What to do when a view is created. Creates actual // windows for displaying the view. bool DataDesignerView::OnCreate(wxDocument *doc, long WXUNUSED(flags) ) { #ifdef ENABLE_DEBUG wxLogMessage("DataDesignerView::OnCreate"); #endif m_frame = wxGetApp().CreateChildFrame(doc, this); m_frame->SetTitle(_T("DataDesignerView")); m_splitter = GetMainFrame()->CreateSplitter(this, m_frame); #ifdef __X__ // X seems to require a forced resize int x, y; m_frame->GetSize(&x, &y); m_frame->SetSize(-1, -1, x, y); #endif m_frame->Show(TRUE); Activate(TRUE); return TRUE; } void DataDesignerView::OnDraw(wxDC *dc) { DataDesignerSchema *schema; #ifdef ENABLE_DEBUG wxLogMessage("DataDesignerView::OnDraw"); #endif if ((schema = m_splitter->GetProject()->GetSchema()) == NULL) return; schema->OnDraw(*dc); } void DataDesignerView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint)) { if (m_splitter) m_splitter->Refresh(); } // Clean up windows used for displaying the view. bool DataDesignerView::OnClose(bool deleteWindow) { if (!GetDocument()->Close()) return FALSE; wxString s(wxTheApp->GetAppName()); if (m_frame) m_frame->SetTitle(s); SetFrame((wxFrame*)NULL); Activate(FALSE); if (deleteWindow) { delete m_frame; return TRUE; } return TRUE; } void DataDesignerView::OnObject(wxCommandEvent& event) { DataDesignerContainer *top = NULL; DataDesignerProject *project; #ifdef ENABLE_DEBUG wxLogMessage("DataDesignerView::OnObject"); #endif project = m_splitter->GetProject(); switch (event.GetId()) { case DataDesigner_Domain: top = project->m_top_domains; break; case DataDesigner_Entity: top = project->m_top_entities; break; case DataDesigner_View: top = project->m_top_views; break; case DataDesigner_Procedure: top = project->m_top_procedures; break; case DataDesigner_Sequence: top = project->m_top_sequences; break; case DataDesigner_Relation: top = project->m_top_relations; break; default: wxLogMessage("Unknow object type %d", event.GetId()); break; } if (top) project->NewObject(top); } void DataDesignerView::OnZoom(wxCommandEvent& event) { DataDesignerSchema *schema; #ifdef ENABLE_DEBUG wxLogMessage("DataDesignerView::OnZoom"); #endif if ((schema = m_splitter->GetProject()->GetSchema()) == NULL) { wxLogMessage("we have no schema to zoom"); return; } if (event.GetId() == DataDesigner_ZoomIn) m_zoom += 25; else if (event.GetId() == DataDesigner_ZoomOut) m_zoom -= 25; else if (event.GetId() == DataDesigner_Zoom100) m_zoom = 100; #ifdef ENABLE_DEBUG wxLogMessage("m_zoom = %d", m_zoom); #endif schema->SetScale((double)(m_zoom / 100.0)); schema->Refresh(); } void DataDesignerView::OnExportDDL(wxCommandEvent& event) { #ifdef ENABLE_DEBUG wxLogMessage("DataDesignerView::OnExportDDL"); #endif DataDesignerProject *project = m_splitter->GetProject(); project->GetServer()->ExportDDL(this); }