00001 #ifndef _FL_OPDESK_H
00002 #define _FL_OPDESK_H
00003
00004
00005
00010
00011 #include <FL/Fl.H>
00012 #include <FL/Fl_Scroll.H>
00013 #include <FL/fl_draw.H>
00014
00015 #include <vector>
00016
00017 #include "Fl_OpBox.H"
00018 #include "Fl_OpConnect.H"
00019
00023 enum Fl_OpConnectStyle {
00024 FL_OPCONNECT_STYLE_STRAIGHT,
00025 FL_OPCONNECT_STYLE_TRACE,
00026 };
00027
00043 class Fl_OpDesk : public Fl_Scroll {
00044
00045 int opconnect_spacing;
00046 Fl_OpConnectStyle opconnect_style;
00047 int opconnect_width;
00048 Fl_Color opconnect_color;
00049 std::vector<Fl_OpConnect> connects;
00050 std::vector<Fl_OpBox*> boxes;
00051
00052
00053 std::vector<Fl_OpBox*> box_clipboard;
00054
00055
00056 char dragging;
00057 int dragging_x1, dragging_y1,
00058 dragging_x2, dragging_y2;
00059
00060 protected:
00061
00062
00063 void DrawLine(float x1, float y1, float x2, float y2) const;
00064 void DrawConnect(Fl_OpConnect *con) const;
00065
00066
00067 friend class Fl_OpButton;
00068 friend class Fl_OpBox;
00069 int _ConnectOnly(Fl_OpButton *srcbut, Fl_OpButton *dstbut, std::string &errmsg);
00070 int _DisconnectOnly(Fl_OpButton *a, Fl_OpButton *b);
00071 void CopyConnections(std::vector<Fl_OpBox*> origboxes, std::vector<Fl_OpBox*> copyboxes);
00072
00073
00074 void DraggingConnection(Fl_OpButton *b);
00075 void DraggingBoxes(int xdiff, int ydiff);
00076
00077 void _AddBox(Fl_OpBox *b);
00078 void _RemoveBox(Fl_OpBox *b);
00079
00080 public:
00081
00082 Fl_OpDesk(int X,int Y,int W,int H,const char *L=0);
00083 ~Fl_OpDesk();
00084
00085
00086 void draw();
00087 int handle(int e);
00088
00089
00090 void DeleteBox(Fl_OpBox *box);
00091 int GetOpBoxIndex(const Fl_OpBox*) const;
00092 int GetOpBoxTotal() const;
00093 Fl_OpBox* GetOpBox(int index);
00094 const Fl_OpBox* GetOpBox(int t) const;
00095
00096
00097 int DeselectAll();
00098 int SelectAll();
00099
00100
00101 virtual int DeleteSelected();
00102 virtual int CutSelected();
00103 virtual int CopySelected();
00104 virtual int PasteSelected();
00105
00106
00107 Fl_OpBox* FindBoxForFullName(const std::string& fullname, std::string &errmsg);
00108 Fl_OpButton* FindButtonForFullName(const std::string& fullname, std::string &errmsg);
00109 Fl_OpBox* FindBoxByLabel(std::string &lname, std::string &errmsg);
00110 Fl_OpButton* FindButtonUnderMouse();
00111
00112
00113 int GetOpConnectSpacing() const;
00114 void SetOpConnectSpacing(int val);
00115 int GetOpConnectWidth() const;
00116 void SetOpConnectWidth(int val);
00117 Fl_Color GetOpConnectColor() const;
00118 void SetOpConnectColor(Fl_Color val);
00119 int GetConnectionsTotal() const;
00120 Fl_OpConnect* GetConnection(int index);
00121 Fl_OpConnect* GetConnection(Fl_OpButton *srcbut, Fl_OpButton *dstbut);
00122 Fl_OpConnect* GetLastOpConnect();
00123 int Connect(Fl_OpButton *srcbut, Fl_OpButton *dstbut, std::string &errmsg);
00124 int Connect(Fl_OpBox *srcbox, const std::string& srcbut_lname,
00125 Fl_OpBox *dstbox, const std::string& dstbut_lname,
00126 std::string &errmsg);
00127 int Connect(const std::string& src_name,
00128 const std::string& dst_name,
00129 std::string& errmsg);
00130 int Disconnect(Fl_OpButton *a, Fl_OpButton *b);
00131 int Disconnect(Fl_OpBox *box);
00132 void DisconnectAll();
00133 void BringToFront(Fl_OpBox *box);
00134
00135
00136 void Clear();
00137 int ParseFullButtonName(const std::string &fullname,
00138 std::string &boxname,
00139 std::string &butname,
00140 std::string &errmsg);
00141
00142
00143
00163 virtual void ConnectionError(Fl_OpButton* , Fl_OpButton* , std::string &errmsg) {
00164 fprintf(stderr, "CONNECTION ERROR: %s\n", errmsg.c_str());
00165 }
00166 };
00167
00168 #endif