279 lines
8.2 KiB
C++
279 lines
8.2 KiB
C++
/*
|
|
* Copyright 2005-2007 Gerald Schmidt.
|
|
*
|
|
* This file is part of Xml Copy Editor.
|
|
*
|
|
* 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; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* 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.
|
|
*
|
|
* 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
|
|
*/
|
|
|
|
#include <wx/wx.h>
|
|
#include <wx/utils.h>
|
|
#include "commandpanel.h"
|
|
#include "xmlcopyeditor.h"
|
|
#include "wraptempfilename.h"
|
|
#include "readfile.h"
|
|
|
|
BEGIN_EVENT_TABLE ( CommandPanel, wxPanel )
|
|
EVT_BUTTON ( ID_RUN, CommandPanel::OnRun )
|
|
EVT_IDLE ( CommandPanel::OnIdle )
|
|
EVT_BUTTON ( ID_BUTTON_NAME, CommandPanel::OnVariableButton )
|
|
EVT_BUTTON ( ID_BUTTON_PATH, CommandPanel::OnVariableButton )
|
|
EVT_BUTTON ( ID_BUTTON_EXTENSION, CommandPanel::OnVariableButton )
|
|
EVT_BUTTON ( ID_BUTTON_FULLPATH, CommandPanel::OnVariableButton )
|
|
EVT_CHAR_HOOK ( CommandPanel::OnCharHook )
|
|
END_EVENT_TABLE()
|
|
|
|
CommandPanel::CommandPanel (
|
|
wxWindow *parentParameter,
|
|
int id,
|
|
const wxString& cmd,
|
|
bool sync,
|
|
int output,
|
|
const wxString& command ) : wxPanel ( parentParameter, id )
|
|
{
|
|
parent = ( MyFrame * ) parentParameter;
|
|
|
|
path = _ ( "{path}" );
|
|
name = _ ( "{name}" );
|
|
extension = _ ( "{extension}" );
|
|
fullpath = _ ( "{fullpath}" );
|
|
int sizerOffset = 2;
|
|
|
|
wxButton *pathButton = new wxButton ( this, ID_BUTTON_PATH, path, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER );
|
|
wxButton *nameButton = new wxButton ( this, ID_BUTTON_NAME, name, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER );
|
|
wxButton *extensionButton = new wxButton ( this, ID_BUTTON_EXTENSION, extension, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER );
|
|
wxButton *fullpathButton = new wxButton ( this, ID_BUTTON_FULLPATH, fullpath, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT | wxNO_BORDER );
|
|
|
|
|
|
commandEdit = new wxTextCtrl ( this, wxID_ANY );
|
|
commandEdit->SetValue ( cmd );
|
|
|
|
runButton = new wxButton (
|
|
this,
|
|
ID_RUN,
|
|
_ ( "&Run" ),
|
|
wxDefaultPosition,
|
|
wxDefaultSize,
|
|
wxBU_EXACTFIT | wxNO_BORDER );
|
|
|
|
syncBox = new wxCheckBox (
|
|
this,
|
|
ID_SYNC,
|
|
_ ( "&Wait" ) );
|
|
syncBox->SetValue ( sync );
|
|
|
|
wxStaticBox *outputBox = new wxStaticBox (
|
|
this,
|
|
wxID_ANY,
|
|
_ ( "Output options" ) );
|
|
|
|
outputIgnore = new wxRadioButton (
|
|
this,
|
|
ID_COMMAND_OUTPUT_IGNORE,
|
|
_ ( "I&gnore" ) );
|
|
outputIgnore->SetValue ( true );
|
|
|
|
outputInsert = new wxRadioButton (
|
|
this,
|
|
ID_COMMAND_OUTPUT_IGNORE,
|
|
_ ( "I&nsert" ) );
|
|
|
|
outputNewDocument = new wxRadioButton (
|
|
this,
|
|
ID_COMMAND_OUTPUT_IGNORE,
|
|
_ ( "New &document" ) );
|
|
|
|
switch ( output )
|
|
{
|
|
case ID_COMMAND_OUTPUT_IGNORE:
|
|
outputIgnore->SetValue ( true );
|
|
break;
|
|
case ID_COMMAND_OUTPUT_INSERT:
|
|
outputInsert->SetValue ( true );
|
|
break;
|
|
case ID_COMMAND_OUTPUT_NEW_DOCUMENT:
|
|
outputNewDocument->SetValue ( true );
|
|
break;
|
|
default:
|
|
outputIgnore->SetValue ( true );
|
|
break;
|
|
}
|
|
|
|
wxStaticBox *variablesBox = new wxStaticBox (
|
|
this,
|
|
wxID_ANY,
|
|
_ ( "Variables" ) );
|
|
|
|
|
|
wxStaticBoxSizer *outputSizer = new wxStaticBoxSizer ( outputBox, wxHORIZONTAL );
|
|
outputSizer->Add ( outputIgnore, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset );
|
|
outputSizer->Add ( outputInsert, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset );
|
|
outputSizer->Add ( outputNewDocument, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset );
|
|
|
|
wxStaticBoxSizer *variablesSizer = new wxStaticBoxSizer ( variablesBox, wxHORIZONTAL );
|
|
//variablesSizer->Add(label, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset);
|
|
variablesSizer->Add ( pathButton, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset );
|
|
variablesSizer->Add ( nameButton, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset );
|
|
variablesSizer->Add ( extensionButton, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset );
|
|
variablesSizer->Add ( fullpathButton, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset );
|
|
|
|
bottomSizer = new wxBoxSizer ( wxHORIZONTAL );
|
|
bottomSizer->Add ( runButton, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset );
|
|
bottomSizer->Add ( syncBox, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset );
|
|
bottomSizer->Add ( variablesSizer, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset );
|
|
bottomSizer->Add ( outputSizer, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset );
|
|
|
|
mainSizer = new wxBoxSizer ( wxVERTICAL );
|
|
mainSizer->Add ( commandEdit, 0, wxLEFT | wxRIGHT | wxEXPAND, sizerOffset );
|
|
mainSizer->Add ( bottomSizer );
|
|
|
|
|
|
this->SetSizer ( mainSizer );
|
|
mainSizer->SetSizeHints ( this );
|
|
}
|
|
|
|
CommandPanel::~CommandPanel()
|
|
{}
|
|
|
|
void CommandPanel::OnRun ( wxCommandEvent& event )
|
|
{
|
|
parent->statusProgress ( wxEmptyString );
|
|
wxString command = commandEdit->GetValue();
|
|
if ( command.empty() )
|
|
return;
|
|
|
|
// need to test for NULL ptr doc for each use
|
|
XmlDoc *doc = parent->getActiveDocument();
|
|
|
|
wxString fullPath = ( doc ) ? doc->getFullFileName() : _T ( "" );
|
|
|
|
wxString path, name, extension;
|
|
wxFileName::SplitPath ( fullPath, &path, &name, &extension );
|
|
|
|
command.Replace ( _ ( "{fullpath}" ), fullPath, true );
|
|
command.Replace ( _ ( "{path}" ), path, true );
|
|
command.Replace ( _ ( "{name}" ), name, true );
|
|
command.Replace ( _ ( "{extension}" ), extension, true );
|
|
|
|
bool redirect = ( getSync() && !outputIgnore->GetValue() );
|
|
|
|
if ( !redirect )
|
|
{
|
|
wxExecute ( command, ( getSync() ) ? wxEXEC_SYNC : wxEXEC_ASYNC );
|
|
return;
|
|
}
|
|
|
|
wxArrayString stringArray;
|
|
wxExecute ( command, stringArray, wxEXEC_NOHIDE );
|
|
if ( stringArray.empty() )
|
|
{
|
|
parent->statusProgress ( _T ( "No output" ) );
|
|
return;
|
|
}
|
|
|
|
size_t count = stringArray.GetCount();
|
|
wxString outputBuffer;
|
|
for ( size_t i = 0 ; i < count; i++ )
|
|
{
|
|
outputBuffer += stringArray[i];
|
|
outputBuffer += L"\n";
|
|
}
|
|
if ( outputInsert->GetValue() )
|
|
{
|
|
if ( doc )
|
|
{
|
|
doc->ReplaceSelection ( outputBuffer );
|
|
}
|
|
}
|
|
else if ( outputNewDocument->GetValue() )
|
|
parent->newDocument ( outputBuffer );
|
|
|
|
XmlDoc *newActiveDoc = parent->getActiveDocument();
|
|
if ( newActiveDoc )
|
|
newActiveDoc->SetFocus();
|
|
}
|
|
|
|
void CommandPanel::OnVariableButton ( wxCommandEvent& event )
|
|
{
|
|
int id = event.GetId();
|
|
wxString label;
|
|
switch ( id )
|
|
{
|
|
case ID_BUTTON_NAME:
|
|
label = name;
|
|
break;
|
|
case ID_BUTTON_PATH:
|
|
label = path;
|
|
break;
|
|
case ID_BUTTON_EXTENSION:
|
|
label = extension;
|
|
break;
|
|
case ID_BUTTON_FULLPATH:
|
|
label = fullpath;
|
|
break;
|
|
default:
|
|
label = wxEmptyString;
|
|
return;
|
|
}
|
|
long to, from;
|
|
commandEdit->GetSelection ( &from, &to );
|
|
commandEdit->Replace ( from, to, label );
|
|
commandEdit->SetFocus();
|
|
}
|
|
|
|
void CommandPanel::focusOnCommand()
|
|
{
|
|
commandEdit->SelectAll();
|
|
commandEdit->SetFocus();
|
|
}
|
|
|
|
bool CommandPanel::getSync()
|
|
{
|
|
return syncBox->GetValue();
|
|
}
|
|
|
|
int CommandPanel::getOutput()
|
|
{
|
|
if ( outputIgnore->GetValue() )
|
|
return ID_COMMAND_OUTPUT_IGNORE;
|
|
else if ( outputInsert->GetValue() )
|
|
return ID_COMMAND_OUTPUT_INSERT;
|
|
else if ( outputNewDocument->GetValue() )
|
|
return ID_COMMAND_OUTPUT_NEW_DOCUMENT;
|
|
else
|
|
return ID_COMMAND_OUTPUT_IGNORE; // default
|
|
}
|
|
|
|
wxString CommandPanel::getCommand()
|
|
{
|
|
return commandEdit->GetValue();
|
|
}
|
|
|
|
void CommandPanel::OnIdle ( wxIdleEvent& event )
|
|
{
|
|
bool b = getSync();
|
|
outputIgnore->Enable ( b );
|
|
outputInsert->Enable ( b );
|
|
outputNewDocument->Enable ( b );
|
|
}
|
|
|
|
void CommandPanel::OnCharHook ( wxKeyEvent& event )
|
|
{
|
|
if ( event.GetKeyCode() == WXK_ESCAPE && event.GetModifiers() == 0 )
|
|
( ( MyFrame* ) GetParent() )->closeCommandPane();
|
|
else
|
|
event.Skip();
|
|
}
|