[haiku-commits] haiku: hrev45326 - src/apps/resourceedit data/artwork/icons src/apps/resourceedit/edits src/apps/resourceedit/support

  • From: mattmadia@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 28 Feb 2013 23:06:30 +0100 (CET)

hrev45326 adds 3 changesets to branch 'master'
old head: 9e3038ae8eed496cd7ca5a82c9754b9ec62c1750
new head: 9590a81c9cd728292b2770b4a08aaeea1f589ed6
overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=9590a81+%5E9e3038a

----------------------------------------------------------------------------

49126a0: Added ResourceEdit and modified BColumnListView, BRow and BMenu.
  
  Signed-off-by: Matt Madia <mattmadia@xxxxxxxxx>

                                       [ Tri-Edge AI <triedgeai@xxxxxxxxx> ]

dc4fe6b: Extended ResourceEdit.
  
  Signed-off-by: Matt Madia <mattmadia@xxxxxxxxx>

                                       [ Tri-Edge AI <triedgeai@xxxxxxxxx> ]

9590a81: GCC 4 build fix. Suggested by leavengood.
  
  Closes #968.

                                        [ Matt Madia <mattmadia@xxxxxxxxx> ]

----------------------------------------------------------------------------

40 files changed, 3527 insertions(+), 3 deletions(-)
data/artwork/icons/App_ResourceEdit              |  Bin 0 -> 23980 bytes
headers/os/interface/Menu.h                      |    1 +
headers/private/interface/ColumnListView.h       |    4 +-
src/apps/Jamfile                                 |    2 +-
src/apps/resourceedit/Constants.h                |   53 +
src/apps/resourceedit/DefaultTypes.cpp           |   47 +
src/apps/resourceedit/DefaultTypes.h             |   69 +
src/apps/resourceedit/EditWindow.cpp             |  163 +++
src/apps/resourceedit/EditWindow.h               |   53 +
src/apps/resourceedit/Jamfile                    |   54 +
src/apps/resourceedit/MainWindow.cpp             | 1212 ++++++++++++++++++
src/apps/resourceedit/MainWindow.h               |  186 +++
src/apps/resourceedit/ResourceEdit.cpp           |  152 +++
src/apps/resourceedit/ResourceEdit.h             |   47 +
src/apps/resourceedit/ResourceEdit.rdef          |  136 ++
src/apps/resourceedit/ResourceListView.cpp       |   60 +
src/apps/resourceedit/ResourceListView.h         |   27 +
src/apps/resourceedit/ResourceRow.cpp            |  153 +++
src/apps/resourceedit/ResourceRow.h              |   46 +
src/apps/resourceedit/SettingsFile.cpp           |   56 +
src/apps/resourceedit/SettingsFile.h             |   33 +
src/apps/resourceedit/SettingsWindow.cpp         |  120 ++
src/apps/resourceedit/SettingsWindow.h           |   48 +
src/apps/resourceedit/edits/AppFlagsEdit.cpp     |    4 +
src/apps/resourceedit/edits/AppFlagsEdit.h       |    4 +
src/apps/resourceedit/edits/BooleanEdit.cpp      |   71 +
src/apps/resourceedit/edits/BooleanEdit.h        |   30 +
src/apps/resourceedit/edits/EditView.cpp         |   52 +
src/apps/resourceedit/edits/EditView.h           |   31 +
src/apps/resourceedit/edits/NormalEdit.cpp       |   64 +
src/apps/resourceedit/edits/NormalEdit.h         |   31 +
src/apps/resourceedit/interface/ImageButton.cpp  |   67 +
src/apps/resourceedit/interface/ImageButton.h    |   32 +
src/apps/resourceedit/main.cpp                   |   17 +
.../settings/GenericSettingsView.cpp             |   60 +
.../resourceedit/settings/GenericSettingsView.h  |   37 +
src/apps/resourceedit/support/UndoContext.cpp    |  175 +++
src/apps/resourceedit/support/UndoContext.h      |   55 +
src/kits/interface/ColumnListView.cpp            |   63 +-
src/kits/interface/Menu.cpp                      |   15 +

############################################################################

Commit:      49126a0e9b1b7a8a148dab17d0c3aa4eb6e798ed
URL:         http://cgit.haiku-os.org/haiku/commit/?id=49126a0
Author:      Tri-Edge AI <triedgeai@xxxxxxxxx>
Date:        Thu Jan  3 16:02:21 2013 UTC
Committer:   Matt Madia <mattmadia@xxxxxxxxx>
Commit-Date: Thu Feb 28 03:08:46 2013 UTC

Added ResourceEdit and modified BColumnListView, BRow and BMenu.

Signed-off-by: Matt Madia <mattmadia@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/data/artwork/icons/App_ResourceEdit 
b/data/artwork/icons/App_ResourceEdit
new file mode 100644
index 0000000..e35ff65
Binary files /dev/null and b/data/artwork/icons/App_ResourceEdit differ
diff --git a/headers/os/interface/Menu.h b/headers/os/interface/Menu.h
index e5ab621..60ba113 100644
--- a/headers/os/interface/Menu.h
+++ b/headers/os/interface/Menu.h
@@ -122,6 +122,7 @@ public:
                        float                           MaxContentWidth() const;
 
                        BMenuItem*                      FindMarked();
+                       int32                           FindMarkedIndex();
 
                        BMenu*                          Supermenu() const;
                        BMenuItem*                      Superitem() const;
diff --git a/headers/private/interface/ColumnListView.h 
b/headers/private/interface/ColumnListView.h
index 2acbbdb..027154b 100644
--- a/headers/private/interface/ColumnListView.h
+++ b/headers/private/interface/ColumnListView.h
@@ -133,6 +133,7 @@ public:
 
                        float                           Height() const;
                        bool                            IsExpanded() const;
+                       bool                            IsSelected() const;
 
 private:
        // Blows up into the debugger if the validation fails.
@@ -326,8 +327,9 @@ public:
        // Does not delete row or children at this time.
        // todo: Make delete row and children
                        void                            RemoveRow(BRow* row);
-
                        void                            UpdateRow(BRow* row);
+                       bool                            SwapRows(int32 index1, 
int32 index2, BRow*
+                                                                       
parentRow1 = NULL, BRow* parentRow2 = NULL);
                        void                            Clear();
 
        // Appearance (DEPRECATED)
diff --git a/src/apps/Jamfile b/src/apps/Jamfile
index 7cd5efc..6c3a8fc 100644
--- a/src/apps/Jamfile
+++ b/src/apps/Jamfile
@@ -48,7 +48,7 @@ HaikuSubInclude powerstatus ;
 HaikuSubInclude processcontroller ;
 HaikuSubInclude pulse ;
 HaikuSubInclude remotedesktop ;
-HaikuSubInclude resedit ;
+HaikuSubInclude resourceedit ;
 HaikuSubInclude screenshot ;
 HaikuSubInclude serialconnect ;
 HaikuSubInclude showimage ;
