OpenASIP  2.0
FUPortDialog.cc
Go to the documentation of this file.
1 /*
2  Copyright (c) 2002-2009 Tampere University.
3 
4  This file is part of TTA-Based Codesign Environment (TCE).
5 
6  Permission is hereby granted, free of charge, to any person obtaining a
7  copy of this software and associated documentation files (the "Software"),
8  to deal in the Software without restriction, including without limitation
9  the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  and/or sell copies of the Software, and to permit persons to whom the
11  Software is furnished to do so, subject to the following conditions:
12 
13  The above copyright notice and this permission notice shall be included in
14  all copies or substantial portions of the Software.
15 
16  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  DEALINGS IN THE SOFTWARE.
23  */
24 /**
25  * @file FUPortDialog.cc
26  *
27  * Definition of FUPortDialog class.
28  *
29  * @author Veli-Pekka Jääskeläinen 2004 (vjaaskel-no.spam-cs.tut.fi)
30  * @note rating: red
31  */
32 
33 #include <string>
34 #include <wx/wx.h>
35 #include <wx/statline.h>
36 #include <wx/spinctrl.h>
37 #include <wx/valgen.h>
38 #include <boost/format.hpp>
39 
40 #include "Application.hh"
41 #include "FUPort.hh"
42 #include "FUPortDialog.hh"
43 #include "WxConversion.hh"
44 #include "Conversion.hh"
45 #include "ModelConstants.hh"
46 #include "ProDeConstants.hh"
47 #include "ProDeTextGenerator.hh"
48 #include "Socket.hh"
49 #include "Machine.hh"
50 #include "MachineTester.hh"
51 #include "WarningDialog.hh"
52 #include "UserManualCmd.hh"
53 #include "InformationDialog.hh"
54 #include "GUITextGenerator.hh"
55 #include "WidgetTools.hh"
56 
57 using boost::format;
58 using std::string;
59 using namespace TTAMachine;
60 
61 BEGIN_EVENT_TABLE(FUPortDialog, wxDialog)
62  EVT_TEXT(ID_NAME, FUPortDialog::onName)
65  EVT_CHOICE(ID_INPUT_SOCKET, FUPortDialog::onSocketChoice)
66  EVT_CHOICE(ID_OUTPUT_SOCKET, FUPortDialog::onSocketChoice)
68 
69 
70 /**
71  * The Constructor.
72  *
73  * @param parent Parent window of the dialog.
74  * @param port Port to modify.
75  */
77  wxWindow* parent,
78  FUPort* port):
79  wxDialog(parent, -1, _T(""), wxDefaultPosition),
80  port_(port),
81  name_(_T("")),
83  triggers_(false),
84  inputSocketChoice_(NULL),
85  outputSocketChoice_(NULL) {
86 
87  oldInput_ = port_->inputSocket();
88  oldOutput_ = port_->outputSocket();
89 
90  createContents(this, true, true);
91 
92  inputSocketChoice_ = dynamic_cast<wxChoice*>(FindWindow(ID_INPUT_SOCKET));
93  outputSocketChoice_ = dynamic_cast<wxChoice*>(FindWindow(ID_OUTPUT_SOCKET));
94  FindWindow(ID_NAME)->SetValidator(wxTextValidator(wxFILTER_ASCII, &name_));
95  FindWindow(ID_TRIGGERS)->SetValidator(wxGenericValidator(&triggers_));
96  FindWindow(ID_WIDTH)->SetValidator(wxGenericValidator(&width_));
97 
98  FindWindow(wxID_OK)->Disable();
99 
100  // set texts to widgets
101  setTexts();
102 
103  TransferDataToWindow();
104 }
105 
106 /**
107  * The Destructor.
108  */
110 }
111 
112 
113 /**
114  * Sets texts for widgets.
115  */
116 void
120 
121  // Dialog title
122  format fmt = prodeTexts->text(
124  SetTitle(WxConversion::toWxString(fmt.str()));
125 
126  // buttons
127  WidgetTools::setLabel(generator, FindWindow(wxID_OK),
129 
130  WidgetTools::setLabel(generator, FindWindow(wxID_CANCEL),
132 
133  WidgetTools::setLabel(generator, FindWindow(ID_HELP),
135 
136  // widget labels
137  WidgetTools::setLabel(prodeTexts, FindWindow(ID_LABEL_NAME),
139 
140  WidgetTools::setLabel(prodeTexts, FindWindow(ID_LABEL_WIDTH),
142 
143  WidgetTools::setLabel(prodeTexts, FindWindow(ID_LABEL_INPUT_SOCKET),
145 
146  WidgetTools::setLabel(prodeTexts, FindWindow(ID_LABEL_OUTPUT_SOCKET),
148 
149  WidgetTools::setLabel(prodeTexts, FindWindow(ID_TRIGGERS),
151 }
152 
153 
154 /**
155  * Transfers data from the port object to the dialog widgets.
156  *
157  * @return False, if an error occured in the transfer.
158 */
159 bool
161  name_ = WxConversion::toWxString(port_->name());
162  width_ = port_->width();
163  triggers_ = port_->isTriggering();
164  updateSockets();
165 
166  // wxWidgets GTK1 version seems to bug with spincontrol and
167  // checkbox validators. The widget value has to be set manually.
168  dynamic_cast<wxSpinCtrl*>(FindWindow(ID_WIDTH))->SetValue(width_);
169  dynamic_cast<wxCheckBox*>(FindWindow(ID_TRIGGERS))->SetValue(triggers_);
170 
171  return wxWindow::TransferDataToWindow();
172 }
173 
174 
175 /**
176  * Updates input and output socket choicers.
177  */
178 void
180 
181  inputSocketChoice_->Clear();
182  inputSocketChoice_->Append(ProDeConstants::NONE);
183  outputSocketChoice_->Clear();
184  outputSocketChoice_->Append(ProDeConstants::NONE);
185 
186  MachineTester tester(*(port_->parentUnit()->machine()));
187 
188  // Add ports to the choicers
189  Machine::SocketNavigator navigator =
190  port_->parentUnit()->machine()->socketNavigator();
191 
192  for (int i = 0; i < navigator.count(); i++) {
193  Socket* socket = navigator.item(i);
194  wxString socketName = WxConversion::toWxString(socket->name());
195 
196  // Add available input sockets.
197  Socket* input = port_->inputSocket();
198  if (input != NULL) {
199  port_->detachSocket(*input);
200  }
201  bool legal = tester.canConnect(*socket, *port_);
202  if (legal && socket->direction() == Socket::INPUT) {
203  inputSocketChoice_->Append(socketName);
204  }
205  if (input != NULL) {
206  port_->attachSocket(*input);
207  }
208 
209  // Add available output sockets.
210  Socket* output = port_->outputSocket();
211  if (output != NULL) {
212  port_->detachSocket(*output);
213  }
214  legal = tester.canConnect(*socket, *port_);
215  if (legal && socket->direction() == Socket::OUTPUT) {
216  outputSocketChoice_->Append(socketName);
217  }
218  if (output != NULL) {
219  port_->attachSocket(*output);
220  }
221  // ignore sockets with unknown direction
222  }
223 
224  // set input socket choice
225  if (port_->inputSocket() == NULL) {
226  inputSocketChoice_->SetStringSelection(ProDeConstants::NONE);
227  } else {
228  wxString socketName =
229  WxConversion::toWxString(port_->inputSocket()->name());
230  inputSocketChoice_->SetStringSelection(socketName);
231  }
232 
233  // set output socket choice
234  if (port_->outputSocket() == NULL) {
235  outputSocketChoice_->SetStringSelection(ProDeConstants::NONE);
236  } else {
237  wxString socketName =
238  WxConversion::toWxString(port_->outputSocket()->name());
239  outputSocketChoice_->SetStringSelection(socketName);
240  }
241 }
242 
243 
244 /**
245  * Resets the original input and output sockets for the port and closes
246  * the dialog.
247  */
248 void
249 FUPortDialog::onCancel(wxCommandEvent&) {
250  port_->detachAllSockets();
251  if (oldInput_ != NULL) {
252  port_->attachSocket(*oldInput_);
253  }
254  if (oldOutput_ != NULL) {
255  port_->attachSocket(*oldOutput_);
256  }
257  EndModal(wxID_CANCEL);
258 }
259 
260 
261 /**
262  * Validates input in the controls, and updates the port object.
263  */
264 void
265 FUPortDialog::onOK(wxCommandEvent&) {
266 
267  if (!Validate()) {
268  return;
269  }
270 
271  if (!TransferDataFromWindow()) {
272  return;
273  }
274 
275  // check whether FU already has a port of tht name.
276 
277  string trimmedName =
278  WxConversion::toString(name_.Trim(false).Trim(true));
279 
280  // Check the name validity.
281  if (!MachineTester::isValidComponentName(trimmedName)) {
283  format message =
285  InformationDialog warning(
286  this, WxConversion::toWxString(message.str()));
287  warning.ShowModal();
288  return;
289  }
290 
291  if (port_->name() != trimmedName) {
292  FunctionUnit* fu = port_->parentUnit();
293  for (int i = 0; i < fu->portCount(); i++) {
294  string name = fu->port(i)->name();
295  if (name == WxConversion::toString(name_)) {
296  ProDeTextGenerator* prodeTexts =
298  format message =
300  format a_port =
302  format machine =
304  format port =
305  prodeTexts->text(ProDeTextGenerator::COMP_PORT);
306  message % trimmedName % a_port.str() % machine.str() %
307  port.str();
308  WarningDialog warning(
309  this, WxConversion::toWxString(message.str()));
310  warning.ShowModal();
311  return;
312  }
313  }
314  }
315 
316  // update attributes
317  port_->setName(trimmedName);
318  port_->setTriggering(triggers_);
319  port_->setWidth(width_);
320 
321  EndModal(wxID_OK);
322 }
323 
324 /**
325  * Updates the port object when user changes input/output socket selection.
326  */
327 void
329  port_->detachAllSockets();
330  Machine::SocketNavigator navigator =
331  port_->parentUnit()->machine()->socketNavigator();
332 
333  // set input socket
334  string inputSocketName =
335  WxConversion::toString(inputSocketChoice_->GetStringSelection());
336  if (inputSocketName != WxConversion::toString(ProDeConstants::NONE)) {
337  port_->attachSocket(*(navigator.item(inputSocketName)));
338  }
339 
340  // set output socket
341  string outputSocketName =
342  WxConversion::toString(outputSocketChoice_->GetStringSelection());
343  if (outputSocketName != WxConversion::toString(ProDeConstants::NONE)) {
344  port_->attachSocket(*(navigator.item(outputSocketName)));
345  }
346  updateSockets();
347 }
348 
349 
350 /**
351  * Disables OK-button if the name field is empty.
352  */
353 void
354 FUPortDialog::onName(wxCommandEvent&) {
355  if (!TransferDataFromWindow()) {
356  assert(false);
357  }
358  wxString trimmedName = name_.Trim(false).Trim(true);
359  if (trimmedName == _T("")) {
360  FindWindow(wxID_OK)->Disable();
361  } else {
362  FindWindow(wxID_OK)->Enable();
363  }
364 }
365 
366 
367 /**
368  * Creates contents of the dialog window. Initially generated with
369  * wxDesigner, the code will be cleaned up later.
370  *
371  * @param parent Parent dialog of the contents.
372  * @param call_fit If true, fits sizer in dialog window.
373  * @param set_sizer If true, sets sizer as dialog's sizer.
374  * @return Top level sizer of the contents.
375  */
376 wxSizer*
378  wxWindow *parent, bool call_fit, bool set_sizer) {
379 
380  wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
381 
382  wxFlexGridSizer *item1 = new wxFlexGridSizer( 2, 0, 0 );
383 
384  wxStaticText *item2 = new wxStaticText( parent, ID_LABEL_NAME, wxT("Name:"), wxDefaultPosition, wxDefaultSize, 0 );
385  item1->Add( item2, 0, wxALIGN_RIGHT|wxALL, 5 );
386 
387  wxTextCtrl *item3 = new wxTextCtrl( parent, ID_NAME, wxT(""), wxDefaultPosition, wxSize(200,-1), 0 );
388  item1->Add( item3, 0, wxALIGN_CENTER|wxALL, 5 );
389 
390  wxStaticText *item4 = new wxStaticText( parent, ID_LABEL_WIDTH, wxT("Width:"), wxDefaultPosition, wxDefaultSize, 0 );
391  item1->Add( item4, 0, wxALIGN_RIGHT|wxALL, 5 );
392 
393  wxSpinCtrl *item5 = new wxSpinCtrl( parent, ID_WIDTH, wxT("1"), wxDefaultPosition, wxSize(-1,-1), 0, 1, 10000, 1 );
394  item1->Add( item5, 0, wxALIGN_CENTER|wxALL, 5 );
395 
396  wxStaticText *item6 = new wxStaticText( parent, ID_LABEL_INPUT_SOCKET, wxT("Input Socket:"), wxDefaultPosition, wxDefaultSize, 0 );
397  item1->Add( item6, 0, wxALIGN_RIGHT|wxALL, 5 );
398 
399  wxString strs7[] =
400  {
401  wxT("NONE")
402  };
403  wxChoice *item7 = new wxChoice( parent, ID_INPUT_SOCKET, wxDefaultPosition, wxSize(200,-1), 1, strs7, 0 );
404  item1->Add( item7, 0, wxALIGN_CENTER|wxALL, 5 );
405 
406  wxStaticText *item8 = new wxStaticText( parent, ID_LABEL_OUTPUT_SOCKET, wxT("Output Socket:"), wxDefaultPosition, wxDefaultSize, 0 );
407  item1->Add( item8, 0, wxALIGN_RIGHT|wxALL, 5 );
408 
409  wxString strs9[] =
410  {
411  wxT("NONE")
412  };
413  wxChoice *item9 = new wxChoice( parent, ID_OUTPUT_SOCKET, wxDefaultPosition, wxSize(200,-1), 1, strs9, 0 );
414  item1->Add( item9, 0, wxALIGN_CENTER|wxALL, 5 );
415 
416  item0->Add( item1, 0, wxALIGN_CENTER|wxALL, 5 );
417 
418  wxBoxSizer *item10 = new wxBoxSizer( wxHORIZONTAL );
419 
420  wxCheckBox *item11 = new wxCheckBox( parent, ID_TRIGGERS, wxT("Triggers"), wxDefaultPosition, wxDefaultSize, 0 );
421  item10->Add( item11, 0, wxALIGN_CENTER|wxALL, 5 );
422 
423  item0->Add( item10, 0, wxALL, 5 );
424 
425  wxStaticLine *item12 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
426  item0->Add( item12, 0, wxGROW|wxALL, 5 );
427 
428  wxBoxSizer *item13 = new wxBoxSizer( wxHORIZONTAL );
429 
430  wxButton *item14 = new wxButton( parent, ID_HELP, wxT("&Help"), wxDefaultPosition, wxDefaultSize, 0 );
431  item13->Add( item14, 0, wxALIGN_CENTER|wxALL, 5 );
432 
433  wxButton *item15 = new wxButton( parent, wxID_OK, wxT("&OK"), wxDefaultPosition, wxDefaultSize, 0 );
434  item13->Add( item15, 0, wxALIGN_CENTER|wxALL, 5 );
435 
436  wxButton *item16 = new wxButton( parent, wxID_CANCEL, wxT("&Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
437  item13->Add( item16, 0, wxALIGN_CENTER|wxALL, 5 );
438 
439  item0->Add( item13, 0, wxALIGN_CENTER|wxALL, 5 );
440 
441  if (set_sizer)
442  {
443  parent->SetSizer( item0 );
444  if (call_fit)
445  item0->SetSizeHints( parent );
446  }
447 
448  return item0;
449 }
MachineTester::canConnect
virtual bool canConnect(const TTAMachine::Socket &socket, const TTAMachine::Segment &segment)
Definition: MachineTester.cc:86
WarningDialog
Definition: WarningDialog.hh:42
ProDeTextGenerator::TXT_FU_PORT_DIALOG_TITLE
@ TXT_FU_PORT_DIALOG_TITLE
Function unit port dialog title.
Definition: ProDeTextGenerator.hh:192
FUPortDialog::updateSockets
void updateSockets()
Definition: FUPortDialog.cc:179
WxConversion::toWxString
static wxString toWxString(const std::string &source)
FUPortDialog::onSocketChoice
void onSocketChoice(wxCommandEvent &event)
Definition: FUPortDialog.cc:328
TTAMachine::Component::name
virtual TCEString name() const
Definition: MachinePart.cc:125
FUPortDialog::onOK
void onOK(wxCommandEvent &event)
Definition: FUPortDialog.cc:265
FUPortDialog.hh
machine
TTAMachine::Machine * machine
the architecture definition of the estimated processor
Definition: EstimatorCmdLineUI.cc:59
DEFAULT_WIDTH
const int DEFAULT_WIDTH
Default window width.
Definition: GUIOptionsSerializer.cc:98
TTAMachine::Socket::OUTPUT
@ OUTPUT
Data goes from port to bus.
Definition: Socket.hh:60
WidgetTools::setLabel
static void setLabel(Texts::TextGenerator *generator, wxWindow *widget, int textID)
Definition: WidgetTools.cc:92
GUITextGenerator::instance
static GUITextGenerator * instance()
Definition: GUITextGenerator.cc:67
ProDeTextGenerator::TXT_LABEL_INPUT_SOCKET
@ TXT_LABEL_INPUT_SOCKET
Label for input socket selector.
Definition: ProDeTextGenerator.hh:61
GUITextGenerator
Definition: GUITextGenerator.hh:46
GUITextGenerator::TXT_BUTTON_HELP
@ TXT_BUTTON_HELP
Label for help button.
Definition: GUITextGenerator.hh:60
ModelConstants
Definition: ModelConstants.hh:40
WidgetTools.hh
TTAMachine::FunctionUnit::port
virtual BaseFUPort * port(const std::string &name) const
Definition: FunctionUnit.cc:145
FindWindow
Definition: FindWindow.hh:49
TTAMachine::Machine::Navigator::count
int count() const
Texts::TextGenerator::text
virtual boost::format text(int textId)
Definition: TextGenerator.cc:94
TTAMachine::Socket::direction
Direction direction() const
FUPortDialog::onName
void onName(wxCommandEvent &event)
Definition: FUPortDialog.cc:354
Socket.hh
ProDeTextGenerator.hh
ProDeTextGenerator
Definition: ProDeTextGenerator.hh:49
ProDeTextGenerator::MSG_ERROR_ILLEGAL_NAME
@ MSG_ERROR_ILLEGAL_NAME
Error: Illegal component name.
Definition: ProDeTextGenerator.hh:223
FUPortDialog::onCancel
void onCancel(wxCommandEvent &event)
Definition: FUPortDialog.cc:249
ProDeTextGenerator::MSG_ERROR_SAME_NAME
@ MSG_ERROR_SAME_NAME
Error: Same name exists.
Definition: ProDeTextGenerator.hh:229
ProDeTextGenerator::COMP_FUNCTION_UNIT
@ COMP_FUNCTION_UNIT
Name for FU (w/o article).
Definition: ProDeTextGenerator.hh:263
assert
#define assert(condition)
Definition: Application.hh:86
TTAMachine::FunctionUnit
Definition: FunctionUnit.hh:55
TTAMachine::FUPort
Definition: FUPort.hh:46
FUPortDialog::TransferDataToWindow
virtual bool TransferDataToWindow()
Definition: FUPortDialog.cc:160
GUITextGenerator::TXT_BUTTON_CANCEL
@ TXT_BUTTON_CANCEL
Label for cancel button.
Definition: GUITextGenerator.hh:55
WarningDialog.hh
Conversion.hh
InformationDialog.hh
ProDeTextGenerator::COMP_A_PORT
@ COMP_A_PORT
Name for port (w/ article).
Definition: ProDeTextGenerator.hh:270
Application.hh
TTAMachine::Socket
Definition: Socket.hh:53
ProDeTextGenerator::TXT_LABEL_NAME
@ TXT_LABEL_NAME
Label for component name widget.
Definition: ProDeTextGenerator.hh:56
ModelConstants.hh
Machine.hh
MachineTester::isValidComponentName
static bool isValidComponentName(const std::string &name)
Definition: MachineTester.cc:312
TTAMachine::Unit::portCount
virtual int portCount() const
Definition: Unit.cc:135
FUPortDialog::~FUPortDialog
~FUPortDialog()
Definition: FUPortDialog.cc:109
ProDeConstants.hh
GUITextGenerator.hh
MachineTester.hh
ProDeTextGenerator::instance
static ProDeTextGenerator * instance()
Definition: ProDeTextGenerator.cc:382
EVT_BUTTON
EVT_BUTTON(ID_EDIT_ARCH_PORT, FUImplementationDialog::onEditArchitecturePort) EVT_BUTTON(ID_ADD_EXTERNAL_PORT
false
find Finds info of the inner loops in the false
Definition: InnerLoopFinder.cc:81
FUPortDialog::createContents
wxSizer * createContents(wxWindow *parent, bool call_fit, bool set_sizer)
Definition: FUPortDialog.cc:377
TTAMachine::Port::name
virtual std::string name() const
Definition: Port.cc:141
FUPort.hh
ProDeTextGenerator::TXT_LABEL_OUTPUT_SOCKET
@ TXT_LABEL_OUTPUT_SOCKET
Label for output socket selector.
Definition: ProDeTextGenerator.hh:62
WxConversion.hh
TTAMachine::Machine::Navigator::item
ComponentType * item(int index) const
InformationDialog
Definition: InformationDialog.hh:42
TTAMachine
Definition: Assembler.hh:48
ProDeTextGenerator::COMP_PORT
@ COMP_PORT
Name for port (w/o article).
Definition: ProDeTextGenerator.hh:271
FUPortDialog::setTexts
void setTexts()
Definition: FUPortDialog.cc:117
ProDeConstants::NONE
static const wxString NONE
Constant for "None".
Definition: ProDeConstants.hh:56
MachineTester
Definition: MachineTester.hh:46
ProDeTextGenerator::TXT_LABEL_WIDTH
@ TXT_LABEL_WIDTH
Label for bit width widget.
Definition: ProDeTextGenerator.hh:57
WxConversion::toString
static std::string toString(const wxString &source)
FUPortDialog
Definition: FUPortDialog.hh:44
TTAMachine::Machine::Navigator
Definition: Machine.hh:186
UserManualCmd.hh
END_EVENT_TABLE
END_EVENT_TABLE() using namespace IDF
ProDeTextGenerator::TXT_LABEL_TRIGGERS
@ TXT_LABEL_TRIGGERS
Label for 'triggers' checkbox.
Definition: ProDeTextGenerator.hh:78
TTAMachine::Socket::INPUT
@ INPUT
Data goes from bus to port.
Definition: Socket.hh:59
GUITextGenerator::TXT_BUTTON_OK
@ TXT_BUTTON_OK
Label for OK button.
Definition: GUITextGenerator.hh:59