xml-copy-editor-code/src/locationpanel.cpp

182 lines
4.4 KiB
C++
Raw Normal View History

2008-01-06 23:13:01 +01:00
/*
* Copyright 2005-2007 Gerald Schmidt.
2008-01-06 23:13:01 +01:00
*
* This file is part of Xml Copy Editor.
2008-01-06 23:13:01 +01:00
*
* Xml Copy Editor 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; version 2 of the License.
2008-01-06 23:13:01 +01:00
*
* Xml Copy Editor 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.
2008-01-06 23:13:01 +01:00
*
* You should have received a copy of the GNU General Public License
* along with Xml Copy Editor; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
2007-09-07 23:17:30 +02:00
#include "locationpanel.h"
#include "xmldoc.h"
2007-09-08 00:25:30 +02:00
BEGIN_EVENT_TABLE ( LocationPanel, wxPanel )
2007-09-07 23:17:30 +02:00
END_EVENT_TABLE()
2007-09-08 00:25:30 +02:00
LocationPanel::LocationPanel ( wxWindow *parentWindowParameter, int id ) :
2008-01-06 23:13:01 +01:00
wxPanel ( parentWindowParameter, id )
2007-09-07 23:17:30 +02:00
{
2008-01-06 23:13:01 +01:00
parentWindow = ( MyFrame * ) parentWindowParameter;
2007-09-07 23:17:30 +02:00
2008-01-06 23:13:01 +01:00
int width = 150;
SetSize ( wxSize ( width, -1 ) );
2007-09-07 23:17:30 +02:00
2008-01-06 23:13:01 +01:00
sizer = new wxBoxSizer ( wxVERTICAL );
SetSizer ( sizer );
2007-09-08 00:25:30 +02:00
2008-01-06 23:13:01 +01:00
edit = new wxTextCtrl (
this,
wxID_ANY,
wxEmptyString,
wxDefaultPosition,
wxDefaultSize,
wxTE_READONLY );
2007-09-08 00:25:30 +02:00
2008-01-06 23:13:01 +01:00
wxFont normalFont = wxSystemSettings::GetFont ( wxSYS_DEFAULT_GUI_FONT );
wxFont boldFont = normalFont;
boldFont.SetWeight ( wxFONTWEIGHT_BOLD );
edit->SetFont ( boldFont );
2007-09-08 00:25:30 +02:00
2008-01-22 00:06:36 +01:00
structureEdit = new wxStyledTextCtrl (
2008-01-06 23:13:01 +01:00
this,
wxID_ANY,
wxDefaultPosition,
wxDefaultSize);
2008-01-22 00:06:36 +01:00
for (int i = 0 ; i < 3; i++ )
structureEdit->SetMarginWidth ( i, 0 );
structureEdit->SetReadOnly ( true );
//structureEdit->SetWrapMode ( wxSTC_WRAP_WORD );
//structureEdit->SetWrapVisualFlags ( wxSTC_WRAPVISUALFLAG_START );
structureEdit->SetTabWidth ( 2 );
structureEdit->SetIndentationGuides ( true );
2007-09-08 00:25:30 +02:00
2008-01-06 23:13:01 +01:00
sizer->Add ( edit, 0, wxGROW | wxTOP, 0 );
2008-01-22 00:06:36 +01:00
sizer->Add ( structureEdit, 0, wxGROW | wxTOP, 0 );
2008-01-06 23:13:01 +01:00
sizer->Layout();
2008-01-22 00:06:36 +01:00
structureEdit->Show ( false );
2007-09-07 23:17:30 +02:00
}
2007-09-08 00:25:30 +02:00
void LocationPanel::update (
XmlDoc *docParameter,
const wxString& parentParameter )
2007-09-07 23:17:30 +02:00
{
2008-01-06 23:13:01 +01:00
doc = docParameter;
parent = parentParameter;
wxString previous = edit->GetValue();
2008-01-22 00:06:36 +01:00
if ( !doc )
{
edit->SetValue ( wxEmptyString );
structureEdit->Show ( false );
return;
}
else
{
std::string structure = doc->getElementStructure ( parent );
if (!structure.empty () )
{
indentStructure( structure );
structureEdit->Show ( true );
wxString wideStructure = wxString ( structure.c_str(), wxConvUTF8, structure.size() );
structureEdit->SetReadOnly ( false );
structureEdit->SetText ( wideStructure );
structureEdit->SetReadOnly ( true );
wxSize clientSize = GetClientSize();
wxSize editSize = edit->GetSize();
wxSize structureSize =
wxSize ( clientSize.GetWidth(), clientSize.GetHeight() - editSize.GetHeight() );
if ( clientSize.IsFullySpecified() && editSize.IsFullySpecified() )
structureEdit->SetSize ( structureSize );
structureEdit->Update();
}
else
{
structureEdit->Show ( false );
}
}
2008-01-06 23:13:01 +01:00
if ( parentParameter == previous )
return;
previous = parentParameter;
edit->SetValue ( parent );
2008-01-22 00:06:36 +01:00
}
void LocationPanel::indentStructure ( std::string& structure )
{
std::string indented;
char *s = (char *) structure.c_str();
int indent = 0;
2008-07-02 01:23:22 +02:00
const char *indentMark = "\t";
2008-01-22 00:06:36 +01:00
int count = 0;
bool justSeenContent = false;
for ( ; *s; s++, count++)
{
if (*s == '(')
{
if ( count && justSeenContent )
{
indented += '\n';
}
else if (!justSeenContent)
indented += *s;
for ( int i = 0; i < indent; i++ )
{
2008-07-02 01:23:22 +02:00
indented += (char *)indentMark;
2008-01-22 00:06:36 +01:00
}
if (justSeenContent)
indented += *s;
indent++;
indented += '\n';
for (int i = 0; indent && i < indent; i++)
2008-07-02 01:23:22 +02:00
indented += (char *)indentMark;
2008-01-22 00:06:36 +01:00
justSeenContent = false;
}
else if (*s == ')')
{
if ( justSeenContent )
{
indented += '\n';
}
indent--;
for (int i = 0; indent && i < indent; i++)
2008-07-02 01:23:22 +02:00
indented += (char *)indentMark;
2008-01-22 00:06:36 +01:00
indented += *s;
indented += '\n';
if (*( s + 1 ) && *(s + 1) != ')' )
{
for (int i = 0; i < indent; i++)
2008-07-02 01:23:22 +02:00
indented += (char *)indentMark;
2008-01-22 00:06:36 +01:00
}
justSeenContent = false;
}
else
{
if ( *s == '|' && justSeenContent)
indented += ' ';
indented += *s;
if ( *s == ',' || *s == '|' )
indented += ' ';
justSeenContent = true;
}
}
structure = indented;
2007-09-07 23:17:30 +02:00
}