diff options
Diffstat (limited to 'pagelayout_editor/design_tree_frame.cpp')
-rw-r--r-- | pagelayout_editor/design_tree_frame.cpp | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/pagelayout_editor/design_tree_frame.cpp b/pagelayout_editor/design_tree_frame.cpp new file mode 100644 index 0000000..59fe1e0 --- /dev/null +++ b/pagelayout_editor/design_tree_frame.cpp @@ -0,0 +1,291 @@ +/** + * @file design_tree_frame.cpp + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 CERN + * @author Jean-Pierre Charras, jp.charras at wanadoo.fr + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <wx/imaglist.h> +#include <wx/wupdlock.h> +#include <fctsys.h> +#include <worksheet_shape_builder.h> +#include <class_worksheet_dataitem.h> +#include <pl_editor_id.h> +#include <design_tree_frame.h> + +/* XPM + * This bitmap is used to show item types + */ +static const char* root_xpm[] = +{ + "12 12 2 1", + " c None", + "x c #008080", + " xxxx ", + " xxx ", + " xxx ", + " xxx ", + "xxxxxxxxxxx ", + "xxxxxxxxxxxx", + "xxxxxxxxxxx ", + " xxx ", + " xxx ", + " xxx ", + " xxxx ", + " " +}; + +static const char* line_xpm[] = +{ + "12 12 2 1", + " c None", + "x c #008080", + "xx ", + "xx ", + "xx ", + "xx ", + "xx ", + "xx ", + "xx ", + "xx ", + "xx ", + "xx ", + "xxxxxxxxxxxx", + "xxxxxxxxxxxx" +}; + +static const char* rect_xpm[] = +{ + "12 12 2 1", + " c None", + "x c #000080", + "xxxxxxxxxxxx", + "xxxxxxxxxxxx", + "xx xx", + "xx xx", + "xx xx", + "xx xx", + "xx xx", + "xx xx", + "xx xx", + "xx xx", + "xxxxxxxxxxxx", + "xxxxxxxxxxxx" +}; + +static const char* text_xpm[] = +{ + "12 12 2 1", + " c None", + "x c #800000", + " xxxxxxxxxx ", + "xxxxxxxxxxxx", + "xx xx xx", + " xx ", + " xx ", + " xx ", + " xx ", + " xx ", + " xx ", + " xx ", + " xxxx ", + " xxxxxx " +}; + +static const char* poly_xpm[] = +{ + "12 12 2 1", + " c None", + "x c #008000", + " xx ", + " xxxx ", + " xxxxxx ", + " xxxxxxxx ", + " xxxxxxxxxx ", + "xxxxxxxxxxxx", + "xxxxxxxxxxxx", + " xxxxxxxxxx ", + " xxxxxxxx ", + " xxxxxx ", + " xxxx ", + " xx " +}; + +static const char* img_xpm[] = +{ + "12 12 2 1", + " c None", + "x c #800000", + " xx ", + " xxxxxx ", + " xx xx ", + "xx xx", + "xx xx", + " xx xx ", + " xxxxxx ", + " xx ", + " xx ", + " xx ", + " xx ", + " xx " +}; + +// Event table: + + +DESIGN_TREE_FRAME::DESIGN_TREE_FRAME( PL_EDITOR_FRAME* aParent ) : + wxTreeCtrl( aParent, ID_DESIGN_TREE_FRAME ) +{ + // icons size is not know (depending on they are built) + // so get it: + wxSize iconsize; + wxBitmap root_bm( root_xpm ); + + iconsize.x = root_bm.GetWidth(); + iconsize.y = root_bm.GetHeight(); + + // Make an image list containing small icons + m_imageList = new wxImageList( iconsize.x, iconsize.y, true, 6 ); + + m_imageList->Add( root_bm ); // root symbol + m_imageList->Add( wxBitmap( line_xpm ) ); // line item + m_imageList->Add( wxBitmap( rect_xpm ) ); // rect item + m_imageList->Add( wxBitmap( text_xpm ) ); // text item + m_imageList->Add( wxBitmap( poly_xpm ) ); // poly item + m_imageList->Add( wxBitmap( img_xpm ) ); // bitmap item + + SetImageList( m_imageList ); +} + + +DESIGN_TREE_FRAME::~DESIGN_TREE_FRAME() +{ + delete m_imageList; +} + + +wxSize DESIGN_TREE_FRAME::GetMinSize() const +{ + return wxSize( 100, -1 ); +} + + +void DESIGN_TREE_FRAME::ReCreateDesignTree() +{ + wxWindowUpdateLocker dummy(this); // Avoid flicker when rebuilding the tree + + DeleteAllItems(); + + const WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + + // root tree: + wxFileName fn( ((PL_EDITOR_FRAME*) GetParent())->GetCurrFileName() ); + wxTreeItemId rootitem; + + if( fn.GetName().IsEmpty() ) + rootitem = AddRoot( wxT( "<default>" ), 0, 0 ); + else + rootitem = AddRoot( fn.GetName(), 0, 0 ); + + SetItemBold( rootitem, true ); + + // Now adding all current items + for( unsigned ii = 0; ii < pglayout.GetCount(); ii++ ) + { + WORKSHEET_DATAITEM* item = pglayout.GetItem( ii ); + int img = 0; + switch( item->GetType() ) + { + case WORKSHEET_DATAITEM::WS_SEGMENT: img = 1; break; + case WORKSHEET_DATAITEM::WS_RECT: img = 2; break; + case WORKSHEET_DATAITEM::WS_TEXT: img = 3; break; + case WORKSHEET_DATAITEM::WS_POLYPOLYGON: img = 4; break; + case WORKSHEET_DATAITEM::WS_BITMAP: img = 5; break; + } + wxTreeItemId cell= AppendItem( rootitem, item->m_Name, img, img ); + DESIGN_TREE_ITEM_DATA* data = new DESIGN_TREE_ITEM_DATA( item ); + SetItemData( cell, data ); + } + + Expand( rootitem ); +} + + +// Select the tree item corresponding to the WORKSHEET_DATAITEM aItem +void DESIGN_TREE_FRAME::SelectCell( WORKSHEET_DATAITEM* aItem ) +{ + wxTreeItemId rootcell = GetRootItem(); + wxTreeItemIdValue cookie; + + wxTreeItemId cell = GetFirstChild( rootcell, cookie ); + + while( cell.IsOk() ) + { + DESIGN_TREE_ITEM_DATA* data = (DESIGN_TREE_ITEM_DATA*) GetItemData( cell ); + + if( data->GetItem() == aItem ) + { + SelectItem( cell ); + return; + } + + cell = GetNextChild( rootcell, cookie ); + } +} + +//return the page layout item managed by the cell +WORKSHEET_DATAITEM* DESIGN_TREE_FRAME::GetPageLayoutItem( wxTreeItemId aCell ) const +{ + DESIGN_TREE_ITEM_DATA* data = (DESIGN_TREE_ITEM_DATA*) GetItemData( aCell ); + if( data ) + return data->GetItem(); + else + return NULL; +} + +/* return the page layout item managed by the selected cell (or NULL) + */ +WORKSHEET_DATAITEM* DESIGN_TREE_FRAME::GetPageLayoutSelectedItem() const +{ + wxTreeItemId cell; + cell = GetSelection(); + + if( cell.IsOk() ) + return GetPageLayoutItem( cell ); + + return NULL; +} + +/* return the page layout item index managed by the selected cell (or -1) + */ +int DESIGN_TREE_FRAME::GetSelectedItemIndex() +{ + WORKSHEET_DATAITEM*item = GetPageLayoutSelectedItem(); + + if( item == NULL ) + return -1; + + WORKSHEET_LAYOUT& pglayout = WORKSHEET_LAYOUT::GetTheInstance(); + return pglayout.GetItemIndex( item ); +} |