edit.cxx
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:17k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * edit.cxx
  3.  *
  4.  * Resource Editor
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: edit.cxx,v $
  30.  * Revision 1.3  1998/09/26 01:24:07  robertj
  31.  * Added open source license
  32.  *
  33.  * Revision 1.2  1996/01/23 13:32:42  robertj
  34.  * More changes for editor
  35.  *
  36.  * Revision 1.1  1995/12/23 03:52:17  robertj
  37.  * Initial revision
  38.  *
  39.  */
  40. #include <pwlib.h>
  41. #include "pwrc.h"
  42. #include "splitter.h"
  43. #include "ansiterm.h"
  44. #include "resource.h"
  45. #if defined (YYDEBUG)
  46. extern int yydebug;
  47. #endif
  48. ///////////////////////////////////////////////////////////////////////////////
  49. // MDI child window class for listing resources
  50. PDECLARE_CLASS(ResourceWindow, PMDIDocWindow)
  51.   public:
  52.     ResourceWindow(PMDIFrameWindow * parent,
  53.                                     const PString & title, ResourceFile * res);
  54.     ~ResourceWindow();
  55.   private:
  56.     virtual void OnResize(const PDim & newSize, ResizeType type);
  57.     ResourceFile   * resfile;
  58.     PSplitter      * splitter;
  59.     PDECLARE_CLASS(ResTypeListBox, PListBox)
  60.       ResTypeListBox(PInteractor *, const PNotifier &);
  61.       virtual void OnDrawEntry(PINDEX index, PObject & obj, PCanvas & canvas,
  62.                            const PRect & rect, BOOL hasFocus, BOOL isSelected);
  63.       virtual PDim OnMeasureEntry(PINDEX index,PObject & obj,PCanvas & canvas);
  64.       ResourceList * GetResourceList() const;
  65.     };
  66.     PDECLARE_NOTIFIER(ResTypeListBox, ResourceWindow, OnSelectResType);
  67.     ResTypeListBox * resType;
  68.     PDECLARE_CLASS(ResourceListBox, PListBox)
  69.       ResourceListBox(PInteractor *, const PNotifier &);
  70.       virtual void OnDrawEntry(PINDEX index, PObject & obj, PCanvas & canvas,
  71.                            const PRect & rect, BOOL hasFocus, BOOL isSelected);
  72.       virtual PDim OnMeasureEntry(PINDEX index,PObject & obj,PCanvas & canvas);
  73.       ResourceObject * GetResourceObject() const;
  74.     };
  75.     PDECLARE_NOTIFIER(ResourceListBox, ResourceWindow, OnSelectResource);
  76.     ResourceListBox * resIDs;
  77. };
  78. ///////////////////////////////////////////////////////////////////////////////
  79. // MDI child window class for editing a particular resource
  80. PDECLARE_CLASS(ResourceEditor, PMDIDocWindow)
  81.   public:
  82.     ResourceEditor(PMDIFrameWindow * parent,
  83.            PRESOURCE_ID title, ResourceFile & file, ResourceObject & resource);
  84.   protected:
  85.     PComboBox * identifier;
  86. };
  87. ///////////////////////////////////////////////////////////////////////////////
  88. // MDI child window class for editing strings
  89. PDECLARE_CLASS(StringEditor, ResourceEditor)
  90.   public:
  91.     StringEditor(PMDIFrameWindow * parent,
  92.                                     ResourceFile & file, StringResource & res);
  93.   private:
  94.     StringResource    & resource;
  95.     PMultiLineEditBox * string;
  96. };
  97. ///////////////////////////////////////////////////////////////////////////////
  98. // MDI child window class for editing menus
  99. PDECLARE_CLASS(MenuEditor, ResourceEditor)
  100.   public:
  101.     MenuEditor(PMDIFrameWindow * parent, ResourceFile & file, MenuBar & res);
  102.   private:
  103.     MenuBar & resource;
  104. };
  105. ///////////////////////////////////////////////////////////////////////////////
  106. // MDI child window class for editing layouts
  107. PDECLARE_CLASS(LayoutEditor, ResourceEditor)
  108.   public:
  109.     LayoutEditor(PMDIFrameWindow * parent, ResourceFile & file, Layout & res);
  110.   private:
  111.     Layout & resource;
  112. };
  113. ///////////////////////////////////////////////////////////////////////////////
  114. // MDI child window class for editing pixels
  115. PDECLARE_CLASS(PixelEditor, ResourceEditor)
  116.   public:
  117.     PixelEditor(PMDIFrameWindow * parent,
  118.                                      ResourceFile & file, PixelResource & res);
  119.   private:
  120.     PixelResource & resource;
  121. };
  122. ///////////////////////////////////////////////////////////////////////////////
  123. // MDI child window class for editing arbitrary data resources
  124. PDECLARE_CLASS(DataEditor, ResourceEditor)
  125.   public:
  126.     DataEditor(PMDIFrameWindow * parent,
  127.                                       ResourceFile & file, DataResource & res);
  128.   private:
  129.     DataResource & resource;
  130. };
  131. ///////////////////////////////////////////////////////////////////////////////
  132. // MDI child window class for listing errors
  133. PDECLARE_CLASS(ErrorWindow, PMDIDocWindow)
  134.   public:
  135.     ErrorWindow(PMDIFrameWindow * parent);
  136.     ~ErrorWindow();
  137.   private:
  138.     virtual void OnResize(const PDim & newSize, ResizeType type);
  139.     PScroller      * scroller;
  140.     PTerminal      * terminal;
  141.     ostream        * oldError;
  142.     PTerminalChannel channel;
  143. };
  144. ///////////////////////////////////////////////////////////////////////////////
  145. // Main MDI frame window class
  146. PDECLARE_CLASS(MainWindow, PMDIFrameWindow)
  147.   public:
  148.     MainWindow(const PArgList & args);
  149.     PDECLARE_COMMAND("Open", MainWindow, OpenCmd);
  150.     PDECLARE_COMMAND("Exit", MainWindow, ExitCmd);
  151.   private:
  152.     virtual void OnResize(const PDim & newSize, ResizeType type);
  153.     void OpenResFile(const PString & filename);
  154.     ErrorWindow * error;
  155.   friend ErrorWindow::~ErrorWindow();
  156. };
  157. #define new PNEW
  158. ///////////////////////////////////////////////////////////////////////////////
  159. // MDI child window class for listing resources
  160. ResourceWindow::ResourceWindow(PMDIFrameWindow * parent,
  161.                                      const PString & title, ResourceFile * res)
  162.   : PMDIDocWindow(parent, title),
  163.     resfile(res)
  164. {
  165.   // Set up the frame windows title, icon and menu
  166.   SetIcon(PIcon(IDI_APPICON));
  167.   splitter = new PVerticalSplitter(this);
  168.   splitter->SetPercent(25);
  169.   resType = new ResTypeListBox(splitter, PCREATE_NOTIFIER(OnSelectResType));
  170.   resIDs = new ResourceListBox(splitter, PCREATE_NOTIFIER(OnSelectResource));
  171.   for (PINDEX i = 0; i < ResourceList::NumResTypes; i++) {
  172.     if (resfile->resources[i].GetSize() != 0)
  173.       resType->AddEntry(&resfile->resources[i]);
  174.   }
  175.   ShowAll();
  176. }
  177. ResourceWindow::~ResourceWindow()
  178. {
  179.   resIDs->DeleteAllEntries();
  180.   resType->DeleteAllEntries();
  181.   delete resfile;
  182. }
  183. void ResourceWindow::OnResize(const PDim & newSize, ResizeType type)
  184. {
  185.   if (type != Iconic) {
  186.     PRect bounds(newSize);
  187.     splitter->AutoAdjustBounds(bounds);
  188.   }
  189. }
  190. ResourceWindow::ResTypeListBox::ResTypeListBox(PInteractor * parent,
  191.                                                const PNotifier & notifier)
  192.   : PListBox(parent, PListBox::Sorted)
  193. {
  194.   SetNotifier(notifier);
  195.   DisallowDeleteObjects();
  196. }
  197. void ResourceWindow::ResTypeListBox::OnDrawEntry(PINDEX , PObject & obj,
  198.                      PCanvas & canvas, const PRect & rect, BOOL hasFocus, BOOL)
  199. {
  200.   int resName[ResourceList::NumResTypes] = {
  201.     IDS_STRING_RES, IDS_MENUBAR_RES, IDS_LAYOUT_RES, IDS_ICON_RES,
  202.     IDS_CURSOR_RES, IDS_PATTERN_RES, IDS_IMAGE_RES, IDS_DATA_RES
  203.   };
  204.   PResourceString str = resName[((ResourceList &)obj).GetType()];
  205.   canvas.DrawRect(rect);
  206.   canvas.DrawTextLine(rect.X()+1, rect.Y(), str, NULL, str.GetLength());
  207.   if (hasFocus)
  208.     canvas.DrawFocusRect(rect);
  209. }
  210. PDim ResourceWindow::ResTypeListBox::OnMeasureEntry(PINDEX index,
  211.                                                PObject & obj, PCanvas & canvas)
  212. {
  213.   return PListBox::OnMeasureEntry(index, obj, canvas);
  214. }
  215. ResourceList * ResourceWindow::ResTypeListBox::GetResourceList() const
  216. {
  217.   PINDEX sel = GetSelection();
  218.   if (sel == P_MAX_INDEX)
  219.     return NULL;
  220.   return (ResourceList *)GetEntry(sel);
  221. }
  222. void ResourceWindow::OnSelectResType(ResTypeListBox & box, INT)
  223. {
  224.   resIDs->DeleteAllEntries();
  225.   ResourceList * resList = box.GetResourceList();
  226.   if (resList != NULL) {
  227.     for (PINDEX i = 0; i < resList->GetSize(); i++)
  228.       resIDs->AddEntry(resList->GetAt(i));
  229.   }
  230. }
  231. ResourceWindow::ResourceListBox::ResourceListBox(PInteractor * parent,
  232.                                                  const PNotifier & notifier)
  233.   : PListBox(parent, PListBox::Sorted)
  234. {
  235.   SetNotifier(notifier);
  236.   DisallowDeleteObjects();
  237. }
  238. void ResourceWindow::ResourceListBox::OnDrawEntry(PINDEX, PObject & obj,
  239.                      PCanvas & canvas, const PRect & rect, BOOL hasFocus, BOOL)
  240. {
  241.   PString str = ((ResourceObject&)obj).GetIDString();
  242.   canvas.DrawRect(rect);
  243.   canvas.DrawTextLine(rect.X()+1, rect.Y(), str, NULL, str.GetLength());
  244.   if (hasFocus)
  245.     canvas.DrawFocusRect(rect);
  246. }
  247. PDim ResourceWindow::ResourceListBox::OnMeasureEntry(PINDEX index,
  248.                                                PObject & obj, PCanvas & canvas)
  249. {
  250.   return PListBox::OnMeasureEntry(index, obj, canvas);
  251. }
  252. ResourceObject * ResourceWindow::ResourceListBox::GetResourceObject() const
  253. {
  254.   PINDEX sel = GetSelection();
  255.   if (sel == P_MAX_INDEX)
  256.     return NULL;
  257.   return (ResourceObject *)GetEntry(sel);
  258. }
  259. void ResourceWindow::OnSelectResource(ResourceListBox & box, INT code)
  260. {
  261.   if (code == PListBox::DoubleClick) {
  262.     ResourceObject * res = box.GetResourceObject();
  263.     if (res != NULL)
  264.       res->EditResource((MainWindow*)parent, resfile);
  265.   }
  266. }
  267. ///////////////////////////////////////////////////////////////////////////////
  268. // MDI child window class for editing a particular resource
  269. ResourceEditor::ResourceEditor(PMDIFrameWindow * parent,
  270.             PRESOURCE_ID title, ResourceFile & file, ResourceObject & resource)
  271.   : PMDIDocWindow(parent, PResourceString(title))
  272. {
  273.   identifier = new PComboBox(this);
  274.   identifier->SetPosition(10, 10);
  275.   identifier->SetDimensions(150, 50);
  276.   identifier->SetText(resource.GetIDString());
  277.   for (PINDEX i = 0; i < file.GetNumDefines(); i++)
  278.     identifier->AddString(file.GetDefineName(i));
  279. }
  280. ///////////////////////////////////////////////////////////////////////////////
  281. // MDI child window class for editing strings
  282. StringEditor::StringEditor(PMDIFrameWindow * parent,
  283.                                      ResourceFile & file, StringResource & res)
  284.   : ResourceEditor(parent, IDS_STRING_EDITOR, file, res),
  285.     resource(res)
  286. {
  287.   string = new PMultiLineEditBox(this);
  288.   string->SetPosition(10, 30);
  289.   string->SetDimensions(150, 50);
  290.   PString str = resource.GetConvertedText();
  291.   for (PINDEX i = 0; i < str.GetLength(); i++)
  292.     if (!isprint(str[i])) {
  293.       str = resource.GetLiteralText();
  294.       break;
  295.     }
  296.   string->SetText(str);
  297.   SetDimensions(170, 90);
  298.   ShowAll();
  299. }
  300. ///////////////////////////////////////////////////////////////////////////////
  301. // MDI child window class for editing menus
  302. MenuEditor::MenuEditor(PMDIFrameWindow * parent,
  303.                                             ResourceFile & file, MenuBar & res)
  304.   : ResourceEditor(parent, IDS_MENU_EDITOR, file, res),
  305.     resource(res)
  306. {
  307. }
  308. ///////////////////////////////////////////////////////////////////////////////
  309. // MDI child window class for editing layouts
  310. LayoutEditor::LayoutEditor(PMDIFrameWindow * parent,
  311.                                              ResourceFile & file, Layout & res)
  312.   : ResourceEditor(parent, IDS_LAYOUT_EDITOR, file, res),
  313.     resource(res)
  314. {
  315. }
  316. ///////////////////////////////////////////////////////////////////////////////
  317. // MDI child window class for editing images
  318. PixelEditor::PixelEditor(PMDIFrameWindow * parent,
  319.                                       ResourceFile & file, PixelResource & res)
  320.   : ResourceEditor(parent, IDS_IMAGE_EDITOR, file, res),
  321.     resource(res)
  322. {
  323. }
  324. ///////////////////////////////////////////////////////////////////////////////
  325. // MDI child window class for editing arbitrary data resources
  326. DataEditor::DataEditor(PMDIFrameWindow * parent,
  327.                                       ResourceFile & file, DataResource & res)
  328.   : ResourceEditor(parent, IDS_DATA_EDITOR, file, res),
  329.     resource(res)
  330. {
  331. }
  332. ///////////////////////////////////////////////////////////////////////////////
  333. // MDI child window class for listing errors
  334. ErrorWindow::ErrorWindow(PMDIFrameWindow * parent)
  335.   : PMDIDocWindow(parent, PResourceString(IDS_ERROR_OUTPUT))
  336. {
  337.   // Set up the frame windows title, icon and menu
  338.   SetIcon(PIcon(IDI_APPICON));
  339.   scroller = new PScroller(this);
  340.   terminal = new PAnsiTerminal(scroller);
  341.   terminal->SetVariableRowColumns(FALSE);
  342.   terminal->SetRows(25);
  343.   terminal->SetColumns(P_MAX_INDEX);
  344.   terminal->SetReturnOnLineFeed(TRUE);
  345.   terminal->SetWrapEOL(TRUE);
  346.   channel.Open(*terminal);
  347.   oldError = PErrorStream;
  348.   PErrorStream = &channel;
  349.   PRect parentBounds = parent->GetDimensions(TRUE);
  350.   SetDimensions(10, parentBounds.Height()/4, TRUE);
  351.   AutoAdjustBounds(parentBounds, AdjustBottom);
  352.   ShowAll();
  353. }
  354. ErrorWindow::~ErrorWindow()
  355. {
  356.   PErrorStream = oldError;
  357.   ((MainWindow*)parent)->error = NULL;
  358. }
  359. void ErrorWindow::OnResize(const PDim & newSize, ResizeType type)
  360. {
  361.   if (type != Iconic) {
  362.     PRect bounds(newSize);
  363.     scroller->AutoAdjustBounds(bounds);
  364.   }
  365. }
  366. ///////////////////////////////////////////////////////////////////////////////
  367. // Main MDI frame window class
  368. MainWindow::MainWindow(const PArgList & args)
  369. {
  370.   error = NULL;
  371.   // Set up the frame windows title, icon and menu
  372.   SetTitle(PResourceString(IDS_TITLE));
  373.   SetIcon(PIcon(IDI_APPICON));
  374.   SetMenu(new MainMenu());
  375.   ShowAll();
  376.   Update();
  377.   IncludePath[0] = "d:\Work\PWLib\common";
  378.   IncludePath[1] = "d:\Work\PWLib\mswin\include";
  379.   if (args.GetCount() == 0)
  380.     OpenCmd();
  381.   else {
  382.     for (PINDEX i = 0; i < args.GetCount(); i++)
  383.       OpenResFile(args[i]);
  384.   }
  385. }
  386. void MainWindow::OnResize(const PDim & newSize, ResizeType type)
  387. {
  388.   if (type != Iconic) {
  389.     PRect bounds(newSize);
  390. //    statusBar->AutoAdjustBounds(bounds, AdjustBottom);
  391.     SetDocumentArea(bounds);
  392.   }
  393. }
  394. void MainWindow::ExitCmd()
  395. {
  396.   Close();
  397. }
  398. void MainWindow::OpenCmd()
  399. {
  400.   POpenFileDialog dlg(this);
  401.   dlg.AddFileType(".prc");
  402.   if (dlg.RunModal())
  403.     OpenResFile(dlg.GetFile());
  404. }
  405. void MainWindow::OpenResFile(const PString & filename)
  406. {
  407.   PFilePath path = filename;
  408.   if (path.GetType().IsEmpty())
  409.     path += ".prc";
  410.   // attempt to open the input file
  411.   PTextFile prcfile = path;
  412.   if (!prcfile.Open(PFile::ReadOnly)) {
  413.     PSimpleDialog::Error(this, "Cannot open "" +
  414.                       prcfile.GetFilePath() + "" :" + prcfile.GetErrorText());
  415.     return;
  416.   }
  417.   if (error == NULL)
  418.     error = new ErrorWindow(this);
  419.   ResourceFile * resfile = new ResourceFile(prcfile);
  420.   if (resfile->Warnings() == 0 && resfile->Fatals() == 0)
  421.     PError << "Portable resource compilation successful.n" << endl;
  422.   else {
  423.     PError << resfile->Warnings() << " warnings(s)" << endl;
  424.     PError << resfile->Fatals() << " error(s)n" << endl;
  425.   }
  426.   if (resfile->Fatals() != 0)
  427.     delete resfile;
  428.   else {
  429.     ResourceWindow * wnd = new ResourceWindow(this, path.GetTitle(), resfile);
  430.     wnd->Activate();
  431.   }
  432. }
  433. ///////////////////////////////////////////////////////////////////////////////
  434. // Application class
  435. #undef new
  436. PDECLARE_CLASS(PwreApp, PApplication)
  437.   virtual void Main();
  438.   virtual void OnAbout();
  439. };
  440. PwreApp App;
  441. void PwreApp::Main()
  442. {
  443.   new MainWindow(GetArguments());
  444.   PApplication::Main();
  445. }
  446. void PwreApp::OnAbout()
  447. {
  448.   AboutDialog dlg(mainWindow);
  449.   dlg.RunModal();
  450. }
  451. ///////////////////////////////////////////////////////////////////////////////
  452. // Application class
  453. void StringResource::EditResource(MainWindow * parent, ResourceFile * resfile)
  454. {
  455.   PNEW StringEditor(parent, *resfile, *this);
  456. }
  457. void MenuBar::EditResource(MainWindow * parent, ResourceFile * resfile)
  458. {
  459.   PNEW MenuEditor(parent, *resfile, *this);
  460. }
  461. void Layout::EditResource(MainWindow * parent, ResourceFile * resfile)
  462. {
  463.   PNEW LayoutEditor(parent, *resfile, *this);
  464. }
  465. void Icon::EditResource(MainWindow * parent, ResourceFile * resfile)
  466. {
  467.   PNEW PixelEditor(parent, *resfile, *this);
  468. }
  469. void Cursor::EditResource(MainWindow * parent, ResourceFile * resfile)
  470. {
  471.   PNEW PixelEditor(parent, *resfile, *this);
  472. }
  473. void Pattern::EditResource(MainWindow * parent, ResourceFile * resfile)
  474. {
  475.   PNEW PixelEditor(parent, *resfile, *this);
  476. }
  477. void Image::EditResource(MainWindow * parent, ResourceFile * resfile)
  478. {
  479.   PNEW PixelEditor(parent, *resfile, *this);
  480. }
  481. void DataResource::EditResource(MainWindow * parent, ResourceFile * resfile)
  482. {
  483.   PNEW DataEditor(parent, *resfile, *this);
  484. }
  485. // EDIT.CXX