diff --git a/src/apps/resourceedit/Constants.h 
b/src/apps/resourceedit/Constants.h
new file mode 100644
index 0000000..4a9766e
--- /dev/null
+++ b/src/apps/resourceedit/Constants.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+#ifndef CONSTANTS_H
+#define CONSTANTS_H
+
+
+#define MSG_NEW                                'm000'
+#define MSG_OPEN                       'm001'
+#define MSG_OPEN_DONE          'm002'
+#define MSG_CLOSE                      'm003'
+#define MSG_SAVE                       'm004'
+#define MSG_SAVEAS                     'm005'
+#define MSG_SAVEAS_DONE                'm006'
+#define MSG_SAVEALL                    'm007'
+#define MSG_MERGEWITH          'm008'
+#define MSG_QUIT                       'm009'
+
+#define MSG_UNDO                       'm010'
+#define MSG_REDO                       'm011'
+#define MSG_CUT                                'm012'
+#define MSG_COPY                       'm013'
+#define MSG_PASTE                      'm014'
+#define MSG_CLEAR                      'm015'
+#define MSG_SELECTALL          'm016'
+
+#define MSG_ADD                                'm020'
+#define        MSG_REMOVE                      'm021'
+#define MSG_MOVEUP                     'm022'
+#define MSG_MOVEDOWN           'm023'
+
+#define MSG_SELECTION          'm030'
+
+
+// TODO: Remove prior to release.
+#define DEBUG 1
+#include <Debug.h>
+// --- ---
+
+
+#endif
diff --git a/src/apps/resourceedit/DefaultTypes.cpp 
b/src/apps/resourceedit/DefaultTypes.cpp
new file mode 100644
index 0000000..9f7de5d
--- /dev/null
+++ b/src/apps/resourceedit/DefaultTypes.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+
+
+#include "DefaultTypes.h"
+
+#include <ByteOrder.h>
+
+
+BString
+toStringBOOL(const void* data)
+{
+       if (*(bool*)data)
+               return "✔ true";
+       else
+               return "✖ false";
+}
+
+
+BString
+toStringBYTE(const void* data)
+{
+       return (BString() << *(int8*)data);
+}
+
+
+BString
+toStringSHRT(const void* data)
+{
+       return (BString() << *(int16*)data);
+}
+
+
+BString
+toStringLONG(const  void* data)
+{
+       return (BString() << *(int32*)data);
+}
+
+
+BString
+toStringLLNG(const void* data)
+{
+       return (BString() << *(int64*)data);
+}
+
+
+BString
+toStringUBYT(const void* data)
+{
+       return (BString() << *(uint8*)data);
+}
+
+
+BString
+toStringUSHT(const void* data)
+{
+       return (BString() << *(uint16*)data);
+}
+
+
+BString
+toStringULNG(const void* data)
+{
+       return (BString() << *(uint32*)data);
+}
+
+
+BString
+toStringULLG(const void* data)
+{
+       return (BString() << *(uint64*)data);
+}
+
+
+BString
+toStringRAWT(const void* data)
+{
+       return "[Raw Data]";
+}
+
+
+int32
+FindTypeCodeIndex(type_code code)
+{
+       for (int32 i = 0; kDefaultTypes[i].type != NULL; i++)
+               if (kDefaultTypes[i].typeCode == code)
+                       return i;
+
+       return -1;
+}
+
+
+void
+TypeCodeToString(type_code code, char* str)
+{
+       *(type_code*)str = B_HOST_TO_BENDIAN_INT32(code);
+       str[4] = '\0';
+}
diff --git a/src/apps/resourceedit/DefaultTypes.h 
b/src/apps/resourceedit/DefaultTypes.h
new file mode 100644
index 0000000..42ebf87
--- /dev/null
+++ b/src/apps/resourceedit/DefaultTypes.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+#ifndef DEFAULT_TYPES_H
+#define DEFAULT_TYPES_H
+
+
+#include <String.h>
+
+
+struct ResourceDataType        {
+       const char* type;
+       type_code       typeCode;
+       uint32          size;
+       BString (*toString)(const void*);
+};
+
+// TODO: Rework design of this. This one sucks.
+
+BString toStringBOOL(const void* data);
+BString toStringBYTE(const void* data);
+BString toStringSHRT(const void* data);
+BString toStringLONG(const void* data);
+BString toStringLLNG(const void* data);
+BString toStringUBYT(const void* data);
+BString toStringUSHT(const void* data);
+BString toStringULNG(const void* data);
+BString toStringULLG(const void* data);
+BString toStringRAWT(const void* data);
+
+char * const kDefaultData[] = {
+       0, 0, 0, 0, 0, 0, 0, 0
+};
+
+#define LINE   "", 0, ~0
+#define END            NULL, 0, 0
+
+const ResourceDataType kDefaultTypes[] = {
+       { "bool",       'BOOL', 1, toStringBOOL },
+       { LINE },
+       { "int8",       'BYTE', 1, toStringBYTE },
+       { "int16",      'SHRT', 2, toStringSHRT },
+       { "int32",      'LONG', 4, toStringLONG },
+       { "int64",      'LLNG', 8, toStringLLNG },
+       { LINE },
+       { "uint8",      'UBYT', 1, toStringUBYT },
+       { "uint16",     'USHT', 2, toStringUSHT },
+       { "uint32",     'ULNG', 4, toStringULNG },
+       { "uint64",     'ULLG', 8, toStringULLG },
+       { LINE },
+       { "raw",        'RAWT', 0, toStringRAWT },
+       { END }
+};
+
+const int32 kDefaultTypeSelected = 4;
+       // int32
+
+#undef LINE
+#undef END
+
+int32 FindTypeCodeIndex(type_code code);
+void TypeCodeToString(type_code code, char* str);
+
+
+#endif
diff --git a/src/apps/resourceedit/ImageButton.cpp 
b/src/apps/resourceedit/ImageButton.cpp
new file mode 100644
index 0000000..7b0b8dd
--- /dev/null
+++ b/src/apps/resourceedit/ImageButton.cpp
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+
+
+#include "ImageButton.h"
+
+#include <Bitmap.h>
+
+
+ImageButton::ImageButton(BRect frame, const char* name, BBitmap* image,
+       BMessage* message, uint32 resizingMode = B_FOLLOW_NONE)
+       :
+       BButton(frame, name, "", message, resizingMode)
+{
+       fImage = image;
+
+       fDrawPoint.x = ((frame.RightTop().x - frame.LeftTop().x)
+               - (image->Bounds().RightBottom().x + 1)) / 2;
+
+       fDrawPoint.y = ((frame.LeftBottom().y - frame.LeftTop().y)
+               - (image->Bounds().RightBottom().y + 1)) / 2;
+
+       fInnerBounds = Bounds();
+       fInnerBounds.InsetBy(3, 3);
+
+       SetDrawingMode(B_OP_ALPHA);
+}
+
+
+ImageButton::~ImageButton()
+{
+
+}
+
+
+void
+ImageButton::Draw(BRect updateRect)
+{
+       BButton::Draw(updateRect);
+       DrawBitmap(fImage, fDrawPoint);
+
+       if (!IsEnabled()) {
+               rgb_color tempColor = HighColor();
+               SetHighColor(255, 255, 255, 155);
+               FillRect(fInnerBounds, B_SOLID_HIGH);
+               SetHighColor(tempColor);
+       }
+}
+
+
+void
+ImageButton::ResizeTo(float width, float height)
+{
+       BButton::ResizeTo(width, height);
+       fInnerBounds = Bounds();
+       fInnerBounds.InsetBy(3, 3);
+}
+
+
+void
+ImageButton::SetBitmap(BBitmap* image)
+{
+       fImage = image;
+       Invalidate();
+}
diff --git a/src/apps/resourceedit/ImageButton.h 
b/src/apps/resourceedit/ImageButton.h
new file mode 100644
index 0000000..e0c3de8
--- /dev/null
+++ b/src/apps/resourceedit/ImageButton.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+#ifndef IMAGE_BUTTON_H
+#define IMAGE_BUTTON_H
+
+
+#include <Button.h>
+
+
+class ImageButton : public BButton
+{
+public:
+                               ImageButton(BRect frame, const char* name, 
BBitmap* image,
+                                       BMessage* message, uint32 resizingMode);
+                               ~ImageButton();
+
+       void            Draw(BRect updateRect);
+       void            ResizeTo(float width, float height);
+
+       void            SetBitmap(BBitmap* image);
+
+private:
+       BBitmap*        fImage;
+       BPoint          fDrawPoint;
+       BRect           fInnerBounds;
+
+};
+
+
+#endif
diff --git a/src/apps/resourceedit/Jamfile b/src/apps/resourceedit/Jamfile
new file mode 100644
index 0000000..9507e9a
--- /dev/null
+++ b/src/apps/resourceedit/Jamfile
@@ -0,0 +1,23 @@
+SubDir HAIKU_TOP src apps resourceedit ;
+
+UsePrivateHeaders interface shared ;
+
+Application ResourceEdit
+       :
+               DefaultTypes.cpp
+               ImageButton.cpp
+               MainWindow.cpp
+               ResourceEdit.cpp
+               ResourceListView.cpp
+               ResourceRow.cpp
+               main.cpp
+       :
+               be
+               tracker
+               translation
+               libcolumnlistview.a
+               $(TARGET_LIBSTDC++)
+
+       :
+               ResourceEdit.rdef
+;
diff --git a/src/apps/resourceedit/MainWindow.cpp 
b/src/apps/resourceedit/MainWindow.cpp
new file mode 100644
index 0000000..d6413e3
--- /dev/null
+++ b/src/apps/resourceedit/MainWindow.cpp
@@ -0,0 +1,562 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+
+
+#include "MainWindow.h"
+
+#include "Constants.h"
+#include "ImageButton.h"
+#include "ResourceListView.h"
+#include "ResourceRow.h"
+
+#include <Application.h>
+#include <ColumnListView.h>
+#include <ColumnTypes.h>
+#include <Entry.h>
+#include <FilePanel.h>
+#include <Menu.h>
+#include <MenuBar.h>
+#include <MenuField.h>
+#include <MenuItem.h>
+#include <Path.h>
+#include <PopUpMenu.h>
+#include <Resources.h>
+#include <StatusBar.h>
+#include <String.h>
+#include <TextControl.h>
+#include <TranslationUtils.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <fstream>
+using namespace std;
+
+
+MainWindow::MainWindow(BRect frame, BEntry* assocEntry)
+       :
+       BWindow(frame, NULL, B_DOCUMENT_WINDOW, 0)
+{
+       fAssocEntry = assocEntry;
+
+       fSavePanel = NULL;
+
+       fMenuBar = new BMenuBar(BRect(0, 0, 600, 1), "fMenuBar");
+
+       fFileMenu = new BMenu("File", B_ITEMS_IN_COLUMN);
+       fNewItem = new BMenuItem("New", new BMessage(MSG_NEW), 'N');
+       fOpenItem = new BMenuItem("Open", new BMessage(MSG_OPEN), 'O');
+       fCloseItem = new BMenuItem("Close", new BMessage(MSG_CLOSE), 'W');
+       fSaveItem = new BMenuItem("Save", new BMessage(MSG_SAVE), 'S');
+       fSaveAsItem = new BMenuItem("Save As" B_UTF8_ELLIPSIS, new
+               BMessage(MSG_SAVEAS));
+       fSaveAllItem = new BMenuItem("Save All", new BMessage(MSG_SAVEALL), 'S',
+               B_SHIFT_KEY);
+       fMergeWithItem = new BMenuItem("Merge With" B_UTF8_ELLIPSIS,
+               new BMessage(MSG_MERGEWITH), 'M');
+       fQuitItem = new BMenuItem("Quit", new BMessage(MSG_QUIT), 'Q');
+
+       fEditMenu = new BMenu("Edit", B_ITEMS_IN_COLUMN);
+       fUndoItem = new BMenuItem("Undo", new BMessage(MSG_UNDO), 'Z');
+       fRedoItem = new BMenuItem("Redo", new BMessage(MSG_REDO), 'Y');
+       fCutItem = new BMenuItem("Cut", new BMessage(MSG_CUT), 'X');
+       fCopyItem = new BMenuItem("Copy", new BMessage(MSG_COPY), 'C');
+       fPasteItem = new BMenuItem("Paste", new BMessage(MSG_PASTE), 'V');
+       fClearItem = new BMenuItem("Clear", new BMessage(MSG_CLEAR));
+       fSelectAllItem = new BMenuItem("Select All",
+               new BMessage(MSG_SELECTALL), 'A');
+
+       fHelpMenu = new BMenu("Help", B_ITEMS_IN_COLUMN);
+
+       fResourceIDText = new BTextControl(BRect(0, 0, 47, 23).OffsetBySelf(8, 
24),
+               "fResourceIDText", NULL, "0", NULL);
+       fResourceTypePopUp = new BPopUpMenu("(Type)");
+       fResourceTypeMenu = new BMenuField(BRect(0, 0, 1, 1).OffsetBySelf(60, 
24),
+               "fResourceTypeMenu", NULL, fResourceTypePopUp);
+
+       for (int32 i = 0; kDefaultTypes[i].type != NULL; i++) {
+               if (kDefaultTypes[i].size == ~(uint32)0)
+                       fResourceTypePopUp->AddSeparatorItem();
+               else
+                       fResourceTypePopUp->AddItem(
+                               new BMenuItem(kDefaultTypes[i].type, NULL));
+       }
+
+       fResourceTypePopUp->ItemAt(kDefaultTypeSelected)->SetMarked(true);
+
+       fToolbarView = new BView(BRect(0, 0, 600, 51), "fToolbarView",
+               B_FOLLOW_LEFT_RIGHT, 0);
+
+       fToolbarView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
+
+       BRect toolRect = BRect(0, 0, 23, 23).OffsetBySelf(8, 24);
+
+       fAddButton = new ImageButton(toolRect.OffsetBySelf(200, 0),
+               "fAddButton", BTranslationUtils::GetBitmap('PNG ', "add.png"),
+               new BMessage(MSG_ADD), B_FOLLOW_NONE);
+       fAddButton->ResizeTo(23, 23);
+
+       fRemoveButton = new ImageButton(toolRect.OffsetBySelf(30, 0),
+               "fRemoveButton", BTranslationUtils::GetBitmap('PNG ', 
"remove.png"),
+               new BMessage(MSG_REMOVE), B_FOLLOW_NONE);
+       fRemoveButton->ResizeTo(23, 23);
+       fRemoveButton->SetEnabled(false);
+
+       fMoveUpButton = new ImageButton(toolRect.OffsetBySelf(30, 0),
+               "fMoveUpButton", BTranslationUtils::GetBitmap('PNG ', 
"moveup.png"),
+               new BMessage(MSG_MOVEUP), B_FOLLOW_NONE);
+       fMoveUpButton->ResizeTo(23, 23);
+       fMoveUpButton->SetEnabled(false);
+
+       fMoveDownButton = new ImageButton(toolRect.OffsetBySelf(30, 0),
+               "fMoveDownButton", BTranslationUtils::GetBitmap('PNG ', 
"movedown.png"),
+               new BMessage(MSG_MOVEDOWN), B_FOLLOW_NONE);
+       fMoveDownButton->ResizeTo(23, 23);
+       fMoveDownButton->SetEnabled(false);
+
+       BRect listRect = Bounds();
+       listRect.SetLeftTop(BPoint(0, 52));
+       listRect.InsetBy(-1, -1);
+
+       fResourceList = new ResourceListView(listRect, "fResourceList",
+               B_FOLLOW_ALL, 0);
+
+       fResourceList->AddColumn(new BIntegerColumn("ID", 48, 1, 999,
+               B_ALIGN_RIGHT), 0);
+       fResourceList->AddColumn(new BStringColumn("Name", 156, 1, 999,
+               B_TRUNCATE_END, B_ALIGN_LEFT), 1);
+       fResourceList->AddColumn(new BStringColumn("Type", 56, 1, 999,
+               B_TRUNCATE_END, B_ALIGN_CENTER), 2);
+       fResourceList->AddColumn(new BStringColumn("Code", 56, 1, 999,
+               B_TRUNCATE_END, B_ALIGN_CENTER), 3);
+       fResourceList->AddColumn(new BStringColumn("Data", 156, 1, 999,
+               B_TRUNCATE_END, B_ALIGN_LEFT), 4);
+       fResourceList->AddColumn(new BSizeColumn("Size", 74, 1, 999,
+               B_ALIGN_RIGHT), 5);
+
+       fResourceList->SetLatchWidth(0);
+
+       fResourceList->SetTarget(this);
+       fResourceList->SetSelectionMessage(new BMessage(MSG_SELECTION));
+
+       AddChild(fMenuBar);
+
+       fMenuBar->AddItem(fFileMenu);
+               fFileMenu->AddItem(fNewItem);
+               fFileMenu->AddItem(fOpenItem);
+               fFileMenu->AddItem(fCloseItem);
+               fFileMenu->AddSeparatorItem();
+               fFileMenu->AddItem(fSaveItem);
+               fFileMenu->AddItem(fSaveAsItem);
+               fFileMenu->AddItem(fSaveAllItem);
+               fFileMenu->AddItem(fMergeWithItem);
+               fFileMenu->AddSeparatorItem();
+               fFileMenu->AddItem(fQuitItem);
+
+       fMenuBar->AddItem(fEditMenu);
+               fEditMenu->AddItem(fUndoItem);
+               fEditMenu->AddItem(fRedoItem);
+               fEditMenu->AddSeparatorItem();
+               fEditMenu->AddItem(fCutItem);
+               fEditMenu->AddItem(fCopyItem);
+               fEditMenu->AddItem(fPasteItem);
+               fEditMenu->AddItem(fClearItem);
+               fEditMenu->AddSeparatorItem();
+               fEditMenu->AddItem(fSelectAllItem);
+
+       fMenuBar->AddItem(fHelpMenu);
+
+       fToolbarView->AddChild(fResourceIDText);
+       fToolbarView->AddChild(fResourceTypeMenu);
+
+       fToolbarView->AddChild(fAddButton);
+       fToolbarView->AddChild(fRemoveButton);
+       fToolbarView->AddChild(fMoveUpButton);
+       fToolbarView->AddChild(fMoveDownButton);
+
+       AddChild(fToolbarView);
+
+       AddChild(fResourceList);
+
+       if (assocEntry != NULL) {
+               _SetTitleFromEntry();
+               _Load();
+       } else {
+               SetTitle("ResourceEdit | " B_UTF8_ELLIPSIS);
+       }
+}
+
+
+MainWindow::~MainWindow()
+{
+
+}
+
+
+bool
+MainWindow::QuitRequested()
+{
+       // TODO: Check if file is saved.
+
+       BMessage* msg = new BMessage(MSG_CLOSE);
+       msg->AddPointer("window", (void*)this);
+       be_app->PostMessage(msg);
+       return true;
+}
+
+
+void
+MainWindow::SelectionChanged()
+{
+       if (fResourceList->CurrentSelection(NULL) == NULL) {
+               fMoveUpButton->SetEnabled(false);
+               fMoveDownButton->SetEnabled(false);
+               fRemoveButton->SetEnabled(false);
+       } else {
+               fRemoveButton->SetEnabled(true);
+               
fMoveUpButton->SetEnabled(!fResourceList->RowAt(0)->IsSelected());
+               fMoveDownButton->SetEnabled(!fResourceList->RowAt(
+                       fResourceList->CountRows() - 1)->IsSelected());
+       }
+}
+
+
+void
+MainWindow::MessageReceived(BMessage* msg)
+{
+       switch (msg->what) {
+               case MSG_NEW:
+                       be_app->PostMessage(MSG_NEW);
+                       break;
+
+               case MSG_OPEN:
+                       be_app->PostMessage(MSG_OPEN);
+                       break;
+
+               case MSG_CLOSE:
+                       PostMessage(B_QUIT_REQUESTED);
+                       break;
+
+               case MSG_SAVE:
+                       _Save();
+                       break;
+
+               case MSG_SAVEAS:
+                       _SaveAs();
+                       break;
+
+               case MSG_SAVEAS_DONE:
+               {
+                       entry_ref ref;
+                       const char* leaf;
+
+                       if (msg->FindRef("directory", &ref) != B_OK)
+                               break;
+
+                       if (msg->FindString("name", &leaf) != B_OK)
+                               break;
+
+                       BDirectory dir(&ref);
+                       _Save(new BEntry(&dir, leaf));
+
+                       break;
+               }
+               case MSG_SAVEALL:
+                       be_app->PostMessage(MSG_SAVEALL);
+                       break;
+
+               case MSG_MERGEWITH:
+                       PRINT(("[MSG_MERGEWITH]: Not yet implemented."));
+                       // TODO: Implement.
+                       // "Merge from..." might be a better idea actually.
+                       break;
+
+               case MSG_QUIT:
+                       be_app->PostMessage(B_QUIT_REQUESTED);
+                       break;
+
+               case MSG_UNDO:
+                       // TODO: Implement.
+                       PRINT(("[MSG_UNDO]: Not yet implemented."));
+                       break;
+
+               case MSG_REDO:
+                       // TODO: Implement.
+                       PRINT(("[MSG_REDO]: Not yet implemented."));
+                       break;
+
+               case MSG_CUT:
+                       // TODO: Implement.
+                       PRINT(("[MSG_CUT]: Not yet implemented."));
+                       break;
+
+               case MSG_COPY:
+                       // TODO: Implement.
+                       PRINT(("[MSG_COPY]: Not yet implemented."));
+                       break;
+
+               case MSG_PASTE:
+                       // TODO: Implement.
+                       PRINT(("[MSG_PASTE]: Not yet implemented."));
+                       break;
+
+               case MSG_CLEAR:
+                       fResourceList->Clear();
+                       SelectionChanged();
+                       break;
+
+               case MSG_SELECTALL:
+               {
+                       for (int32 i = 0; i < fResourceList->CountRows(); i++)
+                               
fResourceList->AddToSelection(fResourceList->RowAt(i));
+
+                       SelectionChanged();
+                       break;
+               }
+               case MSG_ADD:
+               {
+                       // Thank you, François Claus :D Merry Christmas!
+
+                       int32 ix = fResourceTypePopUp->FindMarkedIndex();
+
+                       if (ix != -1) {
+                               ResourceRow* row = new ResourceRow();
+                               row->SetResourceID(_NextResourceID());
+                               row->SetResourceType(kDefaultTypes[ix].type);
+                               
row->SetResourceTypeCode(kDefaultTypes[ix].typeCode);
+                               row->SetResourceRawData(kDefaultData);
+                               row->SetResourceSize(kDefaultTypes[ix].size);
+                               fResourceList->AddRow(row);
+                       }
+
+                       break;
+               }
+               case MSG_REMOVE:
+               {
+                       for (int i = 0; i < fResourceList->CountRows(); i++) {
+                               BRow* row = fResourceList->RowAt(i);
+
+                               if (row->IsSelected()) {
+                                       fResourceList->RemoveRow(row);
+                                       i--;
+                               }
+                       }
+
+                       break;
+               }
+               case MSG_MOVEUP:
+               {
+                       for (int i = 1; i < fResourceList->CountRows(); i++) {
+                               BRow* row = fResourceList->RowAt(i);
+
+                               if (row->IsSelected())
+                                       fResourceList->SwapRows(i, i - 1);
+
+                       }
+
+                       fResourceList->ClearSortColumns();
+                       SelectionChanged();
+                       break;
+               }
+               case MSG_MOVEDOWN:
+               {
+                       for (int i = fResourceList->CountRows() - 1 - 1; i >= 
0; i--) {
+                               BRow* row = fResourceList->RowAt(i);
+
+                               if (row->IsSelected())
+                                       fResourceList->SwapRows(i, i + 1);
+                       }
+
+                       fResourceList->ClearSortColumns();
+                       SelectionChanged();
+                       break;
+               }
+               case MSG_SELECTION:
+                       SelectionChanged();
+                       break;
+
+               default:
+                       BWindow::MessageReceived(msg);
+       }
+}
+
+
+void
+MainWindow::_SetTitleFromEntry()
+{
+       char nameBuffer[B_FILE_NAME_LENGTH];
+
+       fAssocEntry->GetName(nameBuffer);
+
+       BString title;
+       title << "ResourceEdit | ";
+       title << nameBuffer;
+       SetTitle(title);
+}
+
+
+void
+MainWindow::_SaveAs()
+{
+       if (fSavePanel == NULL)
+               fSavePanel = new BFilePanel(B_SAVE_PANEL, new BMessenger(this), 
NULL,
+                       B_FILE_NODE, false, new BMessage(MSG_SAVEAS_DONE));
+
+       fSavePanel->Rewind();
+       fSavePanel->Show();
+}
+
+
+void
+MainWindow::_Save(BEntry* entry)
+{
+       if (entry == NULL) {
+               if (fAssocEntry == NULL) {
+                       _SaveAs();
+                       return;
+               } else
+                       entry = fAssocEntry;
+       } else {
+               if (fAssocEntry == NULL) {
+                       fAssocEntry = entry;
+                       _SetTitleFromEntry();
+               }
+       }
+
+       /*BPath path;
+       entry->GetPath(&path);
+
+       // I wouldn't use std:: if BFile had cooler stuff.
+       // Not very comfortable here.
+
+       fstream out(path.Path(), ios::out);
+
+       time_t timeNow = time(0);
+
+
+       out << "/-" << endl;
+       out << " - This file is auto-generated by Haiku ResourceEdit." << endl;
+       out << " - Time: " << ctime((const time_t*)&timeNow);
+       out << " -\" << endl;
+
+       for (int32 i = 0; i < fResourceList->CountRows(); i++) {
+               ResourceRow* row = (ResourceRow*)fResourceList->RowAt(i);
+
+               out << endl;
+               out << "resource";
+
+               if (true) {
+                       // TODO: Implement no-ID cases.
+
+                       out << "(" << row->ResourceID();
+
+                       if (row->ResourceName()[0] != '\0') {
+                               out << ", \"" << row->ResourceName() << "\"" << 
endl;
+                       }
+
+                       out << ") ";
+               }
+
+               if (row->ResourceTypeCode()[0] != '\0')
+                       out << "#\'" << row->ResourceTypeCode() << "\' ";
+
+               if (strcmp(row->ResourceType(), "raw") != 0)
+                       out << row->ResourceType() << ' ' << 
row->ResourceData();
+               else {
+                       // TODO: Implement hexdump and import.
+                       out << "array {" << endl;
+                       out << "\t\"Not yet implemented.\"" << endl;
+                       out << "}";
+               }
+
+               out << endl;
+       }
+
+       out.close();*/
+
+       // Commented out whole output section. Switching to .rsrc files to
+       // close Part 1 of GCI task.
+
+       // TODO: Implement exporting to .rdef and/or other formats.
+
+
+       BFile* file = new BFile(entry, B_READ_WRITE | B_CREATE_FILE);
+       BResources output(file, true);
+       delete file;
+
+       for (int32 i = 0; i < fResourceList->CountRows(); i++) {
+               ResourceRow* row = (ResourceRow*)fResourceList->RowAt(i);
+               output.AddResource(row->ResourceTypeCode(), row->ResourceID(),
+                       row->ResourceRawData(), row->ResourceSize(), 
row->ResourceName());
+       }
+
+       output.Sync();
+}
+
+
+void
+MainWindow::_Load()
+{
+       /*BPath path;
+       struct stat st;
+
+       fAssocEntry->GetPath(&path);
+       fAssocEntry->GetStat(&st);
+
+       int fd = open(path.Path(), 0);
+       const char* in = (const char*)mmap(NULL, st.st_size, PROT_READ,
+               MAP_SHARED, fd, 0);
+
+       // TODO: Fix stucking bug.
+       // TODO: Parse data.
+
+       for (int32 i = 0; i < st.st_size - 1; i++) {
+               //...
+       }*/
+
+       // Commented out input section. Same reason as above.
+
+       // TODO: Implement importing from .rdef and/or other formats.
+
+       BFile* file = new BFile(fAssocEntry, B_READ_ONLY);
+       BResources input(file);
+       delete file;
+
+       type_code code;
+       int32 id;
+       const char* name;
+       size_t size;
+
+       for (int32 i = 0; input.GetResourceInfo(i, &code, &id, &name, &size); 
i++) {
+               ResourceRow* row = new ResourceRow();
+               row->SetResourceID(id);
+               row->SetResourceName(name);
+               row->SetResourceSize(size);
+               row->SetResourceTypeCode(code);
+               row->SetResourceRawData(input.LoadResource(code, id, &size));
+               fResourceList->AddRow(row);
+       }
+}
+
+
+int32
+MainWindow::_NextResourceID()
+{
+       int32 currentID = atoi(fResourceIDText->Text());
+       int32 nextID = currentID + 1;
+       BString text;
+
+       // Should I check if the ID is already present in the list?
+       // Hmmm...
+
+       text << nextID;
+       fResourceIDText->SetText(text);
+
+       return currentID;
+}
diff --git a/src/apps/resourceedit/MainWindow.h 
b/src/apps/resourceedit/MainWindow.h
new file mode 100644
index 0000000..bc1523f
--- /dev/null
+++ b/src/apps/resourceedit/MainWindow.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+#ifndef MAIN_WINDOW_H
+#define MAIN_WINDOW_H
+
+
+#include <Window.h>
+
+
+class ImageButton;
+
+class BColumnListView;
+class BEntry;
+class BFilePanel;
+class BMenu;
+class BMenuBar;
+class BMenuField;
+class BMenuItem;
+class BMessage;
+class BPopUpMenu;
+class BTextControl;
+
+
+class MainWindow : public BWindow {
+public:
+                                               MainWindow(BRect frame, BEntry* 
entry);
+                                               ~MainWindow();
+
+       bool                            QuitRequested();
+       void                            MessageReceived(BMessage* msg);
+       void                            SelectionChanged();
+
+private:
+       BEntry*                         fAssocEntry;
+
+       BMenuBar*                       fMenuBar;
+
+       BMenu*                          fFileMenu;
+       BMenuItem*                      fNewItem;
+       BMenuItem*                      fOpenItem;
+       BMenuItem*                      fCloseItem;
+       BMenuItem*                      fSaveItem;
+       BMenuItem*                      fSaveAsItem;
+       BMenuItem*                      fSaveAllItem;
+       BMenuItem*                      fMergeWithItem;
+       BMenuItem*                      fQuitItem;
+
+       BMenu*                          fEditMenu;
+       BMenuItem*                      fUndoItem;
+       BMenuItem*                      fRedoItem;
+       BMenuItem*                      fCutItem;
+       BMenuItem*                      fCopyItem;
+       BMenuItem*                      fPasteItem;
+       BMenuItem*                      fClearItem;
+       BMenuItem*                      fSelectAllItem;
+
+       BMenu*                          fHelpMenu;
+
+       BTextControl*           fResourceIDText;
+       BPopUpMenu*                     fResourceTypePopUp;
+       BMenuField*                     fResourceTypeMenu;
+
+       BView*                          fToolbarView;
+       ImageButton*            fAddButton;
+       ImageButton*            fRemoveButton;
+       ImageButton*            fMoveUpButton;
+       ImageButton*            fMoveDownButton;
+
+       BColumnListView*        fResourceList;
+
+       BFilePanel*                     fSavePanel;
+
+       void                            _SetTitleFromEntry();
+       void                            _SaveAs();
+       void                            _Save(BEntry* entry = NULL);
+       void                            _Load();
+
+       int32                           _NextResourceID();
+
+};
+
+
+#endif
diff --git a/src/apps/resourceedit/ResourceEdit.cpp 
b/src/apps/resourceedit/ResourceEdit.cpp
new file mode 100644
index 0000000..2ff1a57
--- /dev/null
+++ b/src/apps/resourceedit/ResourceEdit.cpp
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+
+
+#include "ResourceEdit.h"
+
+#include "AboutWindow.h"
+#include "Constants.h"
+#include "MainWindow.h"
+
+#include <Entry.h>
+#include <FilePanel.h>
+
+
+ResourceEdit::ResourceEdit()
+       :
+       BApplication("application/x-vnd.Haiku-ResourceEdit")
+{
+       fCascade = BRect(100, 100, 700, 400);
+       fCascadeCount = 0;
+
+       fOpenPanel = new BFilePanel(B_OPEN_PANEL, &be_app_messenger, NULL, 0, 
true,
+               new BMessage(MSG_OPEN_DONE));
+}
+
+
+ResourceEdit::~ResourceEdit()
+{
+
+}
+
+
+void
+ResourceEdit::MessageReceived(BMessage* msg)
+{
+       switch (msg->what) {
+               case MSG_NEW:
+                       _CreateWindow(NULL);
+                       break;
+
+               case MSG_OPEN:
+                       fOpenPanel->Show();
+                       break;
+
+               case MSG_OPEN_DONE:
+               {
+                       entry_ref ref;
+
+                       while (fOpenPanel->GetNextSelectedRef(&ref) == B_OK)
+                               _CreateWindow(new BEntry(&ref));
+
+                       fOpenPanel->Rewind();
+
+                       break;
+               }
+               case MSG_CLOSE:
+               {
+                       MainWindow* window;
+                       msg->FindPointer("window", (void**)&window);
+                       fWindowList.RemoveItem(window);
+
+                       if (fWindowList.CountItems() == 0)
+                               Quit();
+
+                       break;
+               }
+               case MSG_SAVEALL:
+               {
+                       for (int32 i = 0; i < fWindowList.CountItems(); i++)
+                               
((MainWindow*)fWindowList.ItemAt(i))->PostMessage(MSG_SAVE);
+
+                       break;
+               }
+               default:
+                       BApplication::MessageReceived(msg);
+       }
+}
+
+
+void
+ResourceEdit::ArgvReceived(int32 argc, char* argv[])
+{
+       for (int32 i = 1; i < argc; i++)
+               _CreateWindow(new BEntry(argv[i]));
+}
+
+
+void
+ResourceEdit::ReadyToRun()
+{
+       if (fWindowList.CountItems() <= 0)
+               _CreateWindow(NULL);
+}
+
+
+void
+ResourceEdit::_CreateWindow(BEntry* assocEntry)
+{
+       MainWindow* window = new MainWindow(_Cascade(), assocEntry);
+
+       fWindowList.AddItem(window);
+
+       window->Show();
+}
+
+
+BRect
+ResourceEdit::_Cascade()
+{
+       if (fCascadeCount == 8) {
+               fCascade.OffsetBy(-20 * 8, -20 * 8);
+               fCascadeCount = 0;
+       } else {
+               fCascade.OffsetBy(20, 20);
+               fCascadeCount++;
+       }
+
+       return fCascade;
+}
diff --git a/src/apps/resourceedit/ResourceEdit.h 
b/src/apps/resourceedit/ResourceEdit.h
new file mode 100644
index 0000000..dcdf976
--- /dev/null
+++ b/src/apps/resourceedit/ResourceEdit.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+#ifndef RESOURCE_EDIT_H
+#define RESOURCE_EDIT_H
+
+
+#include <Application.h>
+
+
+class MainWindow;
+
+class BEntry;
+class BFilePanel;
+class BMessage;
+
+
+class ResourceEdit : public BApplication {
+public:
+                                       ResourceEdit();
+                                       ~ResourceEdit();
+
+       void                    MessageReceived(BMessage* msg);
+
+private:
+       BRect                   fCascade;
+       uint32                  fCascadeCount;
+       BList                   fWindowList;
+
+       BFilePanel*             fOpenPanel;
+
+       void                    ArgvReceived(int32 argc, char* argv[]);
+       void                    ReadyToRun();
+
+       void                    _CreateWindow(BEntry* assocEntry);
+       BRect                   _Cascade();
+
+};
+
+
+#endif
diff --git a/src/apps/resourceedit/ResourceEdit.rdef 
b/src/apps/resourceedit/ResourceEdit.rdef
new file mode 100644
index 0000000..58b821c
--- /dev/null
+++ b/src/apps/resourceedit/ResourceEdit.rdef
@@ -0,0 +1,136 @@
+resource app_signature "application/x-vnd.Haiku-ResourceEdit";
+
+resource app_name_catalog_entry "x-vnd.Haiku-ResourceEdit:System 
name:ResourceEdit";
+
+resource app_version {
+       major  = 0,
+       middle = 1,
+       minor  = 0,
+
+       variety = B_APPV_ALPHA,
+       internal = 0,
+
+       short_info = "ResourceEdit",
+       long_info = "ResourceEdit © 2012-2013 Haiku, Inc."
+};
+
+resource app_flags B_SINGLE_LAUNCH;
+
+resource(1, "BEOS:FILE_TYPES") message {
+       "types" = "text/x-vnd.Be.ResourceDef"
+};
+
+resource vector_icon {
+       $"6E6369660E050102000603399E0F3D9C0ABF82B23B84A94B88504870C900A5FF"
+       $"F5BCEAFFF2FFB3FFE3020106023E49240000000000003CAAAA4940004A3000FF"
+       $"C0FFDD7C6DFFBC040192020006023A4BAE3411A9B629883C6629495368484715"
+       $"00FFF9BAFFFFC104020006023A6A0E3670BCB6D8C13AD0F64A21BC4A0DF300BA"
+       $"DCFFFF2A20F10200060239AAD5343BA5B6E7993C629D4ABB354803A500E99797"
+       $"FFCE323202000602AAB1FB3A081FBE8A26AF5E794C4014448D43FFFDDCAB00DB"
+       $"AB5F02000602B507E13A82E2BAD599B56BB44A7652479FE400116201FE69A403"
+       $"020006023C08200000000000004000004A4000000000FD6AD839004AB9270200"
+       $"06023D4D340000000000004000004A5000000000009CFA80FFF8FAFF02000603"
+       $"B2F679BA14D43A7FB6B38E9E460F5547105A00FFEED58DDBAB5FCFFFEED50401"
+       $"95020012023B8E380000000000004000004A5400C100000001FFFF0199120606"
+       $"AE0BB40BBF4D33C3AFB75DC173BDEFC607C13EC804CA28BD82C118B920C51BBB"
+       $"40BF07B8083AB6BC0605AE02B57D3EB9B9C3EFB7BB44BBB751BD75C936CA8EC1"
+       $"B1402F0A093B593D5BBFCDC93E455BC516C5F160465B435D4544510A045A425E"
+       $"3F5A3D57400A063236323D3A41403E403739330A063A433A4A404D464A464341"
+       $"400A064237423E48424E3F4E3948350604EE532755295528552A532B5229522A"
+       $"52280604EE532456295625562D532E5029502D50250A04B969B771332E502E4E"
+       $"2B0A04B969B5BAB969B7714E2B4E270A043324B969B5BA4E2750240A063124B8"
+       $"BAB5B2B8BAB779312EB677B6ECB67CB63C0606B20831245356295625562D532E"
+       $"3126290804BA28B4D33027302BBA28B8580003C6E8B4D3C6E8B4D3C690B51750"
+       $"2950B59E50B78DC6E8B858C690B814C6E8B8580A04C6F0C5C24E4F514BC9BBC4"
+       $"280A06C4E04F41C507374B394A45C33CC6D1C36F120A030202032020250A0001"
+       $"0130202501178400040A0201012020250A00010030202501178400040A010100"
+       $"2020250A000304050630202501178400040A0401042020250A0501052020250A"
+       $"0601062020250A0C0110000A0D0111000A00030D0E0F123ED413BED4133ED413"
+       $"3ED41347F4A24A588901178400040A0B010C023ED413BED4133ED4133ED41347"
+       $"F4A24A58890A0A010B023ED413BED4133ED4133ED41347F4A24A58890A09010A"
+       $"023ED413BED4133ED4133ED41347F4A24A58890A080109023ED413BED4133ED4"
+       $"133ED41347F4A24A58890A070108023ED413BED4133ED4133ED41347F4A24A58"
+       $"890A0001070A3ED413BED4133ED4133ED41347F4A24A588915FF"
+};
+
+resource(1, "add.png") #'PNG ' array {
+       $"89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D"
+       $"F80000017B494441544889ED95B14EC25014863F6AAB4864C40768D84C184908"
+       $"3E002B899B71742171C7677024716572C207707124260C0E460709A94C86844D"
+       $"144BEF6D716841CA2D5083C6857FBB7FFE73BF7B4F7B5AD8E8BF9588952A5231"
+       $"0B660D1D0D008967DD59559A5CAC2AD56301D2E473A739CDD8330010EF42B31E"
+       $"AD32D000BAEB03005BDA48210190524EEC9D5575B1011FCE07C676700347C42D"
+       $"8B0F1042E0391E00AE70D70014A990261FF2521C0EE5105DF8712925A4C852A2"
+       $"0EB4A7B9012D9A5CCE96AA6FD119AE79646AF3B6B16B7CA7C7203ED53659D796"
+       $"478D1CF0B4F8060934477714DB11735E54731368C0FE72C018466214511D4363"
+       $"D5520112AFFFD6575A4492508BB02300126F35E0812A2F94435E8A2CC7644806"
+       $"6B1BB8A2CF904E2837A00B61880AF0C7BFC1EC1095A8E3929996BAC0900E379C"
+       $"03BDB91D5E97037C75E7D66DA01091EB01CF0BF60040EDF52FEBCF01F13E1503"
+       $"5ADC72C2567020172F78A02B15EF7FE0EB007F8826F2807B60F0833D3652F505"
+       $"AA6A764F51A11AA20000000049454E44AE426082"
+};
+
+resource(2, "remove.png") #'PNG ' array {
+       $"89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D"
+       $"F800000275494441544889ED94C14B93611CC73F7B7D6DF80EDA72BEAFCE2D82"
+       $"57F022099AE065902884791C41052BD7FE804DA48378AF4E49978E199845273D"
+       $"CC90C0759B78085C66186387053A9C4B3417CB4DD6D3C136F5F5DDC04E1DFCC2"
+       $"0F5E9EDFFB7EBEBFEFFB3CEF0BE7FA6FA5C3C551557D1780A78064728B148027"
+       $"A3AAFA5E07C799E1E31ECFC7642824627EBF08C282C1440AC2B398DF2F92A190"
+       $"18F778523A38CD587566F03BAAFA617868E85A8BA2D06CB3E172B974CBDA9A77"
+       $"19A6014B10261EF87CE14EB71B9B24D1E6763B4AEBEBB737F2F9573BF0ABA6C1"
+       $"B0AACE04FBFBAF373734208A4544B188A628B8344D9792496F17740D0F0E86AF"
+       $"B6B454FA3649A2ADB5D5F1736BEBE6523EFF02289579B2D160379BFDBA99C90C"
+       $"A986F50EBB9D7B7D7D03C04087DD4E696FEF447F339361379BDD00BA81A5AA09"
+       $"E2B050974A793545D1554942140A9552651955964FAC894281CFE934D38B8BD1"
+       $"97F01A5804F6AB1A006219A6E574DAAB59AD7A932C230E0EAAD66A26C39B783C"
+       $"3A09534004D8A9B907C74DEAB359AF2ACB7A9310A7A61685025FB6B7799B4854"
+       $"8583C91E18B42A72B9815295A6C8E5CA977366F05A09A4204CDC8270BBCD5639"
+       $"2DC67202CDF9BC6E859EBF47581841966A701F84DB6BA7AB2801CC4074126E00"
+       $"BF6B2608C0631F3C348327806D4E7FB24E4003DD0ABDF1C3937434AD11E280EE"
+       $"C62AF05988CE423461D26F3C7CD60D74D64CB00573F570F7323814037C12A696"
+       $"E15103F468A097937C0722F06D069EEFC027E087C90C47D2C13906A918880894"
+       $"7F76F7814BE5E44158888088811883940E21A0AD26D86832022B019837C0CB92"
+       $"02303F022B67861FD305A0D7045E9685C3777EE55FE0E702E00F037E0BAE5DFC"
+       $"3C830000000049454E44AE426082"
+};
+
+resource(3, "moveup.png") #'PNG ' array {
+       $"89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D"
+       $"F8000001C8494441544889ED933B485B6118861F93D8788F510E27DAE00D259D"
+       $"0485823108723843296E22850E0EBA140AA543C4A18A9442A920EA62068582E2"
+       $"E0AA83E2050415A18B882028ED927AE8693C31510721A8F93B5841E9C9498A2E"
+       $"822FBCC3CFF7F3BCDFF75FE0510F465EC81E57F93AAE32ED85EC7B854B609F50"
+       $"98D4D755A1AFAB6242615302C77DC16D2185316D392044AC4D88589BD0960222"
+       $"A4B02A81FDCEF0D116BE84E7EA8530945B0ECFD58B911616D2312C3B1808F0A1"
+       $"FD9DAFBFB2D90DE2F2965D4F9DC8725E6D997ED4B072C0CC7F077C6AE27DC79B"
+       $"9AC19AD6221017A676573CC1539CFB4CFA1DAF5CD598CD38A0EF39DDAFBBA550"
+       $"9D5A00E2DCD22555763C85B686E2C8996BED178B6903828DBCEAEC94A67C2F9C"
+       $"64610DBF7669B5038FD3E9CF3B3C4B6EEAACDDE4FDF3D4FCE5F4D8EC063F96AE"
+       $"D6451512B2CFFC1823FB70FAD3B8EAD401FE72BAD8620A08A70CF8F80DD5BB4D"
+       $"179053E6C2DDFBD608CAB5E601A761181C63483F210EA02530807CCB09760C8E"
+       $"776018E025549324C8A5790049D04F88CF6B7C4EB12383DF28FE3A552D8D6CE9"
+       $"B7DC4D0F3FC0F20EB404D1EF1B44627BC866F5A328112D41D48A919541138540"
+       $"23A9A73D047633E03CCA5C7F00288AC08FE23A7EB30000000049454E44AE4260"
+       $"82"
+};
+
+resource(4, "movedown.png") #'PNG ' array {
+       $"89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D"
+       $"F8000001E6494441544889ED92DD4B53611CC73F6ED5BC680D978F6B792AC45C"
+       $"E164577A9710E7A6B0BAEAAE0B41F09F08BAEAC66E4421F042AF6A228A2F28BA"
+       $"A42226859B48DD0C247A811C8E1DE2D0081793A9674F174B523BCF966F78515F"
+       $"F8C173CEF7F7FB7E785EE0BF8E5B15A5CC90C0DD7543BC3DEB7707ECFC6F46D6"
+       $"B8FFDC6C4A98645419274A013417D50D37EB030D772ED8FA9FA657FCDA9CD991"
+       $"80EE7D010028AC83B5A6F6C0556AFC2F0079B0726AAF8CCA03E426588A20B979"
+       $"08006B437D44D6C6DE0121C169CD8500F07BD09059B04EDA4FCB2C7E0F556D50"
+       $"0790CA63264C7E6C6FF9E3998EDF6631D8265A1CCEE2F7994BE0BB627F8F5F3F"
+       $"E4594D16D7050B969E99CB7767080159E50EE2691E5FCD9B4F03B704158E5F3F"
+       $"1577E0BB5C2C5980F71193789A97401058D8EA71EE1E8A1924BC192A6BDDB96B"
+       $"D5753990E5EBE38B1C4383841FBD631A7803584A00C0EB34AF6A329CABF5D0EC"
+       $"BD0848757D9E83E130230F17990422C08EEDDA0200A22922DA771ACF0B82559A"
+       $"7DCF9705187BC2D48338A3C00CA0786E0A0970F4B6329B0C23E5D2CE4A86913D"
+       $"ADCC02F700F79E827743FA74A2A991DFE1A96164DF75A202DA01CFBEC3B7419C"
+       $"033A316302698C23077462023A00EF81C3B7A4C1A97E9DF97E9D790D3A8BDCC3"
+       $"970368067C4711FE8FEA273678C1FAFB9AC8FD0000000049454E44AE426082"
+};
diff --git a/src/apps/resourceedit/ResourceListView.cpp 
b/src/apps/resourceedit/ResourceListView.cpp
new file mode 100644
index 0000000..a329d77
--- /dev/null
+++ b/src/apps/resourceedit/ResourceListView.cpp
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+
+
+#include "ResourceListView.h"
+
+#include "Constants.h"
+
+#include <ColumnListView.h>
+#include <Entry.h>
+
+
+ResourceListView::ResourceListView(BRect rect, const char* name,
+       uint32 resizingMode, uint32 drawFlags, border_style border,
+       bool showHorizontalScrollbar)
+       :
+       BColumnListView(rect, name, resizingMode, drawFlags, border,
+               showHorizontalScrollbar)
+{
+
+}
+
+
+ResourceListView::~ResourceListView()
+{
+
+}
+
+
+void
+ResourceListView::MessageReceived(BMessage* msg)
+{
+       switch (msg->what) {
+               case B_SIMPLE_DATA: {
+                       entry_ref ref;
+                       int32 n = 0;
+
+                       // TODO: Implement D&D adding of files.
+
+                       while (msg->FindRef("refs", n++, &ref) == B_OK) {
+                               PRINT(("%s\n", ref.name));
+                               // ...
+                       }
+
+                       break;
+               }
+               default:
+                       BColumnListView::MessageReceived(msg);
+       }
+}
diff --git a/src/apps/resourceedit/ResourceListView.h 
b/src/apps/resourceedit/ResourceListView.h
new file mode 100644
index 0000000..5551f82
--- /dev/null
+++ b/src/apps/resourceedit/ResourceListView.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+#ifndef RESOURCE_LIST_VIEW_H
+#define RESOURCE_LIST_VIEW_H
+
+
+#include <ColumnListView.h>
+
+
+class ResourceListView : public BColumnListView {
+public:
+                       ResourceListView(BRect rect, const char* name, uint32 
resizingMode,
+                               uint32 drawFlags, border_style border = 
B_NO_BORDER,
+                               bool showHorizontalScrollbar = true);
+                       ~ResourceListView();
+
+       void    MessageReceived(BMessage* msg);
+
+private:
+
+};
+
+
+#endif
diff --git a/src/apps/resourceedit/ResourceRow.cpp 
b/src/apps/resourceedit/ResourceRow.cpp
new file mode 100644
index 0000000..ebe5dce
--- /dev/null
+++ b/src/apps/resourceedit/ResourceRow.cpp
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+
+
+#include "ResourceRow.h"
+
+#include <ColumnListView.h>
+#include <ColumnTypes.h>
+
+
+ResourceRow::ResourceRow()
+       :
+       BRow()
+{
+       fRawData = NULL;
+
+       SetField(new BIntegerField(0), 0);
+       SetField(new BStringField(""), 1);
+       SetField(new BStringField(""), 2);
+       SetField(new BStringField(""), 3);
+       SetField(new BStringField(""), 4);
+       SetField(new BSizeField(0), 5);
+}
+
+
+ResourceRow::~ResourceRow()
+{
+       // ...
+}
+
+
+void
+ResourceRow::SetResourceID(int32 id)
+{
+       ((BIntegerField*)GetField(0))->SetValue(id);
+}
+
+
+void
+ResourceRow::SetResourceName(const char* name)
+{
+       ((BStringField*)GetField(1))->SetString(name);
+}
+
+
+void
+ResourceRow::SetResourceType(const char* type)
+{
+       ((BStringField*)GetField(2))->SetString(type);
+}
+
+
+void
+ResourceRow::SetResourceTypeCode(type_code code)
+{
+       fTypeCode = code;
+       TypeCodeToString(code, fTypeString);
+       ((BStringField*)GetField(3))->SetString(fTypeString);
+}
+
+
+void
+ResourceRow::SetResourceData(const char* data)
+{
+       ((BStringField*)GetField(4))->SetString(data);
+}
+
+
+void
+ResourceRow::SetResourceRawData(const void* data)
+{
+       if (data == NULL)
+               data = kDefaultData;
+
+       fRawData = data;
+
+       int32 ix = FindTypeCodeIndex(ResourceTypeCode());
+
+       if (ix == -1)
+               SetResourceData("[Unknown Data]");
+       else
+               SetResourceData(kDefaultTypes[ix].toString(fRawData));
+}
+
+
+void
+ResourceRow::SetResourceSize(off_t size)
+{
+       ((BSizeField*)GetField(5))->SetSize(size);
+}
+
+
+int32
+ResourceRow::ResourceID()
+{
+       return ((BIntegerField*)GetField(0))->Value();
+}
+
+
+const char*
+ResourceRow::ResourceName()
+{
+       return ((BStringField*)GetField(1))->String();
+}
+
+
+const char*
+ResourceRow::ResourceType()
+{
+       return ((BStringField*)GetField(2))->String();
+}
+
+
+type_code
+ResourceRow::ResourceTypeCode()
+{
+       return fTypeCode;
+}
+
+
+const char*
+ResourceRow::ResourceData()
+{
+       return ((BStringField*)GetField(4))->String();
+}
+
+
+const void*
+ResourceRow::ResourceRawData()
+{
+       return fRawData;
+}
+
+
+off_t
+ResourceRow::ResourceSize()
+{
+       return ((BSizeField*)GetField(5))->Size();
+}
diff --git a/src/apps/resourceedit/ResourceRow.h 
b/src/apps/resourceedit/ResourceRow.h
new file mode 100644
index 0000000..a9e65ca
--- /dev/null
+++ b/src/apps/resourceedit/ResourceRow.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+#ifndef RESOURCE_ROW_H
+#define RESOURCE_ROW_H
+
+
+#include "DefaultTypes.h"
+
+#include <ColumnListView.h>
+
+
+class ResourceRow : public BRow {
+public:
+                                       ResourceRow();
+                                       ~ResourceRow();
+
+       void                    SetResourceID(int32 id);
+       void                    SetResourceName(const char* name);
+       void                    SetResourceType(const char* type);
+       void                    SetResourceTypeCode(type_code code);
+       void                    SetResourceData(const char* data);
+       void                    SetResourceRawData(const void*);
+       void                    SetResourceSize(off_t size);
+
+       int32                   ResourceID();
+       const char*             ResourceName();
+       const char*             ResourceType();
+       type_code               ResourceTypeCode();
+       const char*             ResourceData();
+       const void*             ResourceRawData();
+       off_t                   ResourceSize();
+
+private:
+       const void*             fRawData;
+       type_code               fTypeCode;
+       char                    fTypeString[8];
+
+};
+
+
+#endif
diff --git a/src/apps/resourceedit/main.cpp b/src/apps/resourceedit/main.cpp
new file mode 100644
index 0000000..b370361
--- /dev/null
+++ b/src/apps/resourceedit/main.cpp
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+
+
+#include "ResourceEdit.h"
+
+
+int
+main()
+{
+       ResourceEdit* app = new ResourceEdit();
+       app->Run();
+       delete app;
+       return 0;
+}
diff --git a/src/kits/interface/ColumnListView.cpp 
b/src/kits/interface/ColumnListView.cpp
index 91bf16a..ec8b1af 100644
--- a/src/kits/interface/ColumnListView.cpp
+++ b/src/kits/interface/ColumnListView.cpp
@@ -523,6 +523,13 @@ BRow::IsExpanded() const
 }
 
 
