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 #include <cstdio>
00017
00018 #include "Fl_OpBox.H"
00019 #include "Fl_OpConnect.H"
00020
00024 enum Fl_OpConnectStyle {
00025 FL_OPCONNECT_STYLE_STRAIGHT,
00026 FL_OPCONNECT_STYLE_TRACE,
00027 FL_OPCONNECT_STYLE_CURVE,
00028 };
00029
00068 class Fl_OpDesk : public Fl_Scroll {
00069
00070 int opconnect_spacing;
00071 Fl_OpConnectStyle opconnect_style;
00072 int opconnect_width;
00073 Fl_Color opconnect_color;
00074 int opbox_selectedbordersize;
00075 std::vector<Fl_OpConnect> connects;
00076 std::vector<Fl_OpBox*> boxes;
00077
00078
00079 std::vector<Fl_OpBox*> box_clipboard;
00080
00081
00082 char dragging;
00083 int dragging_x1, dragging_y1,
00084 dragging_x2, dragging_y2;
00085
00086 protected:
00087
00088
00089 void DrawLine(float x1, float y1, float x2, float y2) const;
00090 void DrawConnect(Fl_OpConnect *con) const;
00091
00092
00093 friend class Fl_OpButton;
00094 friend class Fl_OpBox;
00095 int _ConnectOnly(Fl_OpButton *srcbut, Fl_OpButton *dstbut, std::string &errmsg);
00096 int _DisconnectOnly(Fl_OpButton *a, Fl_OpButton *b);
00097 void CopyConnections(std::vector<Fl_OpBox*> origboxes, std::vector<Fl_OpBox*> copyboxes);
00098
00099
00100 void DraggingConnection(Fl_OpButton *b);
00101 void DraggingBoxes(int xdiff, int ydiff);
00102
00103 void _AddBox(Fl_OpBox *b);
00104 void _RemoveBox(Fl_OpBox *b);
00105
00106 public:
00107
00108 Fl_OpDesk(int X,int Y,int W,int H,const char *L=0);
00109 ~Fl_OpDesk();
00110
00111
00112 void draw();
00113 int handle(int e);
00114
00115
00116 void DeleteBox(Fl_OpBox *box);
00117 int GetOpBoxIndex(const Fl_OpBox*) const;
00118 int GetOpBoxTotal() const;
00119 Fl_OpBox* GetOpBox(int index);
00120 const Fl_OpBox* GetOpBox(int t) const;
00121
00122
00123 int DeselectAll();
00124 int SelectAll();
00125
00126
00127 virtual int DeleteSelected();
00128 virtual int CutSelected();
00129 virtual int CopySelected();
00130 virtual int PasteSelected();
00131
00132
00133 Fl_OpBox* FindBoxForFullName(const std::string& fullname, std::string &errmsg);
00134 Fl_OpButton* FindButtonForFullName(const std::string& fullname, std::string &errmsg);
00135 Fl_OpBox* FindBoxByLabel(std::string &lname, std::string &errmsg);
00136 Fl_OpButton* FindButtonUnderMouse();
00137
00138
00139 int GetOpConnectSpacing() const;
00140 void SetOpConnectSpacing(int val);
00141 int GetOpConnectWidth() const;
00142 void SetOpConnectWidth(int val);
00143 Fl_Color GetOpConnectColor() const;
00144 void SetOpConnectColor(Fl_Color val);
00145 int GetConnectionsTotal() const;
00146 Fl_OpConnect* GetConnection(int index);
00147 Fl_OpConnect* GetConnection(Fl_OpButton *srcbut, Fl_OpButton *dstbut);
00148 Fl_OpConnect* GetLastOpConnect();
00149 int Connect(Fl_OpButton *srcbut, Fl_OpButton *dstbut, std::string &errmsg);
00150 int Connect(Fl_OpBox *srcbox, const std::string& srcbut_lname,
00151 Fl_OpBox *dstbox, const std::string& dstbut_lname,
00152 std::string &errmsg);
00153 int Connect(const std::string& src_name,
00154 const std::string& dst_name,
00155 std::string& errmsg);
00156 int Disconnect(Fl_OpButton *a, Fl_OpButton *b);
00157 int Disconnect(Fl_OpBox *box);
00158 void DisconnectAll();
00159 void BringToFront(Fl_OpBox *box);
00160
00161
00162 Fl_OpConnectStyle GetConnectStyle(void) const;
00163 void SetConnectStyle(Fl_OpConnectStyle val);
00164 int GetOpBoxSelectedBorderSize() const;
00165 void SetOpBoxSelectedBorderSize(int val);
00166
00167
00168 void Clear();
00169 int ParseFullButtonName(const std::string &fullname,
00170 std::string &boxname,
00171 std::string &butname,
00172 std::string &errmsg);
00173
00174
00175
00195 virtual void ConnectionError(Fl_OpButton* , Fl_OpButton* , std::string &errmsg) {
00196 fprintf(stderr, "CONNECTION ERROR: %s\n", errmsg.c_str());
00197 }
00198 };
00199
00200 #endif