+bool
+BRow::IsSelected() const
+{
+       return fPrevSelected != NULL;
+}
+
+
 void
 BRow::ValidateFields() const
 {
@@ -1258,6 +1265,60 @@ BColumnListView::UpdateRow(BRow* row)
 }
 
 
+bool
+BColumnListView::SwapRows(int32 index1, int32 index2, BRow* parentRow1,
+       BRow* parentRow2)
+{
+       BRow* row1 = NULL;
+       BRow* row2 = NULL;
+
+       BRowContainer* container1 = NULL;
+       BRowContainer* container2 = NULL;
+
+       if (parentRow1 == NULL)
+               container1 = fOutlineView->RowList();
+       else
+               container1 = parentRow1->fChildList;
+
+       if (container1 == NULL)
+               return false;
+
+       if (parentRow2 == NULL)
+               container2 = fOutlineView->RowList();
+       else
+               container2 = parentRow1->fChildList;
+
+       if (container2 == NULL)
+               return false;
+
+       row1 = container1->ItemAt(index1);
+
+       if (row1 == NULL)
+               return false;
+
+       row2 = container2->ItemAt(index2);
+
+       if (row2 == NULL)
+               return false;
+
+       container1->ReplaceItem(index2, row1);
+       container2->ReplaceItem(index1, row2);
+
+       BRect rect1;
+       BRect rect2;
+       BRect rect;
+
+       fOutlineView->FindRect(row1, &rect1);
+       fOutlineView->FindRect(row2, &rect2);
+
+       rect = rect1 | rect2;
+
+       fOutlineView->Invalidate(rect);
+
+       return true;
+}
+
+
 void
 BColumnListView::ScrollTo(const BRow* row)
 {
@@ -4195,7 +4256,7 @@ OutlineView::AddRow(BRow* row, int32 Index, BRow* 
parentRow)
 
        row->fParent = parentRow;
 
-       if (fMasterView->SortingEnabled()) {
+       if (fMasterView->SortingEnabled() && !fSortColumns->IsEmpty()) {
                // Ignore index here.
                if (parentRow) {
                        if (parentRow->fChildList == NULL)
diff --git a/src/kits/interface/Menu.cpp b/src/kits/interface/Menu.cpp
index 8491d2f..0485f97 100644
--- a/src/kits/interface/Menu.cpp
+++ b/src/kits/interface/Menu.cpp
@@ -1107,6 +1107,7 @@ BMenu::FindMarked()
 {
        for (int32 i = 0; i < fItems.CountItems(); i++) {
                BMenuItem* item = ItemAt(i);
+
                if (item->IsMarked())
                        return item;
        }
@@ -1115,6 +1116,20 @@ BMenu::FindMarked()
 }
 
 
+int32
+BMenu::FindMarkedIndex()
+{
+       for (int32 i = 0; i < fItems.CountItems(); i++) {
+               BMenuItem* item = ItemAt(i);
+
+               if (item->IsMarked())
+                       return i;
+       }
+
+       return -1;
+}
+
+
 BMenu*
 BMenu::Supermenu() const
 {

############################################################################

Commit:      dc4fe6be00757dfe3e0882d54598be4b98926404
URL:         http://cgit.haiku-os.org/haiku/commit/?id=dc4fe6b
Author:      Tri-Edge AI <triedgeai@xxxxxxxxx>
Date:        Mon Jan 14 04:47:46 2013 UTC
Committer:   Matt Madia <mattmadia@xxxxxxxxx>
Commit-Date: Thu Feb 28 03:09:21 2013 UTC

Extended ResourceEdit.

Signed-off-by: Matt Madia <mattmadia@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/src/apps/resourceedit/Constants.h 
b/src/apps/resourceedit/Constants.h
index 4a9766e..1bb2e97 100644
--- a/src/apps/resourceedit/Constants.h
+++ b/src/apps/resourceedit/Constants.h
@@ -25,13 +25,24 @@
 #define MSG_CLEAR                      'm015'
 #define MSG_SELECTALL          'm016'
 
-#define MSG_ADD                                'm020'
-#define        MSG_REMOVE                      'm021'
-#define MSG_MOVEUP                     'm022'
-#define MSG_MOVEDOWN           'm023'
+#define MSG_ADDAPPRES          'm020'
+#define MSG_SETTINGS           'm021'
 
-#define MSG_SELECTION          'm030'
+#define MSG_ADD                                'm030'
+#define        MSG_REMOVE                      'm031'
+#define MSG_MOVEUP                     'm032'
+#define MSG_MOVEDOWN           'm033'
 
+#define MSG_SELECTION          'm040'
+#define MSG_INVOCATION         'm041'
+
+#define MSG_ACCEPT                     'm050'
+#define MSG_CANCEL                     'm051'
+#define MSG_IGNORE                     'm052'
+
+#define MSG_SETTINGS_APPLY     'm022'
+#define MSG_SETTINGS_REVERT    'm023'
+#define MSG_SETTINGS_CLOSED    'm024'
 
 // TODO: Remove prior to release.
 #define DEBUG 1
diff --git a/src/apps/resourceedit/DefaultTypes.cpp 
b/src/apps/resourceedit/DefaultTypes.cpp
index 9f7de5d..3fed852 100644
--- a/src/apps/resourceedit/DefaultTypes.cpp
+++ b/src/apps/resourceedit/DefaultTypes.cpp
@@ -9,84 +9,22 @@
 #include <ByteOrder.h>
 
 
-BString
-toStringBOOL(const void* data)
-{
-       if (*(bool*)data)
-               return "✔ true";
-       else
-               return "✖ false";
-}
-
-
-BString
-toStringBYTE(const void* data)
-{
-       return (BString() << *(int8*)data);
-}
-
-
-BString
-toStringSHRT(const void* data)
-{
-       return (BString() << *(int16*)data);
-}
-
-
-BString
-toStringLONG(const  void* data)
-{
-       return (BString() << *(int32*)data);
-}
-
-
-BString
-toStringLLNG(const void* data)
-{
-       return (BString() << *(int64*)data);
-}
-
-
-BString
-toStringUBYT(const void* data)
-{
-       return (BString() << *(uint8*)data);
-}
-
-
-BString
-toStringUSHT(const void* data)
-{
-       return (BString() << *(uint16*)data);
-}
-
-
-BString
-toStringULNG(const void* data)
-{
-       return (BString() << *(uint32*)data);
-}
-
-
-BString
-toStringULLG(const void* data)
+int32
+ResourceType::FindIndex(type_code code)
 {
-       return (BString() << *(uint64*)data);
-}
-
+       for (int32 i = 0; kDefaultTypes[i].type != NULL; i++)
+               if (StringToCode(kDefaultTypes[i].code) == code)
+                       return i;
 
-BString
-toStringRAWT(const void* data)
-{
-       return "[Raw Data]";
+       return -1;
 }
 
 
 int32
-FindTypeCodeIndex(type_code code)
+ResourceType::FindIndex(const char* type)
 {
        for (int32 i = 0; kDefaultTypes[i].type != NULL; i++)
-               if (kDefaultTypes[i].typeCode == code)
+               if (strcmp(kDefaultTypes[i].type, type) == 0)
                        return i;
 
        return -1;
@@ -94,8 +32,16 @@ FindTypeCodeIndex(type_code code)
 
 
 void
-TypeCodeToString(type_code code, char* str)
+ResourceType::CodeToString(type_code code, char* str)
 {
        *(type_code*)str = B_HOST_TO_BENDIAN_INT32(code);
        str[4] = '\0';
 }
+
+
+type_code
+ResourceType::StringToCode(const char* code)
+{
+       // TODO: Code may be in other formats, too! Ex.: 0x4C4F4E47
+       return B_BENDIAN_TO_HOST_INT32(*(int32*)code);
+}
diff --git a/src/apps/resourceedit/DefaultTypes.h 
b/src/apps/resourceedit/DefaultTypes.h
index 42ebf87..ef51b66 100644
--- a/src/apps/resourceedit/DefaultTypes.h
+++ b/src/apps/resourceedit/DefaultTypes.h
@@ -6,61 +6,64 @@
 #define DEFAULT_TYPES_H
 
 
-#include <String.h>
+#include "AppFlagsEdit.h"
+#include "BooleanEdit.h"
+#include "EditView.h"
+#include "NormalEdit.h"
+#include "ResourceRow.h"
 
+#include <String.h>
 
-struct ResourceDataType        {
-       const char* type;
-       type_code       typeCode;
-       uint32          size;
-       BString (*toString)(const void*);
-};
 
-// TODO: Rework design of this. This one sucks.
+struct ResourceType {
+                       const char*     type;
+                       const char*             code;
+                       const char*     data;
+                       uint32                  size;
+                       EditView*               edit;
 
-BString toStringBOOL(const void* data);
-BString toStringBYTE(const void* data);
-BString toStringSHRT(const void* data);
-BString toStringLONG(const void* data);
-BString toStringLLNG(const void* data);
-BString toStringUBYT(const void* data);
-BString toStringUSHT(const void* data);
-BString toStringULNG(const void* data);
-BString toStringULLG(const void* data);
-BString toStringRAWT(const void* data);
+       static  int32                   FindIndex(const char* type);
+       static  int32                   FindIndex(type_code code);
 
-char * const kDefaultData[] = {
-       0, 0, 0, 0, 0, 0, 0, 0
+       static  void                    CodeToString(type_code code, char* str);
+       static  type_code               StringToCode(const char* code);
 };
 
-#define LINE   "", 0, ~0
-#define END            NULL, 0, 0
 
-const ResourceDataType kDefaultTypes[] = {
-       { "bool",       'BOOL', 1, toStringBOOL },
+#define LINE   "", "", "", ~0, NULL
+#define END            NULL, NULL, NULL, 0, NULL
+
+const ResourceType kDefaultTypes[] = {
+       { "app_signature",                      "",             
"application/MyApp",            18, new NormalEdit()    },
+       { "app_name_catalog_entry", "",         "MyApp:System name:MyApp",      
24, new NormalEdit()    },
+       //{ "app_flags",                                "",             "None", 
                                        4,      NULL },
        { LINE },
-       { "int8",       'BYTE', 1, toStringBYTE },
-       { "int16",      'SHRT', 2, toStringSHRT },
-       { "int32",      'LONG', 4, toStringLONG },
-       { "int64",      'LLNG', 8, toStringLLNG },
+       { "bool",                                       "BOOL", "false",        
                                1,      new BooleanEdit()       },
        { LINE },
-       { "uint8",      'UBYT', 1, toStringUBYT },
-       { "uint16",     'USHT', 2, toStringUSHT },
-       { "uint32",     'ULNG', 4, toStringULNG },
-       { "uint64",     'ULLG', 8, toStringULLG },
+       { "int8",                                       "BYTE", "0",            
                                1,      new NormalEdit()        },
+       { "int16",                                      "SHRT", "0",            
                                2,      new NormalEdit()        },
+       { "int32",                                      "LONG", "0",            
                                4,      new NormalEdit()        },
+       { "int64",                                      "LLNG", "0",            
                                8,      new NormalEdit()        },
        { LINE },
-       { "raw",        'RAWT', 0, toStringRAWT },
+       { "uint8",                                      "UBYT", "0",            
                                1,      new NormalEdit()        },
+       { "uint16",                                     "USHT", "0",            
                                2,      new NormalEdit()        },
+       { "uint32",                                     "ULNG", "0",            
                                4,      new NormalEdit()        },
+       { "uint64",                                     "ULLG", "0",            
                                8,      new NormalEdit()        },
+       { LINE },
+       { "string",                                     "CSTR", "\"\"",         
                                0,      NULL },
+       { "raw",                                        "RAWT", "",             
                                        0,      NULL },
+       { LINE },
+       { "array",                                      "",             "",     
                                        0,      NULL },
+       { "message",                            "",             "",             
                                0,      NULL },
+       { "import",                             "",             "",             
                                0,      NULL },
        { END }
 };
 
-const int32 kDefaultTypeSelected = 4;
+const int32 kDefaultTypeSelected = 8;
        // int32
 
 #undef LINE
 #undef END
 
-int32 FindTypeCodeIndex(type_code code);
-void TypeCodeToString(type_code code, char* str);
-
 
 #endif
diff --git a/src/apps/resourceedit/EditWindow.cpp 
b/src/apps/resourceedit/EditWindow.cpp
new file mode 100644
index 0000000..73b0364
--- /dev/null
+++ b/src/apps/resourceedit/EditWindow.cpp
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+
+
+#include "EditWindow.h"
+
+#include "Constants.h"
+#include "DefaultTypes.h"
+#include "EditView.h"
+#include "ResourceRow.h"
+
+#include <Box.h>
+#include <Button.h>
+#include <GroupLayoutBuilder.h>
+#include <MenuField.h>
+#include <MenuItem.h>
+#include <PopUpMenu.h>
+#include <StringView.h>
+#include <TextControl.h>
+#include <View.h>
+
+
+EditWindow::EditWindow(BRect frame, ResourceRow* row)
+       :
+       BWindow(frame, "Edit Resource",
+               B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL, 0)
+{
+       int32 ix = ResourceType::FindIndex(row->ResourceType());
+
+       fRow = row;
+
+       fView = new BView(Bounds(), "fView", B_FOLLOW_ALL, 0);
+       fView->SetLayout(new BGroupLayout(B_VERTICAL));
+
+       fIDText = new BTextControl(BRect(0, 0, 0, 0),
+               "fIDText", "ID:", row->ResourceStringID(), NULL);
+       fIDText->SetDivider(50);
+
+       fNameText = new BTextControl(BRect(0, 0, 0, 0),
+               "fNameText", "Name:", row->ResourceName(), NULL);
+       fNameText->SetDivider(50);
+
+       fTypePopUp = new BPopUpMenu("(Type)");
+
+       // TODO: (Not so) evil redundancy.
+       for (int32 i = 0; kDefaultTypes[i].type != NULL; i++) {
+               if (kDefaultTypes[i].size == ~(uint32)0)
+                       fTypePopUp->AddSeparatorItem();
+               else
+                       fTypePopUp->AddItem(new BMenuItem(kDefaultTypes[i].type,
+                               new BMessage(MSG_SELECTION)));
+       }
+       // ---
+
+       fTypePopUp->ItemAt(ix)->SetMarked(true);
+
+       fTypeMenu = new BMenuField(BRect(0, 0, 0, 0),
+               "fTypeMenu", "Type:", fTypePopUp);
+       fTypeMenu->SetDivider(50);
+
+       fCodeText = new BTextControl(BRect(0, 0, 0, 0),
+               "fCodeText", "Code:", row->ResourceStringCode(), NULL);
+       fCodeText->SetDivider(50);
+
+       fEditViewBox = new BBox(BRect(0, 0, 0, 0), "fEditViewBox");
+       fEditViewBox->SetLayout(new BGroupLayout(B_VERTICAL));
+
+       fEditView = kDefaultTypes[ix].edit;
+       fEditView->AttachTo(fEditViewBox);
+       fEditView->Edit(fRow);
+
+       fErrorString = new BStringView(BRect(0, 0, 0, 0),
+               "fErrorString", "");
+
+       fErrorString->SetHighColor(ui_color(B_FAILURE_COLOR));
+
+       fCancelButton = new BButton(BRect(0, 0, 0, 0),
+               "fCancelButton", "Cancel", new BMessage(MSG_CANCEL));
+       fOKButton = new BButton(BRect(0, 0, 0, 0),
+               "fOKButton", "OK", new BMessage(MSG_ACCEPT));
+
+       fView->AddChild(BGroupLayoutBuilder(B_VERTICAL, 8)
+               .Add(fIDText)
+               .Add(fNameText)
+               .Add(fTypeMenu)
+               .Add(fCodeText)
+               .Add(fEditViewBox)
+               .Add(fErrorString)
+               .Add(BGroupLayoutBuilder(B_HORIZONTAL, 8)
+                       .AddGlue()
+                       .Add(fCancelButton)
+                       .Add(fOKButton)
+                       .SetInsets(8, 8, 8, 8)
+               )
+               .SetInsets(8, 8, 8, 8)
+       );
+
+       AddChild(fView);
+       ResizeTo(250, 350);
+
+       Show();
+}
+
+
+EditWindow::~EditWindow()
+{
+       fEditView->RemoveSelf();
+}
+
+
+void
+EditWindow::MessageReceived(BMessage* msg)
+{
+       switch (msg->what) {
+               case MSG_SELECTION:
+               {
+                       int32 ix = fTypePopUp->FindMarkedIndex();
+
+                       fCodeText->SetText(kDefaultTypes[ix].code);
+
+                       fEditView->RemoveSelf();
+
+                       fEditView = kDefaultTypes[ix].edit;
+                       fEditView->AttachTo(fEditViewBox);
+                       fEditView->Edit(fRow);
+
+                       break;
+               }
+               case MSG_CANCEL:
+                       PostMessage(B_QUIT_REQUESTED);
+                       break;
+
+               case MSG_ACCEPT:
+               {
+                       if (_Validate()) {
+                               int32 ix = fTypePopUp->FindMarkedIndex();
+
+                               fRow->SetResourceStringID(fIDText->Text());
+                               fRow->SetResourceName(fNameText->Text());
+                               fRow->SetResourceType(kDefaultTypes[ix].type);
+                               fRow->SetResourceStringCode(fCodeText->Text());
+                               fRow->SetResourceSize(kDefaultTypes[ix].size);
+
+                               fEditView->Commit();
+
+                               PostMessage(B_QUIT_REQUESTED);
+                       }
+
+                       break;
+               }
+       }
+}
+
+
+bool
+EditWindow::_Validate()
+{
+       // TODO: Implement validation of entered data.
+       fErrorString->SetText("");
+       return true;
+}
diff --git a/src/apps/resourceedit/EditWindow.h 
b/src/apps/resourceedit/EditWindow.h
new file mode 100644
index 0000000..d104af9
--- /dev/null
+++ b/src/apps/resourceedit/EditWindow.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012-2013 Tri-Edge AI <triedgeai@xxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT license.
+ */
+#ifndef EDIT_WINDOW_H
+#define EDIT_WINDOW_H
+
+
+#include <Window.h>
+
+
+class EditView;
+class ResourceRow;
+
+class BBox;
+class BButton;
+class BMenuField;
+class BPopUpMenu;
+class BStringView;
+class BTextControl;
+
+
+class EditWindow : public BWindow {
+public:
+                                       EditWindow(BRect frame, ResourceRow* 
row);
+                                       ~EditWindow();
+
+       void                    MessageReceived(BMessage* msg);
+
+private:
+       ResourceRow*    fRow;
+
+       BView*                  fView;
+
+       BTextControl*   fIDText;
+       BTextControl*   fNameText;
+       BPopUpMenu*             fTypePopUp;
+       BMenuField*             fTypeMenu;
+       BTextControl*   fCodeText;
+
+       EditView*               fEditView;
+       BBox*                   fEditViewBox;
+
+       BStringView*    fErrorString;
+
+       BButton*                fCancelButton;
+       BButton*                fOKButton;
+
+       bool                    _Validate();
+};
+
+
+#endif
diff --git a/src/apps/resourceedit/Jamfile b/src/apps/resourceedit/Jamfile
index 9507e9a..b392f77 100644
--- a/src/apps/resourceedit/Jamfile
+++ b/src/apps/resourceedit/Jamfile
@@ -2,14 +2,46 @@ SubDir HAIKU_TOP src apps resourceedit ;
 
 UsePrivateHeaders interface shared ;
 
+local sourceDirs =
+       edits
+       interface
+       settings
+       support
+;
+
+local sourceDir ;
+
+for sourceDir in $(sourceDirs) {
+       SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src apps resourceedit 
$(sourceDir) ] ;
+}
+
 Application ResourceEdit
        :
-               DefaultTypes.cpp
+               # edits
+               AppFlagsEdit.cpp
+               BooleanEdit.cpp
+               EditView.cpp
+               NormalEdit.cpp
+
+               # interface
                ImageButton.cpp
+
+               # settings
+               GenericSettingsView.cpp
+
+               # support
+               UndoContext.cpp
+
+               # .
+               DefaultTypes.cpp
+               EditWindow.cpp
                MainWindow.cpp
                ResourceEdit.cpp
                ResourceListView.cpp
                ResourceRow.cpp
+               SettingsFile.cpp
+               SettingsWindow.cpp
+
                main.cpp
        :
                be
@@ -17,7 +49,6 @@ Application ResourceEdit
                translation
                libcolumnlistview.a
                $(TARGET_LIBSTDC++)
-
        :
                ResourceEdit.rdef
 ;
diff --git a/src/apps/resourceedit/MainWindow.cpp 
b/src/apps/resourceedit/MainWindow.cpp
index d6413e3..1a04e8c 100644
--- a/src/apps/resourceedit/MainWindow.cpp
+++ b/src/apps/resourceedit/MainWindow.cpp
@@ -7,11 +7,17 @@
 #include "MainWindow.h"
 
 #include "Constants.h"
+#include "EditWindow.h"
 #include "ImageButton.h"
 #include "ResourceListView.h"
 #include "ResourceRow.h"
+#include "SettingsFile.h"
+#include "SettingsWindow.h"
+#include "UndoContext.h"
 
+#include <Alert.h>
 #include <Application.h>
+#include <Box.h>
 #include <ColumnListView.h>
 #include <ColumnTypes.h>
 #include <Entry.h>
@@ -23,8 +29,8 @@
 #include <Path.h>
 #include <PopUpMenu.h>
 #include <Resources.h>
-#include <StatusBar.h>
 #include <String.h>
+#include <StringView.h>
 #include <TextControl.h>
 #include <TranslationUtils.h>
 
@@ -39,13 +45,19 @@
 using namespace std;
 
 
-MainWindow::MainWindow(BRect frame, BEntry* assocEntry)
+MainWindow::MainWindow(BRect frame, BEntry* assocEntry, SettingsFile* settings)
        :
-       BWindow(frame, NULL, B_DOCUMENT_WINDOW, 0)
+       BWindow(frame, NULL, B_DOCUMENT_WINDOW, B_OUTLINE_RESIZE)
 {
        fAssocEntry = assocEntry;
+       fSettings = settings;
+
+       fUndoContext = new UndoContext();
+
+       AdaptSettings();
 
        fSavePanel = NULL;
+       fUnsavedChanges = false;
 
        fMenuBar = new BMenuBar(BRect(0, 0, 600, 1), "fMenuBar");
 
@@ -64,14 +76,24 @@ MainWindow::MainWindow(BRect frame, BEntry* assocEntry)
 
        fEditMenu = new BMenu("Edit", B_ITEMS_IN_COLUMN);
        fUndoItem = new BMenuItem("Undo", new BMessage(MSG_UNDO), 'Z');
+       fUndoItem->SetEnabled(false);
        fRedoItem = new BMenuItem("Redo", new BMessage(MSG_REDO), 'Y');
+       fRedoItem->SetEnabled(false);
        fCutItem = new BMenuItem("Cut", new BMessage(MSG_CUT), 'X');
+       fCutItem->SetEnabled(false);
        fCopyItem = new BMenuItem("Copy", new BMessage(MSG_COPY), 'C');
+       fCopyItem->SetEnabled(false);
        fPasteItem = new BMenuItem("Paste", new BMessage(MSG_PASTE), 'V');
+       fPasteItem->SetEnabled(false);
        fClearItem = new BMenuItem("Clear", new BMessage(MSG_CLEAR));
        fSelectAllItem = new BMenuItem("Select All",
                new BMessage(MSG_SELECTALL), 'A');
 
+       fToolsMenu = new BMenu("Tools", B_ITEMS_IN_COLUMN);
+       fAddAppResourcesItem = new BMenuItem("Add app resources",
+               new BMessage(MSG_ADDAPPRES));
+       fSettingsItem = new BMenuItem("Settings", new BMessage(MSG_SETTINGS));
+
        fHelpMenu = new BMenu("Help", B_ITEMS_IN_COLUMN);
 
        fResourceIDText = new BTextControl(BRect(0, 0, 47, 23).OffsetBySelf(8, 
24),
@@ -127,8 +149,8 @@ MainWindow::MainWindow(BRect frame, BEntry* assocEntry)
        fResourceList = new ResourceListView(listRect, "fResourceList",
                B_FOLLOW_ALL, 0);
 
-       fResourceList->AddColumn(new BIntegerColumn("ID", 48, 1, 999,
-               B_ALIGN_RIGHT), 0);
+       fResourceList->AddColumn(new BStringColumn("ID", 48, 1, 999,
+               B_ALIGN_LEFT), 0);
        fResourceList->AddColumn(new BStringColumn("Name", 156, 1, 999,
                B_TRUNCATE_END, B_ALIGN_LEFT), 1);
        fResourceList->AddColumn(new BStringColumn("Type", 56, 1, 999,
@@ -140,10 +162,17 @@ MainWindow::MainWindow(BRect frame, BEntry* assocEntry)
        fResourceList->AddColumn(new BSizeColumn("Size", 74, 1, 999,
                B_ALIGN_RIGHT), 5);
 
-       fResourceList->SetLatchWidth(0);
+       //fResourceList->SetLatchWidth(0);
 
        fResourceList->SetTarget(this);
        fResourceList->SetSelectionMessage(new BMessage(MSG_SELECTION));
+       fResourceList->SetInvocationMessage(new BMessage(MSG_INVOCATION));
+
+       fStatsString = new BStringView(BRect(3, 2, 150, 13), "fStatsString", 
"");
+       fStatsString->SetFontSize(11.0f);
+
+       fStatsBox = new BBox(BRect(0, 0, 150, 16), "fStatsBox");
+       fStatsBox->SetBorder(B_PLAIN_BORDER);
 
        AddChild(fMenuBar);
 
@@ -170,6 +199,11 @@ MainWindow::MainWindow(BRect frame, BEntry* assocEntry)
                fEditMenu->AddSeparatorItem();
                fEditMenu->AddItem(fSelectAllItem);
 
+       fMenuBar->AddItem(fToolsMenu);
+               fToolsMenu->AddItem(fAddAppResourcesItem);
+               fToolsMenu->AddSeparatorItem();
+               fToolsMenu->AddItem(fSettingsItem);
+
        fMenuBar->AddItem(fHelpMenu);
 
        fToolbarView->AddChild(fResourceIDText);
@@ -183,6 +217,8 @@ MainWindow::MainWindow(BRect frame, BEntry* assocEntry)
        AddChild(fToolbarView);
 
        AddChild(fResourceList);
+       fResourceList->AddStatusView(fStatsBox);
+       fStatsBox->AddChild(fStatsString);
 
        if (assocEntry != NULL) {
                _SetTitleFromEntry();
@@ -195,15 +231,57 @@ MainWindow::MainWindow(BRect frame, BEntry* assocEntry)
 

[ *** diff truncated: 2387 lines dropped *** ]


############################################################################

Revision:    hrev45326
Commit:      9590a81c9cd728292b2770b4a08aaeea1f589ed6
URL:         http://cgit.haiku-os.org/haiku/commit/?id=9590a81
Author:      Matt Madia <mattmadia@xxxxxxxxx>
Date:        Thu Feb 28 22:03:27 2013 UTC

Ticket:      https://dev.haiku-os.org/ticket/968

GCC 4 build fix. Suggested by leavengood.

Closes #968.

----------------------------------------------------------------------------


Other related posts:

  • » [haiku-commits] haiku: hrev45326 - src/apps/resourceedit data/artwork/icons src/apps/resourceedit/edits src/apps/resourceedit/support - mattmadia